久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2802|回復(fù): 2
收起左側(cè)

單片機定時控制繼電器帶顯示程序+Proteus仿真圖

[復(fù)制鏈接]
ID:705074 發(fā)表于 2021-12-29 00:05 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

電路圖

電路圖


單片機源程序如下:
  1. //main.c
  2. -----------------------------------
  3. /*******************************************************************************
  4. *                 
  5. *                     
  6. --------------------------------------------------------------------------------
  7. * 實 驗 名         : 動態(tài)數(shù)碼管顯示,定時器
  8. * 實驗說明       :
  9. * 連接方式       :
  10. * 注    意         :
  11. *******************************************************************************/

  12. #include"STC15F2K.h"
  13. #include"epprom.h"
  14. //--定義使用的IO口--//
  15. #define u8 unsigned char
  16. #define u16 unsigned int
  17. sbit you1=P2^0;
  18. sbit you2=P2^1;
  19. sbit you3=P2^2;
  20. sbit you4=P2^3;
  21. sbit you23=P2^4;
  22. sbit kai=P2^5;
  23. sbit fen=P2^6;
  24. sbit shi=P2^7;
  25. sbit jidianqi=P3^7;
  26. //--定義全局變量--//
  27. u8 code DIG_PLACE[8] = {
  28. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選控制   查表的方法控制
  29. u8 code DIG_CODE[18] = {
  30. 0x3f,0x06,0x5b,0x4f,0x66,
  31. 0x6d,0x7d,0x07,0x7f,0x6f,
  32. 0x77,0x7c,0x39,0x5e,0x79,
  33. 0x71,0x40,0x80};
  34. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、- 的顯示碼
  35. u8 X1,X2,X3,X4,X5;
  36. u8 DisplayData[8];
  37. u16 DJS=0,fen60,shi6;
  38. bit kk=0;     //開關(guān),1,倒計時進行,繼電器閉合;0,輸入時間,繼電器斷開
  39. u16 ff=10*60/*600秒*/,ss=60*60/*3600秒*/;  
  40. u16 count_djs=0;
  41. u16 countt=0;
  42. u8 KKKEY;
  43. //--聲明全局函數(shù)--//
  44. void DigDisplay(); //動態(tài)顯示函數(shù)
  45. void ConfigTimer0(u8 ms);
  46. void  key_sm();
  47. void anjian();

  48. /*******************************************************************************
  49. * 函 數(shù) 名         : XX,提供各個數(shù)碼管的數(shù)值

  50. *******************************************************************************/
  51. void  XX()
  52. {

  53.    countt=DJS-count_djs;
  54. if(kk==0) {

  55.         X1=shi6/10;
  56.         X2=shi6%10;
  57.         X3=fen60/10;
  58.         X4=fen60%10;
  59.         X5=17;
  60.         }
  61. if(kk==1)
  62.   {
  63.   if(countt<=3600)
  64.   {
  65.          X1=countt/600%10;
  66.         X2=countt/60%10;
  67.         X3=countt/10%6 ;
  68.         X4=countt%10/*kk */ ;
  69.         X5=17;
  70.    }
  71.    if(countt>3600)
  72.    {
  73.         X1=countt/36000%10;
  74.         X2=countt/3600%10    ;
  75.         X3=countt%3600/600%6;
  76.         X4=countt%3600/60%10;
  77.    }
  78.    if(X1==0)
  79.        { X1=16;
  80.           if(X2==0)
  81.           {X2=16;
  82.           if(X3==0)X3=16;
  83.           }}
  84. }
  85. }
  86. /*******************************************************************************
  87. * 函 數(shù) 名         : 掃描按鍵,賦值。

  88. *******************************************************************************/
  89. void  key_sm()
  90. {
  91. anjian();
  92. if(KKKEY==1) {KKKEY=0;fen60=fen60+10;if(fen60>=60)fen60=0;}
  93. if(KKKEY==2) {KKKEY=0;shi6=shi6+1;if(shi6>6)shi6=0;}
  94. if(KKKEY==3) {KKKEY=0;kk=~kk;;}

  95. ////寫入epprom
  96. if(KKKEY>0){
  97. shanchu(0x0000);
  98. xieru(0x0001,fen60)    ;
  99. xieru(0x0002,shi6)    ;  }
  100. DJS=(shi6*ss+fen60*60);  //單位是秒。

  101. }
  102. /*******************************************************************************
  103. * 函 數(shù) 名         : main
  104. * 函數(shù)功能           : 主函數(shù)
  105. * 輸    入         : 無
  106. * 輸    出         : 無
  107. *******************************************************************************/

  108. void main(void)
  109. {     
  110.     ConfigTimer0(5);
  111.     while(1)
  112.     {
  113.         key_sm();
  114.         
  115.            XX();
  116.         jidianqi=!kk;
  117.         DigDisplay();
  118.         if(countt<=0){kk=0;you23=0;     }
  119.     }               
  120. }

  121. /*******************************************************************************
  122. * 函 數(shù) 名         : DigDisplay
  123. * 函數(shù)功能           : 使用數(shù)碼管顯示
  124. * 輸    入         : 無
  125. * 輸    出         : 無
  126. *******************************************************************************/

  127. void DigDisplay()
  128. {
  129.     unsigned int j;
  130. //******************************
  131.     you1=0;
  132.     P1= DIG_CODE[X1];     //發(fā)送位選
  133.     j = 200;                         //掃描間隔時間設(shè)定
  134.     while(j--);   
  135.     P1 = 0x00;//消隱
  136.     you1=1;
  137. //******************************
  138.     you2=0;
  139.     P1= DIG_CODE[X2];     //發(fā)送位選
  140.     j = 200;                         //掃描間隔時間設(shè)定
  141.     while(j--);   
  142.     P1 = 0x00;//消隱
  143.     you2=2;
  144.     //******************************
  145.     you3=0;
  146.     P1= DIG_CODE[X3];     //發(fā)送位選
  147.     j = 200;                         //掃描間隔時間設(shè)定
  148.     while(j--);   
  149.     P1 = 0x00;//消隱
  150.     you3=3;
  151.     //******************************
  152.     you4=0;
  153.     P1 = DIG_CODE[X4];     //發(fā)送位選
  154.     j = 200;                         //掃描間隔時間設(shè)定
  155.     while(j--);   
  156.     P1 = 0x00;//消隱
  157.     you4=1;            
  158.             
  159.     }
  160. /* 配置并啟動T0,ms-T0定時時間 */
  161. void ConfigTimer0(u8 ms)
  162. {
  163.     unsigned long tmp;  //臨時變量
  164.    
  165.     tmp = 12000000 / 12;      //定時器計數(shù)頻率
  166.     tmp = (tmp * ms) / 1000;  //計算所需的計數(shù)值
  167.     tmp = 65536 - tmp;        //計算定時器重載值
  168.     TMOD &= 0xF0;   //清零T0的控制位
  169.     TH0 = (u8)(tmp>>8);  //定時器重載值拆分為高低字節(jié)
  170.     TL0 = (u8)tmp;
  171.     ET0 = 1;        //使能T0中斷
  172.     TR0 = 1;        //啟動T0
  173.     EA=1;
  174. }
  175. //中斷定義為5毫秒
  176. void InterruptTimer0() interrupt 1
  177. {   
  178.     static    u8 Di;
  179.          Di++;
  180.          if(kk==0){count_djs=0;you23=0;        }
  181.          if(Di==100) {you23=1;}      //秒顯示賦值 0.5秒
  182.          if(Di==200 &&kk==1 ) {{you23=0;count_djs=count_djs+1;; }}
  183.          WDT_CONTR=0x37;       //看門狗刷新  8.4S         
  184.                  
  185. }
  186. /**/                 
  187. //按鈕掃描     需在定時中斷中調(diào)用
  188. void anjian()
  189. {
  190.     static u16 JiShu =0;
  191.     static u16 JiShu1=0;
  192.     static u16 JiShu2=0;
  193.     static u8 keybuf  = 0xff;
  194.     static u8 keybuf1 = 0xff;
  195.     static u8 keybuf2 = 0xff;
  196.     u8 nm=500;

  197.     keybuf = (keybuf <<1) |fen;
  198.     if(keybuf == 0x00)
  199.     { JiShu++; if(JiShu>=nm) {JiShu=0;KKKEY=1;} }

  200.     keybuf1 = (keybuf1 <<1) |shi;
  201.     if(keybuf1 == 0x00)
  202.     { JiShu1++; if(JiShu1>=nm) {JiShu1=0;KKKEY=2;} }

  203.     keybuf2 = (keybuf2 <<1) |kai;
  204.     if(keybuf2 == 0x00)
  205.     { JiShu2++; if(JiShu2>=nm) {JiShu2=0;KKKEY=3;} }}

  206. // epprom.c
  207. #include "epprom.h"
  208. void Delay(uchar n)
  209. {
  210. uint x;
  211. while (n--)
  212. {
  213. x = 0;
  214. while (++x);
  215. }
  216. }
  217. void guanbi()        //iap閑置
  218. {                              
  219. IAP_CONTR = 0; //Close IAP function      \關(guān)閉IAP功能
  220. IAP_CMD = 0; //Clear command to standby    \清除待命命令
  221. IAP_TRIG = 0; //Clear trigger register    \清除觸發(fā)寄存器
  222. IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area \數(shù)據(jù)ptr指向非EEPROM區(qū)域
  223. IAP_ADDRL = 0; //Clear IAP address to prevent misuse \清除IAP地址以防止誤用
  224. }
  225. uchar duqu(uint addr)
  226. {
  227. uchar dat; //Data buffer     \數(shù)據(jù)緩沖區(qū)
  228. IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time \打開IAP功能,設(shè)置等待時間
  229. IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command \設(shè)置ISP/IAP/EEPROM讀取命令
  230. IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low \將ISP/IAP/EEPROM地址設(shè)置為低位
  231. IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high  \將ISP/IAP/EEPROM地址設(shè)置為高
  232. IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)     \發(fā)送觸發(fā)器命令1(0x5a)
  233. IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)      \發(fā)送觸發(fā)器命令2(0xa5)
  234. _nop_(); //MCU will hold here until ISP/IAP/EEPROM \MCU將在此保持,直到ISP/IAP/EEPROM
  235. //operation complete \操作完成
  236. dat = IAP_DATA; //Read ISP/IAP/EEPROM data \讀取ISP/IAP/EEPROM數(shù)據(jù)
  237. guanbi(); //Close ISP/IAP/EEPROM function \關(guān)閉ISP/IAP/EEPROM功能
  238. return dat; //Return Flash data    \返回閃存數(shù)據(jù)
  239. }
  240. void xieru(uint addr, uchar dat)
  241. {
  242. IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time \打開IAP功能,設(shè)置等待時間
  243. IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command    \設(shè)置ISP/IAP/EEPROM程序命令
  244. IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low \將ISP/IAP/EEPROM地址設(shè)置為低位
  245. IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high \將ISP/IAP/EEPROM地址設(shè)置為高
  246. IAP_DATA = dat; //Write ISP/IAP/EEPROM data     \寫入ISP/IAP/EEPROM數(shù)據(jù)
  247. IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)     \發(fā)送觸發(fā)器命令1(0x5a)
  248. IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)     \發(fā)送觸發(fā)器命令2(0xa5)
  249. _nop_(); //MCU will hold here until ISP/IAP/EEPROM \MCU將在此保持,直到ISP/IAP/EEPROM
  250. //operation complete  \操作完成
  251. guanbi();
  252. Delay(1);
  253. }
  254. void shanchu(uint addr)
  255. {
  256. IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time \打開IAP功能,設(shè)置等待時間
  257. IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command    \設(shè)置ISP/IAP/EEPROM擦除命令
  258. IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low \將ISP/IAP/EEPROM地址設(shè)置為低位
  259. IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high \將ISP/IAP/EEPROM地址設(shè)置為高
  260. IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)    \發(fā)送觸發(fā)器命令1(0x5a)
  261. IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)    \發(fā)送觸發(fā)器命令2(0xa5)
  262. _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete \MCU將在此保持,直到ISP/IAP/EEPROM操作完成
  263. //
  264. guanbi();
  265. }

  266. //epprom.h

  267. #ifndef __EPPROM1_H__
  268. #define __EPPROM1_H__
  269. //---包含頭文件---//
  270. #include "STC15F2K.h"
  271. #include "intrins.h"
  272. //typedef unsigned char BYTE;
  273. //typedef unsigned int WORD;
  274. //---重定義關(guān)鍵詞---//
  275. #ifndef uchar
  276. #define uchar unsigned char
  277. #endif

  278. #ifndef uint
  279. #define uint unsigned int
  280. #endif
  281. #endif
  282. #define CMD_IDLE 0 //Stand-By
  283. #define CMD_READ 1 //Byte-Read
  284. #define CMD_PROGRAM 2 //Byte-Program
  285. #define CMD_ERASE 3 //Sector-Erase
  286. #define ENABLE_IAP 0x82 //if SYSCLK<20MHz
  287. #define IAP_ADDRESS 0x0000
  288. void Delay(uchar n);
  289. void guanbi();
  290. uchar duqu(uint addr);
  291. void xieru(uint addr, uchar dat);
  292. void shanchu(uint addr);
復(fù)制代碼

Keil代碼與Proteus仿真下載:
定時器帶顯示20211206.7z (1.57 MB, 下載次數(shù): 40)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:477512 發(fā)表于 2021-12-29 17:32 | 顯示全部樓層
你這個電路沒有DS3231,電路一旦停電,時間歸零,還得從頭開始!
回復(fù)

使用道具 舉報

ID:705074 發(fā)表于 2021-12-29 23:51 | 顯示全部樓層
wbwcf13e 發(fā)表于 2021-12-29 17:32
你這個電路沒有DS3231,電路一旦停電,時間歸零,還得從頭開始!

這個電路是倒計時關(guān)閉電源插座,用時間中斷計時,不用DS3231.
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 丝袜 亚洲 欧美 日韩 综合 | 中文字幕91 | www.亚洲免费 | 亚洲国产精品成人久久久 | 欧美精品一区二区在线观看 | 亚洲一区三区在线观看 | 自拍视频网站 | 人人精品| a欧美| 日韩久久久久久 | 亚洲国产成人精品久久久国产成人一区 | 精品亚洲一区二区三区四区五区 | 91观看 | .国产精品成人自产拍在线观看6 | 一区二区三区国产好 | 亚洲一区成人 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 狠狠久 | 91精品国产91久久久久久密臀 | 国产精品久久久久久久久久久久 | 久久亚洲高清 | 国产在线精品一区二区 | 夜夜骑首页 | 亚洲精品三级 | 黄色一级视频 | 日韩欧美在线观看视频 | 91麻豆精品一区二区三区 | 成人影视网址 | 免费看av大片 | 日韩欧美三级在线 | 国产乱码精品一区二区三区忘忧草 | 国产精品成人在线播放 | 色婷婷亚洲国产女人的天堂 | 日韩毛片免费看 | 毛片av免费在线观看 | 国产精品久久久久久一区二区三区 | 色综合桃花网 | 欧美久久久久久久久中文字幕 | 久久久国产一区二区三区 | 亚洲精品免费视频 | 国产精品一区久久久 |