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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

Proteus仿真單片機(jī)繼電器家電控制程序

[復(fù)制鏈接]
ID:399416 發(fā)表于 2020-6-5 13:20 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

單片機(jī)源程序如下:
  1. #include  "reg52.h"
  2. #include "lcd1602.h"
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //繼電器控制io
  7. sbit j1= P3^0;
  8. sbit j2= P3^1;      
  9. sbit j3= P3^2;      
  10. //---ds1302  IO---//
  11. sbit DSIO=P3^5;
  12. sbit RST=P3^3;
  13. sbit SCLK=P3^4;
  14. //---DS1302寫入和讀取時(shí)分秒的地址命令---//
  15. //---秒分時(shí)日月周年 最低位讀寫位;-------//
  16. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  17. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
  18. //---DS1302時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒。---//
  19. //---存儲(chǔ)順序是秒分時(shí)日月周年,存儲(chǔ)格式是用BCD碼---//
  20. uchar TIME[7] = {0x49, 0x49, 0x05, 0x01, 0x01, 0x02, 0x13};

  21. unsigned table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  22. unsigned char number=0;
  23. /********************************************************************
  24.                             延時(shí)函數(shù)
  25. *********************************************************************/
  26. void delay10ms(void) //延時(shí)程序
  27. {
  28.         unsigned char i,j;
  29.         for(i=20;i>0;i--)
  30.         for(j=248;j>0;j--);
  31. }
  32. /*******************************************************************************
  33. * 函 數(shù) 名         : Ds1302Write
  34. * 函數(shù)功能                   : 向DS1302命令(地址+數(shù)據(jù))
  35. * 輸    入         : addr,dat
  36. * 輸    出         : 無
  37. *******************************************************************************/
  38. void Ds1302Write(uchar addr, uchar dat)
  39. {
  40.         uchar n;
  41.         RST = 0;
  42.         _nop_();

  43.         SCLK = 0;//先將SCLK置低電平。
  44.         _nop_();
  45.         RST = 1; //然后將RST(CE)置高電平。
  46.         _nop_();

  47.         for (n=0; n<8; n++)//開始傳送八位地址命令
  48.         {
  49.                 DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
  50.                 addr >>= 1;
  51.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  52.                 _nop_();
  53.                 SCLK = 0;
  54.                 _nop_();
  55.         }
  56.         for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
  57.         {
  58.                 DSIO = dat & 0x01;
  59.                 dat >>= 1;
  60.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  61.                 _nop_();
  62.                 SCLK = 0;
  63.                 _nop_();      
  64.         }      
  65.                  
  66.         RST = 0;//傳送數(shù)據(jù)結(jié)束
  67.         _nop_();
  68. }

  69. /*******************************************************************************
  70. * 函 數(shù) 名         : Ds1302Read
  71. * 函數(shù)功能                   : 讀取一個(gè)地址的數(shù)據(jù)
  72. * 輸    入         : addr
  73. * 輸    出         : dat
  74. *******************************************************************************/

  75. uchar Ds1302Read(uchar addr)
  76. {
  77.         uchar n,dat,dat1;
  78.         RST = 0;
  79.         _nop_();

  80.         SCLK = 0;//先將SCLK置低電平。
  81.         _nop_();
  82.         RST = 1;//然后將RST(CE)置高電平。
  83.         _nop_();

  84.         for(n=0; n<8; n++)//開始傳送八位地址命令
  85.         {
  86.                 DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
  87.                 addr >>= 1;
  88.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  89.                 _nop_();
  90.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  91.                 _nop_();
  92.         }
  93.         _nop_();
  94.         for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
  95.         {
  96.                 dat1 = DSIO;//從最低位開始接收
  97.                 dat = (dat>>1) | (dat1<<7);
  98.                 SCLK = 1;
  99.                 _nop_();
  100.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  101.                 _nop_();
  102.         }

  103.         RST = 0;
  104.         _nop_();        //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
  105.         SCLK = 1;
  106.         _nop_();
  107.         DSIO = 0;
  108.         _nop_();
  109.         DSIO = 1;
  110.         _nop_();
  111.         return dat;      
  112. }

  113. /*******************************************************************************
  114. * 函 數(shù) 名         : Ds1302Init
  115. * 函數(shù)功能                   : 初始化DS1302.
  116. * 輸    入         : 無
  117. * 輸    出         : 無
  118. *******************************************************************************/

  119. void Ds1302Init()
  120. {
  121.         uchar n;
  122.         Ds1302Write(0x8E,0X00);                 //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能
  123.         for (n=0; n<7; n++)//寫入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  124.         {
  125.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);      
  126.         }
  127.         Ds1302Write(0x8E,0x80);                 //打開寫保護(hù)功能
  128. }

  129. /*******************************************************************************
  130. * 函 數(shù) 名         : Ds1302ReadTime
  131. * 函數(shù)功能                   : 讀取時(shí)鐘信息
  132. * 輸    入         : 無
  133. * 輸    出         : 無
  134. *******************************************************************************/
  135. void Ds1302ReadTime()
  136. {
  137.         uchar n;
  138.         for (n=0; n<7; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  139.         {
  140.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  141.         }               
  142. }
  143. /********************************************************************
  144.                             鍵盤函數(shù)
  145. *********************************************************************/  
  146. uchar k=0;
  147. uchar mode=2;
  148. uchar time1;

  149. void Getch (void)        //取鍵值函數(shù)
  150. {
  151. unsigned char X,Y,Z;
  152. P1=0x0f; //先對(duì)P3 置數(shù) 行掃描
  153. if(P1!=0x0f) //判斷是否有鍵按下
  154.         {
  155.         delay10ms(); //延時(shí),軟件去干擾
  156.         if(P1!=0x0f) //確認(rèn)按鍵按下
  157.                 {
  158.                 X=P1; //保存行掃描時(shí)有鍵按下時(shí)狀態(tài)
  159.                 P1=0xf0; //列掃描
  160.                 Y=P1;    //保存列掃描時(shí)有鍵按下時(shí)狀態(tài)
  161.                 Z=X|Y; //取出鍵值
  162. /*********************************************************************/
  163. switch ( Z ) //判斷鍵值(那一個(gè)鍵按下)
  164.                         {
  165.                                 case 0xee: k=0; break; //對(duì)鍵值賦值
  166.                                 case 0xed: k=1; break;
  167.                                 case 0xeb: k=2; break;
  168.                                 case 0xe7: k=3; break;
  169.                                 case 0xde: k=4; break;
  170.                                 case 0xdd: k=5; break;
  171.                                 case 0xdb: k=6; break;
  172.                                 case 0xd7: k=7; break;
  173.                                 case 0xbe: k=8; break;
  174.                                 case 0xbd: k=9; break;
  175.                                 case 0xbb: k=10;break;
  176.                                 case 0xb7: k=11;break;
  177.                                 case 0x7e: k=12;break;
  178.                                 case 0x7d: k=13;break;
  179.                                 case 0x7b: k=14;break;
  180.                                 case 0x77: k=15;break;
  181.                         }
  182.                         while(P1!=0xf0);  //等待按鍵放開
  183.                  }         
  184.          }
  185. }

  186. uchar j1_time[2]={0x05,0x50};
  187. uchar j2_time_on[2]={0x05,0x51};
  188. uchar j2_time_off[2]={0x05,0x52};
  189. uchar j3_time[2]={0x05,0x52};
  190. void sel_time(void) //選擇模式
  191. {
  192.         uchar buff[9];
  193.         static uchar temp[4];
  194.         static uchar num=0;
  195.         if(k==12) {
  196.                 time1=1;
  197.                 GotoXY(0,1);               
  198.                 Print("          ");
  199.                 GotoXY(0,1);               
  200.                 Print("1: ");        }
  201.         if(k==13) {
  202.                 time1=2;
  203.                 GotoXY(0,1);               
  204.                 Print("          ");
  205.                 GotoXY(0,1);               
  206.                 Print("2: ");        }
  207.         if(k==14) {
  208.                 time1=3;
  209.                 GotoXY(0,1);               
  210.                 Print("          ");
  211.                 GotoXY(0,1);               
  212.                 Print("3: ");        }
  213.         if(k==15) {
  214.                 time1=4;
  215.                 GotoXY(0,1);               
  216.                 Print("          ");
  217.                 GotoXY(0,1);               
  218.                 Print("4: ");        }
  219.         if(time1==1)
  220.         {
  221.                 if(k<10)
  222.                 {
  223.                         temp[num]=k;               
  224.                         num++;
  225.                         if(num>=4)
  226.                         {
  227.                               
  228.                                 j1_time[0]=temp[0]*16+temp[1];
  229.         j1_time[1]=temp[2]*16+temp[3];
  230.                                 GotoXY(4,1);
  231.                                 buff[0]=j1_time[0]/16 + '0';
  232.                                 buff[1]=j1_time[0]%16 + '0';
  233.                                 buff[2]=j1_time[1]/16 + '0';
  234.                                 buff[3]=j1_time[1]%16 + '0';
  235.                                 buff[4]='\0';
  236.                                 Print(buff);
  237.                                 num=0;
  238.                                 time1=0;
  239.                         }
  240.                         k=22;
  241.                 }
  242.         }
  243.         if(time1==2)
  244.         {
  245.                 if(k<10)
  246.                 {
  247.                         temp[num]=k;
  248.                         num++;
  249.                         if(num>=4)
  250.                         {
  251.                                 j2_time_on[0]=temp[0]*16+temp[1];
  252.         j2_time_on[1]=temp[2]*16+temp[3];
  253.                                         GotoXY(4,1);
  254.                                 buff[0]=j2_time_on[0]/16 + '0';
  255.                                 buff[1]=j2_time_on[0]%16 + '0';
  256.                                 buff[2]=j2_time_on[1]/16 + '0';
  257.                                 buff[3]=j2_time_on[1]%16 + '0';
  258.                                 buff[4]='\0';
  259.                                 Print(buff);
  260.                                 num=0;
  261.                                 time1=0;
  262.                         }
  263.                 }
  264.                 k=22;
  265.         }      
  266.         if(time1==3)
  267.         {
  268.                 if(k<10)
  269.                 {
  270.                         temp[num]=k;
  271.                         num++;
  272.                         if(num>=4)
  273.                         {
  274.                                 j2_time_off[0]=temp[0]*16+temp[1];
  275.         j2_time_off[1]=temp[2]*16+temp[3];
  276.                                         GotoXY(4,1);
  277.                                 buff[0]=j2_time_off[0]/16 + '0';
  278.                                 buff[1]=j2_time_off[0]%16 + '0';
  279.                                 buff[2]=j2_time_off[1]/16 + '0';
  280.                                 buff[3]=j2_time_off[1]%16 + '0';
  281.                                 buff[4]='\0';
  282.                                 Print(buff);
  283.                                 num=0;
  284.                                 time1=0;
  285.                         }
  286.                         k=22;
  287.                 }
  288.         }
  289.                 if(time1==4)
  290.         {
  291.                 if(k<10)
  292.                 {
  293.                         temp[num]=k;
  294.                         num++;
  295.                         if(num>=4)
  296.                         {
  297.                                 j3_time[0]=temp[0]*16+temp[1];
  298.         j3_time[1]=temp[2]*16+temp[3];
  299.                                         GotoXY(4,1);
  300.                                 buff[0]=j3_time[0]/16 + '0';
  301.                                 buff[1]=j3_time[0]%16 + '0';
  302.                                 buff[2]=j3_time[1]/16 + '0';
  303.                                 buff[3]=j3_time[1]%16 + '0';
  304.                                 buff[4]='\0';
  305.                                 Print(buff);
  306.                                 num=0;
  307.                                 time1=0;
  308.                         }
  309.                 }
  310.                 k=22;
  311.         }               
  312. }

  313. void j_control(void) //控制繼電器
  314. {
  315.         if((j1_time[0] == TIME[2])&&(j1_time[1] == TIME[1]))
  316.         {
  317.           j1=0;
  318.         }
  319.                 if((j2_time_on[0] == TIME[2])&&(j2_time_on[1] == TIME[1]))
  320.         {

  321.         j2=0;
  322.         }
  323.                         if((j2_time_off[0] == TIME[2])&&(j2_time_off[1] == TIME[1]))
  324.         {

  325.         j2=1;
  326.         }
  327.                 if((j3_time[0] == TIME[2])&&(j3_time[1] == TIME[1]))
  328.         {

  329.          j3=0;
  330.         }
  331. }
  332. void TimeToStr(unsigned char *buf)
  333. {
  334.         buf[0] = TIME[2]/16 + '0';
  335.         buf[1] = TIME[2]%16 + '0';
  336.         buf[2] = ':';
  337.         buf[3] = TIME[1]/16 + '0';
  338.         buf[4] = TIME[1]%16 + '0';
  339.         buf[5] = ':';
  340.         buf[6] = TIME[0]/16 + '0';
  341.         buf[7] = TIME[0]%16 + '0';
  342.         buf[8] = '\0';
  343. }


  344. void main(void)
  345. {
  346. unsigned char time_buf[9];
  347. Ds1302Init(); //寫入設(shè)置的時(shí)間      
  348. LCD_Initial();
  349. GotoXY(0,0);
  350. Print("Time: ");      
  351. while(1)
  352. {
  353.   Getch();
  354.         sel_time();
  355.   Ds1302ReadTime();  //讀時(shí)間
  356.         TimeToStr(time_buf);
  357.   j_control();
  358.         GotoXY(6,0);
  359.         Print(time_buf);
  360. }
  361. }

復(fù)制代碼
51hei.png
所有資料51hei提供下載:
家電控制.rar (98.36 KB, 下載次數(shù): 33)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产在线精品一区二区三区 | 国产综合久久久久久鬼色 | av乱码| 欧美婷婷 | 99影视| 欧美在线日韩 | 99久久精品免费看国产小宝寻花 | 免费观看一级毛片 | 日本三级视频 | 91视频一区二区 | 特级毛片www | 欧美日韩久久精品 | 欧美日韩一区精品 | 午夜视频在线播放 | 99一区二区| 又爽又黄axxx片免费观看 | 懂色av一区二区三区在线播放 | 欧美一页 | 夜夜爽99久久国产综合精品女不卡 | 欧美高清视频在线观看 | 日韩一区二区免费视频 | 午夜午夜精品一区二区三区文 | 亚洲欧美另类在线 | 国产四虎 | 日日操操 | 国产福利小视频 | 日韩精品一区二区三区中文字幕 | 精品国产一区二区三区性色av | 久久av在线播放 | 毛片免费视频 | 国产精品成人一区二区三区夜夜夜 | 国产视频导航 | 91高清视频 | 久久天堂| 午夜精品网站 | 99久久久久久99国产精品免 | 精品久久国产 | 国产成人精品免高潮在线观看 | 免费观看的av毛片的网站 | 欧美高清一级片 | 亚洲一区二区三 |