main.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #include "drive_1602.h"
  2. #include "string.h"
  3. #include "stdio.h"
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. /*
  7. 采用5V USB电路供电
  8. 可以实现语音停止和开启风扇
  9. 实现语音调速风扇
  10. 调速等级高低各3级
  11. */
  12. sbit SW1=P3^7;
  13. sbit SW2=P3^6;
  14. sbit SW3=P3^5;
  15. sbit fun=P3^3;//风扇io
  16. uchar temp,humi;
  17. int JCount=0;
  18. void delay_xms(int xms)
  19. {
  20. char ix=0;
  21. for(;xms>0;xms--)
  22. for(ix=110;ix>0;ix--);
  23. }
  24. uchar SET=0;
  25. bit keyflag=0;
  26. bit openflag=0;//开启标志位
  27. uchar dw_val=3;//挡位值
  28. int pwm_cnt=0;
  29. #define pwm_max 1000
  30. int set_pwm=pwm_max;
  31. void KeyRead(void)
  32. {
  33. if(!SW1)
  34. {
  35. if(!SW1&&keyflag==0)
  36. {
  37. keyflag=1;
  38. openflag^=1;
  39. while(!SW1);
  40. }
  41. }
  42. else if(!SW2)
  43. {
  44. if(!SW2&&keyflag==0)
  45. {
  46. keyflag=1;
  47. if(++dw_val>3)dw_val=1;
  48. while(!SW2);
  49. }
  50. }
  51. else if(!SW3)
  52. {
  53. if(!SW3&&keyflag==0)
  54. {
  55. keyflag=1;
  56. if(dw_val>1)dw_val--;
  57. }
  58. }
  59. else
  60. {
  61. keyflag=0;
  62. }
  63. }
  64. void Timer0Init(void) //10毫秒@11.0592MHz
  65. {
  66. TMOD &= 0xF0; //设置定时器模式
  67. TMOD |= 0x01; //设置定时器模式
  68. TL0 = 0x00; //设置定时初值
  69. TH0 = 0xDC; //设置定时初值
  70. TF0 = 0; //清除TF0标志
  71. ET0=1;
  72. TR0 = 1; //定时器0开始计时
  73. EA=1;
  74. }
  75. uchar get_key=0;
  76. void TimeISR()interrupt 1
  77. {
  78. TL0 = 0x66; //设置定时初值
  79. TH0 = 0xFC; //设置定时初值 1ms
  80. if(++get_key>10)
  81. {
  82. get_key=0;
  83. KeyRead();
  84. }
  85. pwm_cnt++;
  86. if(pwm_cnt>=pwm_max)
  87. {
  88. pwm_cnt=0;
  89. }
  90. if(pwm_cnt>set_pwm)
  91. {
  92. fun=1;
  93. }
  94. else
  95. {
  96. fun=0;
  97. }
  98. JCount++;
  99. }
  100. void UartInit(void) //9600bps@11.0592MHz
  101. {
  102. PCON &= 0x7F; //波特率不倍速
  103. SCON = 0x50; //8位数据,可变波特率
  104. TMOD &= 0x0F; //清除定时器1模式位
  105. TMOD |= 0x20; //设定定时器1为8位自动重装方式
  106. TL1 = 0xFD; //设定定时初值
  107. TH1 = 0xFD; //设定定时器重装值
  108. ET1 = 0; //禁止定时器1中断
  109. TR1 = 1; //启动定时器1
  110. EA=1;
  111. ES=0;
  112. }
  113. void sendData(char *p,unsigned char n)
  114. {
  115. if( p == 0) return ;
  116. ES = 0;
  117. if(n > 0)
  118. {
  119. while(n --)
  120. {
  121. SBUF = *p++ ;
  122. while(!TI) ;
  123. TI = 0 ;
  124. }
  125. }
  126. // ES = 1;
  127. }
  128. // 往串口发送字符串
  129. void sendString(char *p)
  130. {
  131. if(p == 0) return ;
  132. sendData(p,strlen(p));
  133. }
  134. uchar rxdat=0;
  135. // 接收中断函数
  136. void usart() interrupt 4
  137. {
  138. if(RI == 1)
  139. {
  140. rxdat=SBUF;
  141. switch(rxdat)
  142. {
  143. case 0x5a:
  144. openflag^=1;
  145. break;
  146. case 0x65:
  147. if(++dw_val>3)dw_val=1;
  148. break;
  149. case 0x78:
  150. if(dw_val>1)dw_val--;
  151. break;
  152. }
  153. // setUsartRxData(SBUF);
  154. }
  155. RI = 0;
  156. TI = 0;
  157. }
  158. void main()
  159. {
  160. lcd1602_init();
  161. UartInit();
  162. delay_xms(200);
  163. Timer0Init();
  164. while(1)
  165. {
  166. if(JCount>500)//500ms采集一次
  167. {
  168. JCount=0;
  169. if(openflag)
  170. {
  171. L1602_printf(0,0,"FUN:ON");
  172. switch(dw_val)
  173. {
  174. case 1:
  175. set_pwm=300;
  176. break;
  177. case 2:
  178. set_pwm=700;
  179. break;
  180. case 3:
  181. set_pwm=pwm_max;
  182. break;
  183. }
  184. }else
  185. {
  186. L1602_printf(0,0,"FUN:OFF");
  187. }
  188. L1602_printf(0,1,"Gears:%d",dw_val);
  189. }
  190. }
  191. }