单片机/MCU论坛
直播中

电子开发圈

5年用户 190经验值
擅长:DIY、Arduino、C51、STM32、FPGA
私信 关注
[文章]

基于单片机的定时电风扇设计(电路原理图+程序)

一,设计思路


开始通过手动键给单片机供电。直到电源指示灯LED4亮.单片机运行,继电器2工作给单片机供电。通过按键设置继电器2的工作时间,实现系统的自动断电,通过设置继电器1的工作时间,实现风扇的间歇转动,实现节能。

1.显示部分:

通过按键,在风扇转动时间,暂停时间,和系统关闭剩余时间切换显示。数码显示两位,为“分”走时,其中系统关闭剩余时间为“小时”走时,LED为红,黄,蓝,分别点亮对应的风扇转动,暂停,和系统关闭剩余时间的状态。

2.按键部分:

lK1为时间调整移位键,按下此键,数码闪烁,同时对应的灯闪烁。在风扇转动时间,暂停时间,和系统之间切换;
lK2为加一和状态切换显示键,当有K1按下,为时间加1。否则,在在风扇转动时间,暂停时间,和系统之间切换显示;
lK3为减1和备用键,当有K1按下,为时间加1,否则无效。

3.继电器部分:

l继电器1控制风扇的电源线,实现风扇的转动和暂时。
l继电器2控制单片机系统的电源,实现系统定时关闭。


二,原理图

351098_1_0.jpg



三,程序清单

  1. [size=4]/*********************************************
  2. 函数名称:声明区
  3. 功能描述:
  4. **********************************************/
  5. #include
  6. #defineucharunsignedchar
  7. #defineuintunsignedint
  8. #defineSEGP0//数码管段选.
  9. #defineDIGP2//数码管位选
  10. uchardis[2];//数码驱动组
  11. ucharcodeTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,//0-4共阳.
  12. 0x92,0x82,0xF8,0x80,0x90,0xff};//5-9,熄灭符
  13. ucharstart,stop,close,sum,time;//各其本变量
  14. ucharfliflag,cflag,***lag,x,y;//各标志位
  15. uintcount_T0,count_T1,c_count;//计数变量
  16. ***itK1=P3^7;//功能移位键
  17. ***itK2=P3^2;//加一键和切换移位键.
  18. ***itK3=P3^3;//减一.
  19. ***itRLED=P2^2;//红灯,表风扇转动状态.
  20. ***itYLED=P2^3;//黄灯,表风扇暂停状态
  21. ***itBLED=P2^4;//蓝灯,表系统状态
  22. ***itCLED=P2^6;//风扇控制位
  23. ***itZLED=P2^7;//系统工作控制位
  24. /*********************************************
  25. 函数名称:延时1MS函数
  26. 功能描述:显示调用.
  27. **********************************************/
  28. voiddelay1ms(ucharx)
  29. {
  30. uchari,j;
  31. for(i=0;iX;I++)
  32. for(j=0;j120;j++);
  33. }
  34. /*********************************************
  35. 函数名称:显示函数
  36. 功能描述:显示分走时,两位显示.
  37. **********************************************/
  38. voiddisplay(void)
  39. {
  40. uchari,scan=1;
  41. for(i=0;i2;i++)
  42. {SEG=0xff;
  43. DIG=~scan;
  44. SEG=TAB[dis[i]];
  45. delay1ms(5);
  46. scan=1;
  47. }
  48. }
  49. /*********************************************
  50. 函数名称:延时5MS函数
  51. 功能描述:按键消抖调用.
  52. **********************************************/
  53. voiddelay5ms(ucharx)
  54. {
  55. ucharj;
  56. for(j=0;jX;J++)
  57. display();
  58. }
  59. /*********************************************
  60. 函数名称:初始化函数
  61. 功能描述:各变量初始化.
  62. **********************************************/
  63. voidinit()
  64. {fliflag=0;//闪烁标志.
  65. cflag=1;//风扇状态标志.
  66. ***lag=0;//转动标志.
  67. x=30;//暂存
  68. y=10;//暂存
  69. CLED=1;//系统工作.
  70. sum=0;//移位
  71. start=30;//风扇转动时间
  72. stop=10;//暂停时间.
  73. close=5;//系统关闭剩余时间
  74. count_T0=0;//T0,T1相关
  75. count_T1=0;
  76. c_count=0;
  77. TMOD=0x11;
  78. TH0=(65536-50000)/256;
  79. TL0=(65536-50000)%256;
  80. TH1=(65536-50000)/256;
  81. TL1=(65536-50000)%256;
  82. EA=1;
  83. ET0=1;
  84. ET1=1;
  85. TR0=1;
  86. }
  87. /*********************************************
  88. 函数名称:分离函数
  89. 功能描述:分离显示十位,个位
  90. **********************************************/
  91. voiddisnner(void)
  92. {if(cflag==1)//1
  93. {RLED=0;YLED=1;BLED=1;//红灯闪烁.
  94. time=start;//显示转动时间.
  95. }
  96. if(cflag==2)
  97. {RLED=1;YLED=0;BLED=1;
  98. time=stop;
  99. }
  100. if(cflag==3)
  101. {RLED=1;YLED=1;BLED=0;
  102. time=close;
  103. }
  104. dis[0]=time/10;
  105. dis[1]=time%10;
  106. }
  107. /*********************************************
  108. 函数名称:T0中断函数
  109. 功能描述:产生1分钟.
  110. **********************************************/
  111. voidtimer0(void)interrupt1
  112. {TH0=(65536-50000)/256;
  113. TL0=(65536-50000)%256;
  114. if(++count_T0==1200)//一分钟.
  115. {count_T0=0;
  116. if(***lag==0)//为0
  117. {ZLED=1;//则转动.
  118. if(start!=99)//转动时间为99,显示99,不切换标志.一直转动.
  119. {
  120. start--;//不,则倒计时.
  121. if(start==0)
  122. {***lag=1;//倒时时间到.切换标志.
  123. cflag=2;
  124. start=x;//重赋值
  125. }
  126. }
  127. }
  128. else
  129. {ZLED=0;//否则暂停.
  130. stop--;//倒计时计数.
  131. if(stop==0)
  132. {cflag=1;//时间到.
  133. ***lag=0;
  134. stop=y;
  135. }
  136. }
  137. if(close!=99)//系统时间为99,显示99,系统一直工作..
  138. {if(++c_count==60)//对一分计数60,即一小时后.
  139. {c_count=0;
  140. close--;//做一小时倒计时.
  141. if(close==0)//时间到,系统断电.
  142. CLED=0;//低电平有效.
  143. }
  144. }
  145. }
  146. disnner();//分离.送显示/
  147. }
  148. /*********************************************
  149. 函数名称:T1中断服务函数
  150. 功能描述:调整时间闪烁用.
  151. **********************************************/
  152. voidtimer1(void)interrupt3
  153. {
  154. TH1=(65536-50000)/256;
  155. TL1=(65536-50000)%256;
  156. if(++count_T1==6)//闪烁周期30MS
  157. {
  158. count_T1=0;
  159. fliflag=~fliflag;//切换
  160. if(fliflag==0)//标志有效.
  161. {
  162. if(sum==1)cflag=1;//选用状态闪烁.
  163. if(sum==2)cflag=2;
  164. if(sum==3)cflag=3;
  165. disnner();//闪烁用.
  166. dis[0]=10;//放熄灭符.
  167. dis[1]=10;
  168. }
  169. else//否则,正常显示.
  170. {
  171. RLED=1;YLED=1;BLED=1;
  172. dis[0]=time/10;
  173. dis[1]=time%10;
  174. }
  175. }
  176. }
  177. /*********************************************
  178. 函数名称:键扫描函数
  179. 功能描述:调整时间
  180. **********************************************/
  181. voidscanner(void)
  182. {if(K1==0)//为0,表有键按下.
  183. {
  184. delay5ms(100);//延时500MS.
  185. if(K1==0)//还按下.刚退出.
  186. {
  187. while(K1==0)display();//等待释放.
  188. delay5ms(2);//消抖.
  189. cflag=1;//退出显示状态1.
  190. count_T0=0;
  191. TR0=1;//启动T0
  192. TR1=0;//关闪烁
  193. sum=0;//归位.
  194. x=start;//暂存.
  195. y=stop;//暂存.
  196. }
  197. else
  198. {//否则,有移位键按下.
  199. TR0=0;//时间走动停止.
  200. TR1=1;//开闪烁.
  201. sum++;//移位.
  202. if(sum==4)
  203. sum=1;
  204. }
  205. }
  206. if(K2==0)
  207. {
  208. delay5ms(2);
  209. if(K2==0)
  210. {
  211. while(K2==0)display();
  212. delay5ms(2);
  213. if(sum)//有移位
  214. {if(sum==1)
  215. {
  216. start++;
  217. if(start==61)
  218. start=99;
  219. if(start==100)
  220. start=30;
  221. }
  222. if(sum==2)
  223. {
  224. stop++;
  225. if(stop==61)
  226. stop=5;
  227. }
  228. if(sum==3)
  229. {
  230. close++;
  231. if(close==9)
  232. close=99;
  233. if(close==100)
  234. close=1;
  235. }
  236. }
  237. else//没移位.
  238. {
  239. cflag++;//则进行显示状态移位.
  240. if(cflag==4)
  241. cflag=1;
  242. }
  243. }
  244. }
  245. if(K3==0)
  246. {
  247. delay5ms(2);
  248. if(K3==0)
  249. {
  250. while(K3==0)display();
  251. delay5ms(2);
  252. if(sum==1)
  253. {start--;
  254. if(start==29)
  255. start=99;
  256. if(start==98)
  257. start=60;
  258. }
  259. if(sum==2)
  260. {stop--;
  261. if(stop==4)
  262. stop=60;
  263. }
  264. if(sum==3)
  265. {close--;
  266. if(close==0)
  267. close=99;
  268. if(close==98)
  269. close=8;
  270. }
  271. }
  272. }
  273. }
  274. /*********************************************
  275. 函数名称:主函数
  276. 功能描述:
  277. **********************************************/
  278. main()
  279. {
  280. init();
  281. while(1)
  282. {
  283. display();//显示
  284. scanner();//检测按键..
  285. }
  286. }[/size]



获取更多学习资料,扫码关注,海量云盘资源等你下载。








回帖(3)

王栋春

2018-12-5 22:21:19
感谢楼主的资料分享  
举报

lee_st

2018-12-6 00:30:35
非常的很不错
举报

lee_st

2018-12-6 00:30:54
加油了啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分