第43节:通过串口用计数延时方式发送一串数据
时间:11-22
来源:互联网
点击:
- 数据的中间变量清零
- uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
- ucSendStep=1; //切换到下一步发送一串数据
- break;
- default://如果没有符合要求的消息,则不处理
- ucSendStep=0; //维持现状,不切换
- break;
- }
- }
- break;
- case 1://利用累加主循环次数的计数延时方式来发送一串数据
- /* 注释二:
- * 这里的计数延时为什么不用累计定时中断次数的延时,而用累计主循环次数的计数延时?
- * 因为本程序定时器中断一次需要500个指令时间,时间分辨率太低,不方便微调时间。因此我
- * 就用累计主循环次数的计数延时方式,在做项目的时候,各位读者应该根据系统的实际情况
- * 来调整const_send_time的大小。
- */
- uiSendTimeCnt++;//累计主循环次数的计数延时,为每个字节之间增加延时,
- if(uiSendTimeCnt>const_send_time)//请根据实际系统的情况,调整const_send_time的大小
- {
- uiSendTimeCnt=0;
- eusart_send(ucSendregBuf[uiSendCnt]);//发送一串数据给上位机
- uiSendCnt++;
- if(uiSendCnt>=9) //说明数据已经发送完毕
- {
- uiSendCnt=0;
- ucSendStep=0; //返回到上一步,处理其它未处理的消息
- }
- }
- break;
- }
- }
- void eusart_send(unsigned char ucSendData)
- {
- ES = 0; //关串口中断
- TI = 0; //清零串口发送完成中断请求标志
- SBUF =ucSendData; //发送一个字节
- /* 注释三:
- * 根据我个人的经验,在发送一串数据中,每个字节之间必须添加一个延时,用来等待串口发送完成。
- * 当然,也有一些朋友可能不增加延时,直接靠单片机自带的发送完成标志位来判断,但是我以前
- * 在做项目中,感觉单单靠发送完成标志位来判断还是容易出错(当然也有可能是我自身程序的问题),
- * 所以后来在大部分的项目中我就干脆靠延时来等待它发送完成。我在51,PIC单片机中都是这么做的。
- * 但是,凭我的经验,在stm32单片机中,可以不增加延时,直接靠单片机自带的标志位来判断就很可靠。
- */
- //delay_short(400);//因为外部在每个发送字节之间用了累计主循环次数的计数延时,因此不要此行的delay延时
- TI = 0; //清零串口发送完成中断请求标志
- ES = 1; //允许串口中断
- }
- void key_scan(void)//按键扫描函数 放在定时中断里
- {
- if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
- {
- ucKeyLock1=0; //按键自锁标志清零
- uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
- }
- else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
- {
- uiKeyTimeCnt1++; //累加定时中断次数
- if(uiKeyTimeCnt1>const_key_time1)
- {
- uiKeyTimeCnt1=0;
- ucKeyLock1=1;//自锁按键置位,避免一直触发
- ucKeySec=1; //触发1号键
- }
- }
- if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
- {
- ucKeyLock2=0; //按键自锁标志清零
- uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
- }
- else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
- {
- uiKeyTimeCnt2++; //累加定时中断次数
- if(uiKeyTimeCnt2>const_key_time2)
- {
- uiKeyTimeCnt2=0;
- ucKeyLock2=1;//自锁按键置位,避免一直触发
- ucKeySec=2; //触发2号键
- }
- }
- if(key_sr3==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
- {
- ucKeyLock3=0; //按键自锁标志清零
- uiKeyTimeCnt3=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
- }
- else if(ucKeyLock3==0)//有按键按下,且是第一次被按下
- {
- uiKeyTimeCnt3++; //累加定时中断次数
- if(uiKeyTimeCnt3>const_key_time3)
- {
- uiKeyTimeCnt3=0;
- ucKeyLock3=1;//自锁按键置位,避免一直触发
- ucKeySec=3; //触发3号键
- }
- }
- if(key_sr4==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
- {
- ucKeyLock4=0; //按键自锁标志清零
- uiKeyTimeCnt4=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
- }
- else if(ucKeyLock4==0)//有按键按下,且是第一次被按下
- {
- uiKeyTimeCnt4++; //累加定时中断次数
- if(uiKeyTimeCnt4>const_key_time4)
- {
- uiKeyTimeCnt4=0;
- ucKeyLock4=1;//自锁按键置位,避免一直触发
- ucKeySec=4; //触发4号键
- }
- }
- }
- void key_service(void) //第三区 按键服务的应用程序
- {
- switch(ucKeySec) //按键服务状态切换
- {
- case 1:// 1号键 对应朱兆祺学习板的S1键
串口计数延时一串数 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)