|
使用超声波型号SR04/SR05
主要代码如下:(非完整!!!)
#include <AT89X51.H>
#include <intrins.h>
#include <stdio.h>
void InitIRQ(void);
void Conut(void);
void delayms(unsigned int ms);
void StartModule();
#define uchar unsigned char
#define uint unsigned int
#define RX P1_1
#define TX P1_2
unsigned int time=0;
float Distance=0;//距离
bit flag =0; //中断溢出标志
/********************************************************/
void main()
{
InitIRQ();
while(1)
{
StartModule();
while(!RX); //当超声波模块接收口输出低电平则等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //读取定时器的值,计算
delayms(60);
}
}
/*********** 中断寄存器设置初始化 ***********/
void InitIRQ(void)
{
TMOD=0x21; //T/C工作方式寄存器 0010 0001
//T0 :GATE=0; 定时模式; 工作方式1,16位T/C; 计数器溢出中断,用于判定超出测距范围
//T1 :GATE=0; 定时模式; 工作方式2,8位可自动重载T/C; 用于串口通信 波特率发生器
SCON=0x50; //串行口控制寄存器 0101 0000
//SM0 SM1:工作方式1;10位异步收发;波特率由定时器T1控制
//SM2: 多机通信控制位,方式0和方式1为非多机通信,设置0
//REN: 串行口接收允许位,允许串行口接收数据
//TB8:方式0和方式1中该位不用
//RB8: 方式0和方式1中该位不用
//TI: 发送中断标志位。串行发送停止位时,由内部硬件置1,向CPU发中断申请,必须由软件清0
//RI: 接收中断标志位。串行接收停止位时,由内部硬件置1,向CPU发中断申请,必须由软件清0
TH0=0; //T0初始化,,用于判断测距溢出,最大65.536 ms
TL0=0;
TH1=0xFD; //T1初始化 设定波特率9600 (波特率计算参考文档)
TL1=0xFD;
ET0=1; //T0中断允许
TR0=1; //开启定时器0
TR1=1; //开启定时器1
//ES=1; //串口允许中断
/*
可删除,我的理解是:在系统正常运行情况下,串口发送完成则置位TI=1,
向CPU请求中断,在我们软件人为的直接设置TI=1的情况下可以直接向CPU
请求中断了,已经跳过了“允许”那一步
并且最好删除!
因为TI为中断标志位如果程序使用了串口中断,那么每次调用printf都
会进入中断,因此在使用printf前要禁用中断
*/
TI=1; /*
发送中断标志 ☆直接使用printf必须加此语句才能发送
在KEILC中,printf在传输数据前需要确保前一个数据传输
结束,也就是TI=1,否则将处于等待状态
因为printf函数会调用putchar函数,而putchar函数会判断TI,
不为1则等待(相当于死机),为1则清0,发送完成后又自动置1
因此第一次运行printf时检查TI=1则进行发送,发送完成后
发送中断标志位TI又自动置1
*/
EA=1; //开启总中断
}
|
评分
-
查看全部评分
|