1、CT107D 测试程序3超声波测距定时器2捕获超声波测距外部中断捕获温度显示 DS18B20超声波测距定时器2捕获#include /包括一个52标准内核的头文件#define BYTE unsigned char #define uint unsigned int#define ulong unsigned longsbit LS138A=P25;sbit LS138B=P26;sbit LS138C=P27;BYTE code disp_duan10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/数码管0-9BYTE code dis
2、p_wei=0x01,0x02,0x04,0x08;BYTE ledout4,flag,i=0;bit succeed_flag; /测量成功标志ulong distance_data,sum;ulong distance_data_buff2;void sys_ini() LS138C=1;LS138B=0;LS138A=1;P0=0; /关蜂鸣器 T2=0; /首先拉低脉冲输入引脚 TMOD=0x01; /定时器0,16位工作方式 TR0=1; /启动定时器0 ET0=1; /打开定时器溢出0中断 ET2=1; /打开定时器2溢出中断 CP_RL2=1; /定时器2进行捕获模式 EXEN2
3、=1; /打开定时器2捕获中断 EA=1; /打开总中断 void main(void) / 主程序 sys_ini(); while(1) uint x=0; EA=0; T2=1; x+;x+;x+;x+;x+;x+;x+; /14us T2=0; /产生一个20us的脉冲,在Trig引脚 while(!T2EX); /等待T2EX回波引脚变高电平 succeed_flag=0; /清测量成功标志 EXEN2=1; /打开定时器2外部捕获中断 TH2=0; /定时器2清零 TL2=0; /定时器2清零 TF2=0; /溢出标志 TR2=1; /启动定时器2 EA=1; while(!TF2
4、);/溢出标志 等待测量的结果,周期65.535毫秒 TR2=0; /关闭定时器2 if(succeed_flag=1) distance_data=RCAP2H; /测量结果的高8位 distance_data=8; /放入16位的高8位 distance_data=distance_data|RCAP2L;/与低8位合并成为16位结果数据 distance_data=distance_data *1000/5813; distance_data_buffi=distance_data; sum+=distance_data_buffi; i+; if(i=2) i=0; distance_
5、data=sum/2; ledout0=(disp_duandistance_data%10000/1000)&0x7f; ledout1=disp_duandistance_data%1000/100; ledout2 =disp_duandistance_data%100/10; ledout3=disp_duandistance_data%10; sum=0; /*/定时器0中断,用做显示void timer0() interrupt 1 / 定时器0中断是1号 TH0=0xfd; /写入定时器0初始值 TL0=0x77; LS138C=1;LS138B=1;LS138A=1;P0=le
6、doutflag; LS138C=1;LS138B=1;LS138A=0;P0=disp_weiflag; flag+; if(flag=4) flag=0; /*/定时器1中断,用做超声波测距计时void timer2() interrupt 5 / 定时器0中断是1号 if(TF2) TH2=0; TL2=0; else if(EXF2) succeed_flag=1; /测量成功 EXEN2=0; /关闭 EXF2=0; 超声波测距外部中断捕获/*将P11与P32短接*/#include /包括一个52标准内核的头文件#define BYTE unsigned char #define
7、uint unsigned int#define ulong unsigned longsbit Trig = P10; /产生脉冲引脚sbit Echo = P32; /回波引脚sbit test = P06; /测试用引脚sbit HC138A=P25;sbit HC138B=P26;sbit HC138C=P27;BYTE code disp_duan10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/数码管0-9BYTE code disp_wei=0x01,0x02,0x04,0x08;BYTE temp,flag,outcom
8、eH,outcomeL; /自定义寄存器BYTE ledout4,flag,i=0;bit succeed_flag; /测量成功标志ulong distance_data,sum;ulong distance_data_buff3;uint temp_data;void sys_ini() HC138C=1;HC138B=0;HC138A=1;P0=0; /关蜂鸣器 flag=0; test =0; Trig=0; /首先拉低脉冲输入引脚 TMOD=0x11; /定时器0,定时器1,16位工作方式 TR0=1; /启动定时器0 IT0=0; /由高电平变低电平,触发外部中断 ET0=1; /
9、打开定时器0中断 ET1=1; /打开定时器1中断 EX0=0; /关闭外部中断 EA=1; /打开总中断0 void main(void) / 主程序 sys_ini(); while(1) /程序循环 uint x=0; EA=0; Trig=1; x+;x+;x+;x+;x+;x+;x+; /14us Trig=0; /产生一个20us的脉冲,在Trig引脚 while(!Echo); /等待Echo回波引脚变高电平 succeed_flag=0; /清测量成功标志 EX0=1; /打开外部中断 TH1=0; /定时器1清零 TL1=0; /定时器1清零 TF1=0; /溢出标志 TR1
10、=1; /启动定时器1 EA=1; while(!TF1);/溢出标志 等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; /关闭定时器1 EX0=0; /关闭外部中断 if(succeed_flag=1) distance_data=outcomeH; /测量结果的高8位 distance_data=8; /放入16位的高8位 distance_data=distance_data|outcomeL;/与低8位合并成为16位结果数据 distance_data=distance_data *1000/5813; distance_data_buffi=distance_dat
11、a; sum+=distance_data_buffi; i+; if(i=3) i=0; distance_data=sum/3; ledout0=(disp_duandistance_data%10000/1000)&0x7f; ledout1=disp_duandistance_data%1000/100; ledout2 =disp_duandistance_data%100/10; ledout3=disp_duandistance_data%10; sum=0; /*/外部中断0,用做判断回波电平void INTO_() interrupt 0 / 外部中断是0号 outcomeH
12、 =TH1; /取出定时器的值 outcomeL =TL1; /取出定时器的值 succeed_flag=1; /至成功测量的标志 EX0=0; /关闭外部中断 /*/定时器0中断,用做显示void timer0() interrupt 1 / 定时器0中断是1号 TH0=0xfd; /写入定时器0初始值 TL0=0x77; HC138C=1;HC138B=1;HC138A=1;P0=ledoutflag; HC138C=1;HC138B=1;HC138A=0;P0=disp_weiflag; flag+; if(flag=4) flag=0; /*/定时器1中断,用做超声波测距计时void timer1() interrupt 3 / 定时器0中断是1号 TH1=0; TL1=0;温度显示 DS18B20#include#include#define uchar unsigned char#define uint unsigned intsbit DQ=P14;uchar code smg_du=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uchar code smg_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1