微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第43节:通过串口用计数延时方式发送一串数据

第43节:通过串口用计数延时方式发送一串数据

时间:11-22 来源:互联网 点击:

  1. insert_message(0x01);//把新消息插入到环形消息队列里等待处理
  2. ucVoiceLock=1;//原子锁加锁,保护中断与主函数的共享数据
  3. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  4. ucVoiceLock=0; //原子锁解锁
  5. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  6. break;
  7. case 2:// 2号键 对应朱兆祺学习板的S5键
  8. insert_message(0x02);//把新消息插入到环形消息队列里等待处理
  9. ucVoiceLock=1;//原子锁加锁,保护中断与主函数的共享数据
  10. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  11. ucVoiceLock=0; //原子锁解锁
  12. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  13. break;
  14. case 3:// 3号键 对应朱兆祺学习板的S9键
  15. insert_message(0x03);//把新消息插入到环形消息队列里等待处理
  16. ucVoiceLock=1;//原子锁加锁,保护中断与主函数的共享数据
  17. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  18. ucVoiceLock=0; //原子锁解锁
  19. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  20. break;
  21. case 4:// 4号键 对应朱兆祺学习板的S13键
  22. insert_message(0x04);//把新消息插入到环形消息队列里等待处理
  23. ucVoiceLock=1;//原子锁加锁,保护中断与主函数的共享数据
  24. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  25. ucVoiceLock=0; //原子锁解锁
  26. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  27. break;
  28. }
  29. }
  30. void T0_time(void) interrupt 1 //定时中断
  31. {
  32. TF0=0;//清除中断标志
  33. TR0=0; //关中断
  34. /* 注释四:
  35. * 此处多增加一个原子锁,作为中断与主函数共享数据的保护,实际上是借鉴了"红金龙吸味"关于原子锁的建议.
  36. */
  37. if(ucVoiceLock==0) //原子锁判断
  38. {
  39. if(uiVoiceCnt!=0)
  40. {
  41. uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
  42. beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  43. }
  44. else
  45. {
  46. ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
  47. beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  48. }
  49. }
  50. key_scan();//按键扫描函数
  51. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  52. TL0=0x0b;
  53. TR0=1;//开中断
  54. }
  55. void usart_receive(void) interrupt 4 //串口中断
  56. {
  57. if(RI==1)
  58. {
  59. RI = 0; //接收中断,及时把接收中断标志位清零
  60. }
  61. else
  62. {
  63. TI = 0; //发送中断,及时把发送中断标志位清零
  64. }
  65. }
  66. //void delay_short(unsigned int uiDelayShort)
  67. //{
  68. // unsigned int i;
  69. // for(i=0;i
  70. // {
  71. // ; //一个分号相当于执行一条空语句
  72. // }
  73. //}
  74. void delay_long(unsigned int uiDelayLong)
  75. {
  76. unsigned int i;
  77. unsigned int j;
  78. for(i=0;i
  79. {
  80. for(j=0;j<500;j++)//内嵌循环的空指令数量
  81. {
  82. ; //一个分号相当于执行一条空语句
  83. }
  84. }
  85. }
  86. void initial_myself(void)//第一区 初始化单片机
  87. {
  88. /* 注释五:
  89. * 矩阵键盘也可以做独立按键,前提是把某一根公共输出线输出低电平,
  90. * 模拟独立按键的触发地,本程序中,把key_gnd_dr输出低电平。
  91. * 朱兆祺51学习板的S1和S5两个按键就是本程序中用到的两个独立按键。
  92. */
  93. key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平
  94. led_dr=0; //关Led灯
  95. beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  96. //配置定时器
  97. TMOD=0x01;//设置定时器0为工作方式1
  98. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  99. TL0=0x0b;
  100. //配置串口
  101. SCON=0x50;
  102. TMOD=0X21;
  103. TH1=TL1=-(11059200L/12/32/9600);//串口波特率9600。
  104. TR1=1;
  105. }
  106. void initial_peripheral(void) //第二区 初始化外围
  107. {
  108. EA=1; //开总中断
  109. ES=1; //允许串口中断
  110. ET0=1; //允许定时中断
  111. TR0=1; //启动定时中断
  112. }


总结陈词:
前面几个章节中,每个章节要么独立地讲解串口收数据,要么独立地讲解发数据,实际上在大部分的项目中,串口都需要“一收一应答”的握手协议,上位机作为主机,单片机作为从机,主机先发一串数据,从机收到数据后进行校验判断,如果校验正确则返回正确应答指令,如果校验错误则返回错误应答指令,主机收到应答指令后,如果发现是正确应答指令则继续发送其它的新数据,如果发现是错误应答指令,或者超时没有接收到任何应答指令,则继续重发,如果连续重发三次都是错误应答或者无应答,主机就进行报错处理。读者只要把我的串口收发程序结合起来,就很容易实现这样的功能,我就不再详细讲解了。从下一节开始我讲解单片机掉电后数据保存的内容,欲知详情,请听下回分解-----利用AT24C02进行掉电后的数据保存。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top