台灯

来源:互联网 发布:易语言写安卓软件 编辑:程序博客网 时间:2024/06/09 15:00

最近学校举办一个电子竞赛,在之前遥控插座作品基础上,蓝牙台灯很快就完成了。当然,每次做东西都会有收获。把这次的体会作为我的第一篇博客。

用89C52作为控制芯片,这比51多一个定时器T2,我可以把它作为台灯定时关断的一个功能。定时器T0中断产生PWM用来调节光的亮度。定时器T1用来实现串口通信,和蓝牙通信。制作一个小台灯也要注意很多细节:

1 涉及到串口通信就要注意波特率,所以晶振选11.0592M不会产生误差。如果已经用了12M的晶振,就要修改蓝牙模块的波特率改为2400。我觉得波特率小了以后12M晶振的误差会也会减少,才适应。2 PWM的周期要小,否则会出现闪频。要小到闪频人眼感觉不出来即可,但是也不能太小了,因为太小就会每次中断都只是产生PWM,而不能进入串口中断。3 串口接发数据是字符,而不是数字。字符转换为对应数字我们也要涉及。主要用来延迟1-60分钟的关断。

下面是程序:

[objc] view plain copy
  1. #include <reg52.h>  
  2. #include <stdio.h>  
  3. #define uchar unsigned char  
  4. #define uint unsigned int  
  5. sbit PWM=P3^6;  
  6. uchar buf[5] = {0};//数据接收  
  7. uint time = 0;//时间  
  8. uint i = 0;  
  9. uint j = 0;  
  10. uchar data_count=0;//数据长度  
  11. uchar flished_flag; //数据接收完整标志  
  12. uchar timer1;  
  13. uchar num = 0;  
  14. uint num1,sec1,min1,Time2;  
  15.   
  16.   
  17. sbit led1 =P0^0;         //所有的led只是作为串口接收数据的指示灯 可以不必理会  
  18. sbit led2 =P0^1;  
  19. sbit led3 =P0^2;           
  20. sbit led4 =P0^3;   
  21. sbit led5 =P0^4;           
  22. sbit led6 =P0^5;     
  23. sbit led7 =P0^6;           
  24.       
  25. void Time2_Init()  
  26. {  
  27.   
  28.   
  29. //设置工作方式控制字    
  30. T2CON=0x00;/*设置T2CON为0000 0100,定时器2,内部定时器,16位自动重装*/    
  31. //计数初值的计算并并装入    
  32. /*由[12/(11.0592*10^6)]*x=50ms=50*10^3μs,得到x=46080*/    
  33. TH2=(65536-46080)/256;/*求(65536-46080)构成的16为二进制数的高8位,H代表高/high,0代表定时器0*/      
  34. TL2=(65536-46080)%256;/*求(65536-46080)构成的16为二进制数的低8位,L代表低/low,0代表定时器0*/    
  35. //中断允许位ETx,EA的设置    
  36. ET2=1;    
  37. EA=1;    
  38. //启停位TRx的设置     
  39. TR2=0;  
  40. }  
  41. void UART_init()   //串口初始化  
  42. {  
  43. TMOD = 0x21;  //T1工作模式2  8位自动重装  
  44. TH1 = 0xfd;  
  45. TL1 = 0xfd; //比特率9600  
  46. TL0 = 0xD2//设置定时初值  
  47. TH0 = 0xFF; //设置定时初值  
  48. EA  = 1;  
  49. ET0=1;  
  50. TR1 = 1//启动T1定时器  
  51. TR0 = 1;  
  52. SM0 = 0;  
  53. SM1 = 1//串口工作方式1 10位异步  
  54. REN = 1//串口允许接收  
  55. //开总中断  
  56. ES  = 1;  
  57. SCON |=0x50//串口中断打开  
  58.   
  59.   
  60. }  
  61. void UART_receive(void) interrupt 4  
  62. {    
  63.     uchar temp;  
  64.   if(RI==1)   
  65.     {  
  66.         RI=0;  
  67.         temp=SBUF;  
  68.         if(temp!='o'//判断是否接收到结束符  
  69.         {  
  70.             buf[data_count]=temp;// 否,就存到Buf数组中  
  71.             data_count++;  
  72.         }  
  73.         else  
  74.         {  
  75.             flished_flag = 1;  
  76. data_count = 0;  
  77.         }  
  78.           
  79.     }  
  80.       
  81. }    
  82.               
  83. void main(void)  
  84. {  
  85.    UART_init();  //串口初始化  
  86.    Time2_Init();  
  87.      
  88. P0=0x00;  
  89.    while(1)  
  90.     {  
  91.         if(1==flished_flag)  
  92.         {    
  93.             flished_flag=0;//清楚标志  
  94.            //实现的功能  
  95.   
  96. switch(buf[0])  
  97. {  
  98. case 'a':  
  99. num=0;led1=1;  
  100. break;  
  101. case 'b':  
  102. num=25;led2=1;  
  103. break;  
  104. case 'c':  
  105. led3 = 1;  
  106. num=75;  
  107. break;  
  108. case  'd':  
  109. num=99;led4=1;  
  110. break;  
  111. case  'e':  
  112. led5=1;  
  113. i=(int)buf[1]-48;  
  114. j=(int)buf[2]-48;  
  115. Time2= i*10+j;  
  116. TR2=1;  
  117. break;  
  118. }  
  119.         }  
  120.     }  
  121. }  
  122.   
  123.   
  124.   
  125.   
  126.   
  127.   
  128. void T0_time()interrupt 1  
  129. {  
  130. TL0 = 0xD2//设置定时初值  
  131. TH0 = 0xFF; //设置定时初值  
  132. timer1++;  
  133. if(timer1==101)  
  134. timer1=0;  
  135. if(timer1<num)  
  136. {  
  137. if(num<30)  
  138. led5=1;  
  139. if(num<60)  
  140. led6=1;  
  141. PWM=1;  
  142. }  
  143. else  
  144.   PWM=0;  
  145.   
  146.   
  147.   
  148.   
  149.   
  150.   
  151. }  
  152.   
  153.   
  154. void T2_time() interrupt 5  
  155. {  
  156. TF2=0;  
  157. num1++;  
  158. if(num1==20)  
  159. {  
  160. num1=0;  
  161. sec1++;  
  162. led6=!led6;  
  163. if(sec1==60)  
  164. {  
  165. sec1=0;  
  166. min1++;  
  167. if(min1==Time2)  
  168. {  
  169. min1=0;  
  170. num=0;  
  171. led5=0;  
  172. TR2=0;  
  173. }  
  174. }  
  175. }  
  176. }  


APP是我同学负责,我也没有。可以下载一个蓝牙串口调试工具。

0 0
原创粉丝点击