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

第44节:从机的串口收发综合程序框架

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

  1. char ucWd=1;//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
  2. unsigned intuiSetData1=0;//本程序中需要被设置的参数1
  3. unsigned intuiSetData2=0;//本程序中需要被设置的参数2
  4. unsigned intuiSetData3=0;//本程序中需要被设置的参数3
  5. unsigned intuiSetData4=0;//本程序中需要被设置的参数4
  6. unsigned char ucTemp1=0;//中间过渡变量
  7. unsigned char ucTemp2=0;//中间过渡变量
  8. unsigned char ucTemp3=0;//中间过渡变量
  9. unsigned char ucTemp4=0;//中间过渡变量
  10. //根据原理图得出的共阴数码管字模表
  11. code unsigned char dig_table[]=
  12. {
  13. 0x3f,//0 序号0
  14. 0x06,//1 序号1
  15. 0x5b,//2 序号2
  16. 0x4f,//3 序号3
  17. 0x66,//4 序号4
  18. 0x6d,//5 序号5
  19. 0x7d,//6 序号6
  20. 0x07,//7 序号7
  21. 0x7f,//8 序号8
  22. 0x6f,//9 序号9
  23. 0x00,//无 序号10
  24. 0x40,//- 序号11
  25. 0x73,//P 序号12
  26. };
  27. void main()
  28. {
  29. initial_myself();
  30. delay_long(100);
  31. initial_peripheral();
  32. while(1)
  33. {
  34. key_service(); //按键服务的应用程序
  35. usart_service();//串口服务程序
  36. display_service(); //显示的窗口菜单服务程序
  37. status_service();//状态显示的应用程序
  38. }
  39. }
  40. void status_service(void)//状态显示的应用程序
  41. {
  42. if(ucStatus!=0) //处于非待机的状态,Led闪烁
  43. {
  44. if(uiLedCnt
  45. {
  46. led_dr=1;//前半秒亮
  47. if(ucStatus==2)//处于发送数据出错的状态,则蜂鸣器间歇鸣叫报警
  48. {
  49. ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
  50. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  51. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  52. }
  53. }
  54. else if(uiLedCnt
  55. {
  56. led_dr=0; //前半秒灭
  57. }
  58. else
  59. {
  60. uiLedCnt=0; //延时计时器清零,让Led灯处于闪烁的反复循环中
  61. }
  62. }
  63. else//处于待机状态,Led一直亮
  64. {
  65. led_dr=1;
  66. }
  67. }
  68. void usart_service(void)//串口服务程序,在main函数里
  69. {
  70. unsigned int i;
  71. if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
  72. {
  73. ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
  74. //下面的代码进入数据协议解析和数据处理的阶段
  75. uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
  76. while(uiRcregTotal>=5&&uiRcMoveIndex<=(uiRcregTotal-5))
  77. {
  78. if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55)//数据头eb 00 55的判断
  79. {
  80. ucRcType=ucRcregBuf[uiRcMoveIndex+3]; //数据类型一个字节
  81. uiRcSize=ucRcregBuf[uiRcMoveIndex+4]; //数据长度两个字节
  82. uiRcSize=uiRcSize<8;
  83. uiRcSize=uiRcSize+ucRcregBuf[uiRcMoveIndex+5];
  84. ucRcCy=ucRcregBuf[uiRcMoveIndex+6+uiRcSize]; //记录最后一个字节的校验
  85. ucRcregBuf[uiRcMoveIndex+6+uiRcSize]=0;//清零最后一个字节的累加和变量
  86. for(i=0;i<(3+1+2+uiRcSize);i++) //计算校验累加和
  87. {
  88. ucRcregBuf[uiRcMoveIndex+6+uiRcSize]=ucRcregBuf[uiRcMoveIndex+6+uiRcSize]+ucRcregBuf[uiRcMoveIndex+i];
  89. }
  90. if(ucRcCy==ucRcregBuf[uiRcMoveIndex+6+uiRcSize])//如果校验正确,则进入以下数据处理
  91. {
  92. switch(ucRcType) //根据不同的数据类型来做不同的数据处理
  93. {
  94. case 0x01: //设置参数1
  95. ucStatus=1; //从设置参数1开始,表示当前处于正在发送数据的状态
  96. uiSetData1=ucRcregBuf[uiRcMoveIndex+6];//把两个字节合并成一个int类型的数据
  97. uiSetData1=uiSetData1<8;
  98. uiSetData1=uiSetData1+ucRcregBuf[uiRcMoveIndex+7];
  99. ucWd1Update=1; //窗口1更新显示
  100. break;
  101. case 0x02: //设置参数2
  102. uiSetData2=ucRcregBuf[uiRcMoveIndex+6];//把两个字节合并成一个int类型的数据
  103. uiSetData2=uiSetData2<8;
  104. uiSetData2=uiSetData2+ucRcregBuf[uiRcMoveIndex+7];
  105. ucWd2Update=1; //窗口2更新显示
  106. break;
  107. case 0x03: //设置参数3
  108. uiSetData3=ucRcregBuf[uiRcMoveIndex+6];//把两个字节合并

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

网站地图

Top