微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第45节:主机的串口收发综合程序框架

第45节:主机的串口收发综合程序框架

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

  1. 际上是借鉴了"红金龙吸味"关于原子锁的建议.
  2. */
  3. if(ucSendCntLock==0)//原子锁判断
  4. {
  5. ucSendCntLock=1; //加锁
  6. if(uiSendCnt
  7. {
  8. uiSendCnt++; //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来
  9. ucSendLock=1; //开自锁标志
  10. }
  11. ucSendCntLock=0; //解锁
  12. }
  13. if(ucVoiceLock==0) //原子锁判断
  14. {
  15. if(uiVoiceCnt!=0)
  16. {
  17. uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
  18. beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  19. }
  20. else
  21. {
  22. ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
  23. beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  24. }
  25. }
  26. if(ucStatus!=0) //处于非待机的状态,Led闪烁
  27. {
  28. if(ucLedLock==0)//原子锁判断
  29. {
  30. uiLedCnt++; //Led闪烁计时器不断累加
  31. }
  32. }
  33. if(ucStatus==1) //处于正在通讯的状态,
  34. {
  35. if(ucSendTimeOutLock==0)//原子锁判断
  36. {
  37. uiSendTimeOutCnt++; //超时计时器累加
  38. }
  39. }
  40. key_scan(); //按键扫描函数
  41. display_drive();//数码管字模的驱动函数
  42. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  43. TL0=0x0b;
  44. TR0=1;//开中断
  45. }
  46. void delay_short(unsigned int uiDelayShort)
  47. {
  48. unsigned int i;
  49. for(i=0;i
  50. {
  51. ; //一个分号相当于执行一条空语句
  52. }
  53. }
  54. void delay_long(unsigned int uiDelayLong)
  55. {
  56. unsigned int i;
  57. unsigned int j;
  58. for(i=0;i
  59. {
  60. for(j=0;j<500;j++)//内嵌循环的空指令数量
  61. {
  62. ; //一个分号相当于执行一条空语句
  63. }
  64. }
  65. }
  66. void initial_myself(void)//第一区 初始化单片机
  67. {
  68. /* 注释二:
  69. * 矩阵键盘也可以做独立按键,前提是把某一根公共输出线输出低电平,
  70. * 模拟独立按键的触发地,本程序中,把key_gnd_dr输出低电平。
  71. * 朱兆祺51学习板的S1就是本程序中用到的一个独立按键。
  72. */
  73. key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平
  74. led_dr=1;//点亮独立LED灯
  75. beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  76. hc595_drive(0x00,0x00);//关闭所有经过另外两个74HC595驱动的LED灯
  77. TMOD=0x01;//设置定时器0为工作方式1
  78. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  79. TL0=0x0b;
  80. //配置串口
  81. SCON=0x50;
  82. TMOD=0X21;
  83. /* 注释三:
  84. * 为了保证串口中断接收的数据不丢失,必须设置IP = 0x10,相当于把串口中断设置为最高优先级,
  85. * 这个时候,串口中断可以打断任何其他的中断服务函数实现嵌套,
  86. */
  87. IP =0x10;//把串口中断设置为最高优先级,必须的。
  88. TH1=TL1=-(11059200L/12/32/9600);//串口波特率为9600。
  89. TR1=1;
  90. }
  91. void initial_peripheral(void) //第二区 初始化外围
  92. {
  93. ucDigDot8=0; //小数点全部不显示
  94. ucDigDot7=0;
  95. ucDigDot6=0;
  96. ucDigDot5=0;
  97. ucDigDot4=0;
  98. ucDigDot3=0;
  99. ucDigDot2=0;
  100. ucDigDot1=0;
  101. EA=1; //开总中断
  102. ES=1; //允许串口中断
  103. ET0=1; //允许定时中断
  104. TR0=1; //启动定时中断
  105. }



总结陈词:

前面花了大量篇幅详细地讲解了串口收发数据的程序框架,从下一节开始我讲解单片机掉电后数据保存的内容,欲知详情,请听下回分解-----利用AT24C02进行掉电后的数据保存。

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

网站地图

Top