1.51单片机串口通信,定时器,中断
- 计时器编辑延时函数(单片机为12T的情况下)
- 每12个时钟得到一个计数脉冲,计数值加1
- 概念: 机器周期 :一个机器周期 = 12s*晶振频率的倒数。
- 时钟周期: 晶振频率的倒数 , 12个时钟周期为一个机器周期
16位计时器,65536是他的最大值,又因为加一次一为一个机器周期,所以计数器一次溢出的时间为65536*机器周期。11.52Mhz的晶振一次溢出大约为71MS。加65536次为71MS 。
- 每次溢出后都要重新给定时器赋初值,即赋值TH,TL。使用中断的话不用清零TF,硬件会自动清零。TR 是控制定时器的开关
2.拼接字符串API sprintf
- 头文件是 stdio.h
char buf[24] = {0};
float a = 1.1;
sprintf(buf,"a = %f ",a);
格式如上
3.超声波模块
有四个引脚: 1)——VCC 2)——TRIG 3)——ECHO 4)——GND
使用超声波模块时先给TRIG引脚一个10us的高电平,然后等待ECHO引脚变为高电平,此时启动定时器记录时间,当ECHO引脚变为低电平时关闭计时器,这个时候就得到了时间。就可以计算出距离。
#include "chaoshengbo.h"
int flag = 0; // 是否溢出标志
int time = 1000; // 1000MS
void initTime(){ // 定时器初始化 ,定时器1用作10us定时,定时器2用作超声波模块记录时间
TMOD |= 0X11; // 开启定时器0和1,工作模式为1
TH0 = 0;
TL0 = 0;
TF0 = 0;
TH1 = 0XDC;
TL1 = 0X00;
// 开启定时器中断 总中断
ET0 = 1;
ET1 = 1;
EA = 1;
}
void delay_20us(){
int i;
for(i=0;i<100;i++);
}
// 利用定时器1做的延时1s的延时函数
void delay_1s(){
TR1 = 1;
while(time!=0);
TR1 = 0;
time = 1000;
}
// 使用超声波模块 获取距离
float getDis(){
float time=0;
float dis=0;
Trig = 1;
delay_20us();
Trig = 0;
while(!Echo);
TR0 = 1;
while(Echo);
TR0 = 0;
if(flag !=1){ // 定时器0未溢出
time = (TH0<<8) | TL0 ; // 定时器0使用的是16位模式,将高低8位数据整合成时间 单位是微秒 us
dis =time*0.017; // 单位是cm 计算出距离
TH0 = 0; // 重新给定时器0赋初值 ,以待下一次计时
TL0 = 0;
return dis;
}else { // 定时器0溢出,也就是说超出了测距范围
flag = 0;
TH0 = 0;
TL0 = 0;
return -1;
}
}
void time0Interrupt() interrupt 1{
flag = 1;
}
void time1Interrupe() interrupt 3{
TH1 = 0XDC;
TL1 = 0X00;
time -= 10;
}