找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Proteus仿真单片机继电器家电控制程序

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  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写入和读取时分秒的地址命令---//
  15. //---秒分时日月周年 最低位读写位;-------//
  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时钟初始化2013年1月1日星期二12点00分00秒。---//
  19. //---存储顺序是秒分时日月周年,存储格式是用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.                             延时函数
  25. *********************************************************************/
  26. void delay10ms(void) //延时程序
  27. {
  28.         unsigned char i,j;
  29.         for(i=20;i>0;i--)
  30.         for(j=248;j>0;j--);
  31. }
  32. /*******************************************************************************
  33. * 函 数 名         : Ds1302Write
  34. * 函数功能                   : 向DS1302命令(地址+数据)
  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;//数据从低位开始传送
  50.                 addr >>= 1;
  51.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  52.                 _nop_();
  53.                 SCLK = 0;
  54.                 _nop_();
  55.         }
  56.         for (n=0; n<8; n++)//写入8位数据
  57.         {
  58.                 DSIO = dat & 0x01;
  59.                 dat >>= 1;
  60.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  61.                 _nop_();
  62.                 SCLK = 0;
  63.                 _nop_();      
  64.         }      
  65.                  
  66.         RST = 0;//传送数据结束
  67.         _nop_();
  68. }

  69. /*******************************************************************************
  70. * 函 数 名         : Ds1302Read
  71. * 函数功能                   : 读取一个地址的数据
  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;//数据从低位开始传送
  87.                 addr >>= 1;
  88.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  89.                 _nop_();
  90.                 SCLK = 0;//DS1302下降沿时,放置数据
  91.                 _nop_();
  92.         }
  93.         _nop_();
  94.         for(n=0; n<8; n++)//读取8位数据
  95.         {
  96.                 dat1 = DSIO;//从最低位开始接收
  97.                 dat = (dat>>1) | (dat1<<7);
  98.                 SCLK = 1;
  99.                 _nop_();
  100.                 SCLK = 0;//DS1302下降沿时,放置数据
  101.                 _nop_();
  102.         }

  103.         RST = 0;
  104.         _nop_();        //以下为DS1302复位的稳定时间,必须的。
  105.         SCLK = 1;
  106.         _nop_();
  107.         DSIO = 0;
  108.         _nop_();
  109.         DSIO = 1;
  110.         _nop_();
  111.         return dat;      
  112. }

  113. /*******************************************************************************
  114. * 函 数 名         : Ds1302Init
  115. * 函数功能                   : 初始化DS1302.
  116. * 输    入         : 无
  117. * 输    出         : 无
  118. *******************************************************************************/

  119. void Ds1302Init()
  120. {
  121.         uchar n;
  122.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  123.         for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
  124.         {
  125.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);      
  126.         }
  127.         Ds1302Write(0x8E,0x80);                 //打开写保护功能
  128. }

  129. /*******************************************************************************
  130. * 函 数 名         : Ds1302ReadTime
  131. * 函数功能                   : 读取时钟信息
  132. * 输    入         : 无
  133. * 输    出         : 无
  134. *******************************************************************************/
  135. void Ds1302ReadTime()
  136. {
  137.         uchar n;
  138.         for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
  139.         {
  140.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  141.         }               
  142. }
  143. /********************************************************************
  144.                             键盘函数
  145. *********************************************************************/  
  146. uchar k=0;
  147. uchar mode=2;
  148. uchar time1;

  149. void Getch (void)        //取键值函数
  150. {
  151. unsigned char X,Y,Z;
  152. P1=0x0f; //先对P3 置数 行扫描
  153. if(P1!=0x0f) //判断是否有键按下
  154.         {
  155.         delay10ms(); //延时,软件去干扰
  156.         if(P1!=0x0f) //确认按键按下
  157.                 {
  158.                 X=P1; //保存行扫描时有键按下时状态
  159.                 P1=0xf0; //列扫描
  160.                 Y=P1;    //保存列扫描时有键按下时状态
  161.                 Z=X|Y; //取出键值
  162. /*********************************************************************/
  163. switch ( Z ) //判断键值(那一个键按下)
  164.                         {
  165.                                 case 0xee: k=0; break; //对键值赋值
  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(); //写入设置的时间      
  348. LCD_Initial();
  349. GotoXY(0,0);
  350. Print("Time: ");      
  351. while(1)
  352. {
  353.   Getch();
  354.         sel_time();
  355.   Ds1302ReadTime();  //读时间
  356.         TimeToStr(time_buf);
  357.   j_control();
  358.         GotoXY(6,0);
  359.         Print(time_buf);
  360. }
  361. }

复制代码

所有资料51hei提供下载:
家电控制.rar (98.36 KB, 下载次数: 33)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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