找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2722|回复: 0
打印 上一主题 下一主题
收起左侧

制作定时插座单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:162561 发表于 2017-12-28 17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /***
  2. **项目名称:制作定时插座
  3. **编写时间:2017.11.26
  4. **使用芯片:stc12c5608ad
  5. **时钟频率:使用外部时钟频率11.0592MHz
  6. **简要说明:可以定时关闭插座电源
  7. ***/
  8. #include <stc12c5630ad.h>
  9. typedef unsigned char uint8_t;
  10. typedef unsigned int uint16_t;
  11. code uint8_t TABLE_NUM[11] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
  12. #define DefaultTiming 60
  13. uint8_t  PowerON = 0;       //电源:0-关、1-开
  14. uint8_t  TimingON = 0;       //定时:0-关、1-开
  15. uint8_t  Show_Update_Flag = 0;   //更新数码管显示:0-不更新、1-需更新
  16. uint8_t  KeyScan_Update_Flag = 0; //更新按键值:0-没更新、1-有更新
  17. uint16_t  Timing = 0;        //定时时间
  18. uint8_t  KeyValue = 0;       //按键值
  19. uint8_t  ShowWei = 0;       //数码管显示位
  20. void Timer0_Config();
  21. void Timer1_Config();
  22. void TurnOnPower();
  23. void TurnOffPower();
  24. void TurnOnTiming();
  25. void TurnOffTiming();
  26. void BUZZER(uint8_t type);
  27. void Delay50ms();
  28. void Delay500ms();
  29. void main()
  30. {
  31. P1 = 0xff;
  32. P2 = 0xf0;
  33. P3 = 0;

  34. Timer0_Config();
  35. Timer1_Config();
  36. ET0 = 1;
  37. ET1 = 1;
  38. EA = 1;

  39. TurnOnPower();

  40. while(1)
  41. {
  42.   //按键处理
  43.   if(KeyScan_Update_Flag)
  44.   {
  45.    KeyScan_Update_Flag = 0;
  46.    
  47.    switch(KeyValue)
  48.    {
  49.     case 1:
  50.      BUZZER(0);     
  51.      if(PowerON) TurnOffPower();
  52.      else TurnOnPower();
  53.      break;
  54.     case 2:
  55.      if(Timing > 10 && TimingON) Timing -= 10;
  56.      break;
  57.     case 3:
  58.      if(TimingON) TurnOffTiming();
  59.      else if(PowerON) TurnOnTiming();
  60.      break;
  61.     case 4:
  62.      if(Timing <= 230 && TimingON) Timing += 10;
  63.      break;
  64.    }
  65.   }
  66.   
  67.   //数码管显示
  68.   if(Show_Update_Flag)
  69.   {
  70.    Show_Update_Flag = 0;
  71.    
  72.    P1 = 0xff;       //断码
  73.    P20 = P21 = P22 = 0;  //位码
  74.    
  75.    switch(ShowWei)
  76.    {
  77.     case 0:
  78.      if(TimingON) P1 = TABLE_NUM[(Timing / 100) % 10];
  79.      else P1 = TABLE_NUM[10];
  80.      P20 = 1;
  81.      break;
  82.     case 1:
  83.      if(TimingON) P1 = TABLE_NUM[(Timing / 10) % 10];
  84.      else P1 = TABLE_NUM[10];
  85.      P21 = 1;     
  86.      break;
  87.     case 2:
  88.      if(TimingON) P1 = TABLE_NUM[Timing % 10];
  89.      else P1 = TABLE_NUM[10];
  90.      P22 = 1;     
  91.      break;
  92.    }
  93.   }
  94. }
  95. }

  96. /***TIM0配置:为数码管显示和键盘扫描提供时间间隔5ms***/
  97. void Timer0_Config()
  98. {
  99. AUXR &= 0x7F;    //定时器时钟12T模式
  100. TMOD &= 0xF0;    //设置定时器模式
  101. TMOD |= 0x01;    //设置定时器模式
  102. TL0 = 0x00;     //设置定时初值
  103. TH0 = 0xEE;     //设置定时初值
  104. TF0 = 0;      //清除TF0标志
  105. TR0 = 1;      //定时器0开始计时
  106. }

  107. /***TIM1配置:提供定时基准,每次50ms***/
  108. void Timer1_Config()
  109. {
  110. AUXR &= 0xBF;    //定时器时钟12T模式
  111. TMOD &= 0x0F;    //设置定时器模式
  112. TMOD |= 0x10;    //设置定时器模式
  113. TL1 = 0x00;     //设置定时初值
  114. TH1 = 0x4C;     //设置定时初值
  115. TF1 = 0;      //清除TF1标志
  116. TR1 = 0;      //定时器1开始计时
  117. }

  118. /***按键和数码管的扫描***/
  119. void TIMER0() interrupt 1 using 1
  120. {
  121. static uint8_t _key_down = 0, _key_tempvalue = 0, _times = 0;

  122. TL0 = 0x00;
  123. TH0 = 0xEE;

  124. //按键扫描 20ms一次
  125. _times++;
  126. if(_times == 4)
  127. {
  128.   _times = 0;
  129.   if(!P24 || !P25 || !P26 || !P27)
  130.   {
  131.    if(_key_down)
  132.    {
  133.     if(!P24) _key_tempvalue = 1;
  134.     if(!P25) _key_tempvalue = 2;
  135.     if(!P26) _key_tempvalue = 3;
  136.     if(!P27) _key_tempvalue = 4;
  137.    }
  138.    else
  139.    {
  140.     _key_down = 1;
  141.    }
  142.   }
  143.   else
  144.   {
  145.    if(_key_down && _key_tempvalue) KeyValue = _key_tempvalue;
  146.    else KeyValue = 0;
  147.    
  148.    if(_key_down) KeyScan_Update_Flag = 1;
  149.    
  150.    _key_down = _key_tempvalue = 0;
  151.   }
  152. }


  153. //数码管扫描
  154. ShowWei = ++ShowWei > 2 ? 0 : ShowWei;
  155. Show_Update_Flag = 1;
  156. }

  157. /***定时基准***/
  158. void TIMER1() interrupt 3 using 1
  159. {
  160. static uint8_t _num = 0, _second_num = 0;

  161. TL1 = 0x00;
  162. TH1 = 0x4C;

  163. //1秒钟
  164. _num++;
  165. if(_num == 20)
  166. {
  167.   _second_num++;
  168.   _num = 0;
  169. }

  170. //1分钟
  171. if(_second_num == 60)
  172. {
  173.   Timing--;
  174.   _second_num = 0;
  175. }

  176. //定时时间到  关电关显示关定时
  177. if(Timing == 0)
  178. {
  179.   TurnOffPower();
  180.   BUZZER(1);
  181. }
  182. }

  183. /***开电源***/
  184. void TurnOnPower()
  185. {
  186. P23 = 0;
  187. PowerON = 1;
  188. }

  189. /***关电源***/
  190. void TurnOffPower()
  191. {
  192. P23 = 1;
  193. TurnOffTiming();
  194. PowerON = 0;
  195. }

  196. /***开定时***/
  197. void TurnOnTiming()
  198. {
  199. TR1 = 1;
  200. Timing = DefaultTiming;
  201. TimingON = 1;
  202. }

  203. /***关定时***/
  204. void TurnOffTiming()
  205. {
  206. TR1 = 0;
  207. TimingON = 0;
  208. }

  209. void Delay50ms()  [url=]//@11.0592MHz[/url]
  210. {
  211. unsigned char i, j, k;
  212. i = 3;
  213. j = 26;
  214. k = 223;
  215. do
  216. {
  217.   do
  218.   {
  219.    while (--k);
  220.   } while (--j);
  221. } while (--i);
  222. }

  223. void Delay500ms()  [url=]//@11.0592MHz[/url]
  224. {
  225. unsigned char i, j, k;
  226. i = 22;
  227. j = 3;
  228. k = 227;
  229. do
  230. {
  231.   do
  232.   {
  233.    while (--k);
  234.   } while (--j);
  235. } while (--i);
  236. }

  237. /***蜂鸣器***/
  238. void BUZZER(uint8_t type)
  239. {
  240. switch(type)
  241. {
  242.   case 0:
  243.    P34 = 1;
  244.    Delay50ms();
  245.    P34 = 0;
  246.    break;
  247.   case 1:
  248.    P1 = 0xff;
  249.    P34 = 1;
  250.    Delay500ms();
  251.    P34 = 0;
  252.    Delay500ms();
  253.    P34 = 1;
  254.    Delay500ms();
  255.    P34 = 0;
  256.    Delay500ms();
  257.    P34 = 1;
  258.    Delay500ms();
  259.    P34 = 0;
  260.    break;
  261. }
  262. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表