main.c
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include "I2C.h"
  2. #include "Led.h"
  3. #define N     624
  4. int nInputCount;
  5. int nIn_Flag;
  6. int nTimeCount;
  7. int nWrite_Flag;
  8. unsigned char seg[]={0x3f,0x06,0x5b,0x4f, /* 0 1 2 3*/
  9.  0x66,0x6d,0x7d,0x07, /* 4 5 6 7 */
  10.  0x7f,0x6f,0x77,0x7c, /* 8 9 A B */
  11.  0x39,0x5e,0x79,0x71  /* C D E F */
  12. };
  13. void Init_TimerB(void);
  14. void main(void)
  15. {
  16. unsigned char nValue;
  17. char nTemp0;
  18. char nTemp1;
  19. char nTemp2;
  20. char nTemp3;
  21. char nTemp4;
  22. char nTemp5;
  23. int nSpeed;
  24. int nSpeed1;
  25. int nSpeed2;
  26. int nSpeed3;
  27. // 关闭看门狗
  28. WDTCTL = WDTPW + WDTHOLD;   
  29. //关闭中断
  30.     _DINT();
  31. //初始化时钟
  32. Init_CLK();
  33. //端口初始化
  34. Init_Port();
  35. I2C_Initial();
  36. nInputCount = 0;
  37. nIn_Flag = 0;
  38.     nTimeCount = 0;
  39. nWrite_Flag = 0;
  40. nTemp0 = 0;
  41. nTemp1 = 0;
  42. nTemp2 = 0;
  43. nTemp3 = 0;
  44. nTemp4 = 0;
  45. nTemp5 = 0;
  46. //打开中断
  47. _EINT(); 
  48.     
  49. //读出初始的里程数
  50.     ReadRandom(0,&nTemp0);
  51. if(nTemp0 ==  0xff) nTemp0 = 0;
  52. ReadRandom(1,&nTemp1);
  53. if(nTemp1 ==  0xff) nTemp1 = 0;
  54. ReadRandom(2,&nTemp2);
  55. if(nTemp2 ==  0xff) nTemp2 = 0;
  56. ReadRandom(3,&nTemp3);
  57. if(nTemp3 ==  0xff) nTemp3 = 0;
  58. ReadRandom(4,&nTemp4);
  59. if(nTemp4 ==  0xff) nTemp4 = 0;
  60. ReadRandom(5,&nTemp5);
  61. if(nTemp5 ==  0xff) nTemp5 = 0;
  62. //显示初始里程数据
  63. //清除锁存信号
  64. STCLK_Lo();
  65. DataOut(seg[nTemp5]);
  66. DataOut(seg[nTemp4]);
  67. DataOut(seg[nTemp3]);
  68. DataOut(seg[nTemp2]);
  69. DataOut(seg[nTemp1]);
  70. DataOut(seg[nTemp0]);
  71. //给锁存信号,显示上面的6位数据
  72. STCLK_Hi();
  73. for(;;)
  74. {
  75. if(nIn_Flag == 1)
  76. {
  77. nIn_Flag = 0;
  78. //等待时间计数器设置完
  79. while(1)
  80. {
  81. if(nWrite_Flag == 0)
  82. {
  83. break;
  84. }
  85. }
  86. //计算速度
  87. nSpeed = (int)(1 * 3600 / nTimeCount);
  88. nTimeCount = 0;
  89. nSpeed3 = (int)(nSpeed / 100);
  90. nSpeed2 = (int)((nSpeed - 100 * nSpeed3) / 10);
  91. nSpeed1 = nSpeed - 100 * nSpeed3 - 10 * nSpeed2;
  92. //显示速度
  93. //清除锁存信号
  94.         STCLK_Lo1();
  95.         DataOut1(seg[nSpeed3]);
  96.         DataOut1(seg[nSpeed2]);
  97.         DataOut1(seg[nSpeed1]);
  98.         //给锁存信号,显示上面的3位数据
  99.         STCLK_Hi1();
  100. //处理里程参数
  101. nTemp0 += 1;
  102. if(nTemp0 >= 10)
  103. {
  104. nTemp0 = 0;
  105. nTemp1 += 1;
  106. if(nTemp1 >= 10)
  107. {
  108. nTemp1 = 0;
  109. nTemp2 += 1;
  110. if(nTemp2 >= 10)
  111. {
  112. nTemp2 = 0;
  113. nTemp3 += 1;
  114. if(nTemp3 >= 10)
  115. {
  116. nTemp3 = 0;
  117. nTemp4 += 1;
  118. if(nTemp4 >= 10)
  119. {
  120. nTemp4 = 0;
  121. nTemp5 += 1;
  122. if(nTemp5 >= 10)
  123. {
  124. nTemp0 = 0;
  125. nTemp1 = 0;
  126. nTemp2 = 0;
  127. nTemp3 = 0;
  128. nTemp4 = 0;
  129. nTemp5 = 0;
  130. }//if(nTemp5 >= 10)
  131. }//if(nTemp4 >= 10)
  132. }//if(nTemp3 >= 10)
  133. }//if(nTemp2 >= 10)
  134. }//if(nTemp1 >= 10)
  135. }//if(nTemp0 >= 10)
  136. //显示里程数据
  137.             //清除锁存信号
  138.         STCLK_Lo();
  139.         DataOut(seg[nTemp5]);
  140.         DataOut(seg[nTemp4]);
  141.         DataOut(seg[nTemp3]);
  142.         DataOut(seg[nTemp2]);
  143.         DataOut(seg[nTemp1]);
  144.         DataOut(seg[nTemp0]);
  145.         //给锁存信号,显示上面的6位数据
  146.         STCLK_Hi();
  147. //将里程数据写入EEPROM
  148. WriteSingleByte(0,nTemp0);
  149. WriteSingleByte(1,nTemp1);
  150. WriteSingleByte(2,nTemp2);
  151. WriteSingleByte(3,nTemp3);
  152. WriteSingleByte(4,nTemp4);
  153. WriteSingleByte(5,nTemp5);
  154. }
  155. }
  156. return;
  157. }
  158. void Init_TimerB(void)
  159. {
  160. // 选择ACLK,清除TAR
  161.     TBCTL = TBSSEL0 + TBCLR;
  162. // TBCCR0 中断允许
  163.     TBCCTL0 = CCIE;         
  164. // 时间间隔为 1 s
  165.     TBCCR0 = 32768;   
  166.     // 增记数模式
  167.     TBCTL |= MC0; 
  168. return;
  169. }
  170. ///////////////////////////////////////
  171. // 处理来自端口 P2.0 的中断
  172. interrupt [PORT1_VECTOR] void INPUT_ISR(void)
  173. {
  174.     if(P2IFG & BIT0)
  175.     {
  176. //增加脉冲计数器
  177.      nInputCount += 1;
  178. if(nInputCount >= 8 * N)
  179. {
  180. //行使到一公里
  181. nInputCount = 0;
  182. //设置标志
  183.             nIn_Flag = 1;
  184. }
  185. // 清除中断标志位
  186.      P2IFG &= ~(BIT0);
  187.     }
  188. }
  189. //定时器B的中断处理
  190. interrupt [TIMERB0_VECTOR] void TimerB_ISR(void)
  191. {
  192. //设置写标志
  193. nWrite_Flag = 1;
  194. //秒记数器加1
  195. nTimeCount += 1;
  196. //解除写标志
  197. nWrite_Flag = 0;
  198. }