首页 > 编程知识 正文

生成脉冲定时器TP指令,定时器计数器的编程和应用

时间:2023-05-03 15:33:55 阅读:54488 作者:903

/*串行助手将01命令以十六进制形式发送到测试板,启动计时器2的捕获模式,然后单击“Captch On! ”,用10***6进制向实验板发送02指令,使P1.1产生负跳跃,第一次负跳跃时,串行助手为“Fisrt ***Drump! “020s 50272us“,第二次负跳时,显示“Second Drump”! 023s 22296us次负跳跃期间返回***的脉冲周期“Result is:002s 37560us”,以16进制向实验板发送02指令后,停止计时器2的捕捉****模式,返回“cap tccc 中选择所需的墙类型。

如果要发送其他命令,请单击“Error! 返回*//# includereg 52.htypedefunsignedcharuchar; //重命名,使typedef unsigned int uint更容易书写; 用户计数Val; //保存跳跃间的计数值uchar exT2flag、command、sec、tempflag; 比特总线; //串行发送完成标志sbit drump=P1^1; 声明P1^1外部引脚voidinit(void )//参数初始化voidsenddata(uchar ); //串行发送字符voidsendstring(uchar* ); //串行发送字符串voidsendnum(uchar ); //串行端口发送8位无符号整数值voidsendvalue(uint ); //串行端口为16位无符号整数值void init () {TMOD=0x20; //计时器1动作方式1TH1=0xfd; //计时器1作为串行端口波特率发生器,8位计数器、波特率9600、SMOD=0不会加倍,TL1=0xfd; //根据公式计算的初始值为253即0xfdth2=(65536-45872 )/256; //计时器2初始值、16位、1次溢出需要计数(2^16=65536 )个,这里延迟50ms,计数的时间为12机器周期的时间TL2=(65536-45872 ) 6 //即(12/11.0592约为1.09 ),延迟50ms为) 50000/1.09约为45872 )个T2CON=0x09; //EXEN2=1,CP/RL2=1; SM0=1; //串行动作方式1SM1=1; //同上TR1=1; //开始计时器1REN=1; //允许在串行端口上接收数据的EA=1; //打开总中断的ET2=1; //导通定时器2中断ES=1; //打开串行端口中断}void main () {uint s1,us1,s2,us2,s,us; //保存计数的时间init (; 发送字符串(hello manager! n '; //串行端口while(1) {drump=1; //负跳跃的准备if(ext2flag==1) /表示第一次发生负跳跃({s1=sec; //第一次发生负跳跃时,发生中断的次数(或时间) us1=countVal; //第一次发生负跳跃时,陷阱寄存器的值sendstring('fisrtdrump! ' ); sendnum(S1; 发送字符串(s ); 发送值(us1; 发送字符串((n ); ext 2标志=0; (if ) ext2flag==2) /是第二次负跳跃) {s2=sec; //同上us2=countVal; ext 2标志=0; 发送字符串(' secondd rump! ' ); sendnum(S2; 发送字符串(s ); sendvalue(us2; 发送字符串((n ) n ) ); ext 2标志=0; if(us2=us1 ) /比较发生2次负跳跃时的陷波寄存器的值({s=s2 - s1;//计算2次负跳跃期间发生的中断次数(或时间) us=us2 - us1; ) }如果第}else//次陷阱寄存器小于第一次,则必须向上中断租用1位(if ) s2=s1 ) s=0。 elses=s2 - s1 - 1; US=(65536-US1 )-)-(65536-us2 ); 使用us2-us1时为负,为了避免错误((sendstring ) ) resultis: )需要借用。 sendnum(s; 发送字符串(s ); 发送值(us; 发送字符串((n ) n ) ); }交换机(命令) case1:sendstring ) ' captchon! n '; TR2=1; //开始计时器2command=0; 布雷克; case 2: drump=0; //发生一次负跳跃command=0; 布雷克; case:sendstring(captchoff! n '; TR2=0; //关闭计时器2command=0; 布雷克; case 4: send string (错误! n '; command=0 break; }}voidT2_time(interrupt5) staticuinta,b; if(EXF2 ) /外部中断引起的负跳跃) {EXF2=0; countval=(RCAP2H|0x00 )8)|)|(RCAP2L|0x00 ); A; if(a2 ) a=1; if(a==1) exT2flag=1; if(a==2) exT2flag=2; RCAP2L=0x00; //陷阱寄存器清除RCAP2H=0x00; (if ) TF2 )//溢出中断) {TF2=0; B; if(b==20 )/20个50ms即1秒(b=0; sec; //秒累加}}voidser_Uart(interrupt4) uchartemp; if(ri )//接收中断标志位({RI=0; //获取用于清除接收中断标志位temp=SBUF的//串行缓冲寄存器的值if(temp==0x01 ) command=1的ELSEif(temp==0x02 ) command=2; ELSEif(temp==0x03 ) command=3; Else命令=4; (if ) ti ) /发送中断标志位) {TI=0; busy=0; //发送完成标志} }语音发送数据(用户数据) while ) busy; //等待上次数据发送完成的busy=1; SBUF=dat; //发送当前数据}语音发送字符串(uchar * str ) while (str ) send data (str ) ); }voidsendnum(uchardat ) send data (dat/10048 ); 发送数据(dat0/1048; 发送数据(dat 048; }语音发送值(uint value ) send数据(value/1000048 ); 发送数据(value 000/100048 ); 发送数据(value 0000/10048 ); senddata(value000000/1048; 发送数据(value 00000048; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。