找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1721|回复: 0
收起左侧

单片机温度控制仪改造定时开关 Proteus仿真程序

[复制链接]
ID:228935 发表于 2021-2-7 10:16 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1612663066(1).png

单片机源程序如下:
  1. /*温度控制仪主要材料变压器(220V-5V) 继电器、 STC89C52 、74LS145P 、74HC164、两个三位八段数码管。*/



  2. /*定时开关,可以设定什么时间启动,通电保持时间。该程序数码管第一位代表小时1-19。10以后的数字用小数点代表10。后两位是分钟。*/



  3. /*程序缺点:按键按下,数码管闪烁。暂未找到解决办法。另外想让设置键长按进入设置,小白一枚不会做,有高手希望指点一番。*/



  4. #include "reg51.h"    //此文件中定义了单片机的一些特殊功能寄存器

  5. #define uint unsigned int      //

  6. #define uchar unsigned char   //         

  7.         

  8. int xmin=0,xhour=1,smin=10,shour=0;

  9. int count,sec,min,hour;

  10. int key_press=1;



  11. sbit DAT=P3^0;//显示段(数字)

  12. sbit CLK=P3^1;//锁存

  13. sbit JDQ=P3^5; //信号输出-控制继电器

  14. sbit KEY=P3^2; //按键



  15. //指示灯

  16. sbit L1=P0^0; //    设置  秒闪

  17. sbit L2=P0^1; //     增加

  18. sbit L3=P0^2; //     减少



  19. sbit A=P1^1;

  20. sbit E=P1^2;

  21. sbit C=P1^3;

  22. sbit D=P1^4;



  23. uchar sm_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

  24.                                                         0xbf,0x96,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,

  25.                                                         0x77,0x7c,0x39,0x5e,0x79,0x71};



  26. uint xs[4];  //保持分钟,保持小时,剩余启动分钟/已启动分钟、剩余启动小时/已启动小时



  27. //延时函数

  28. void delay(uint z)

  29. {               

  30.         uint x,y;

  31.         for(x=z;x>0;x--)

  32.                 for(y=110;y>0;y--);

  33. }



  34. //发送数据函数

  35. void sendbyte(uchar byte)   

  36. {      

  37.     uchar num,c;   

  38.     num=sm_d[byte];   

  39.     for(c=0;c<8;c++)   

  40.     {   

  41.         CLK=0;   

  42.         DAT=num&0x01;   

  43.         CLK=1;   

  44.         num>>=1;   

  45.     }        

  46. }               



  47. void js()

  48. {

  49.         int a,b,c;

  50.         a=sec+min*60+hour*60*60;   //实时

  51.         b=smin*60+shour*60*60;     //变动时间

  52.         c=xmin*60+xhour*60*60;     //保持时间

  53.         

  54.                

  55.         if(a<b)  //启动倒计时

  56.         {

  57.                 xs[0]=xmin;             //下分钟

  58.                 xs[1]=xhour;            //下小时

  59.                 xs[2]=((b-a)%3600)/60;    //上分钟

  60.                 xs[3]=(b-a)/3600;              //上小时

  61.                 JDQ=1;

  62.                 if(key_press==1)

  63.                         L2=0;  

  64.                 else

  65.                         L2=1;

  66.         }

  67.         else if((b<a)&&(a<b+c))   //启动中

  68.         {

  69.                 xs[0]=xmin;

  70.                 xs[1]=xhour;

  71.                 xs[2]=(a-b)%3600/60;

  72.                 xs[3]=(a-b)/3600;        

  73.                 JDQ=0;

  74.                 if(key_press==1)

  75.                         L3=0;  

  76.                 else

  77.                         L3=1;   

  78.         }

  79.         else if(a>b+c)

  80.         {

  81.                 xs[0]=0;

  82.                 xs[1]=0;

  83.                 xs[2]=(a-b-c)%3600/60;

  84.                 xs[3]=(a-b-c)/3600;        

  85.                 JDQ=1;

  86.                 L2=1;

  87.                 L3=1;

  88.         }        

  89. }



  90. //正常显示函数

  91. void zcxs(uint wei)

  92. {

  93.         uint i,j;

  94.         uint zcsmg_num[6];

  95.         js();

  96.         

  97.         zcsmg_num[0]= xs[0]%10;

  98.         zcsmg_num[1]= xs[0]/10;

  99.         zcsmg_num[2]= xs[1];

  100.         zcsmg_num[3]= xs[2]%10;

  101.         zcsmg_num[4]= xs[2]/10;

  102.         zcsmg_num[5]= xs[3];

  103.         

  104.         for(i=0;i<6;i++)

  105.         {               

  106.                 switch(wei)

  107.                 {

  108.                         case 2:if((i==0)||(i==1)){j++;if(j<30)continue;else if(j>60)j=0;};break;

  109.                         case 3:if(i==2){j++;if(j<30)continue;else if(j>60)j=0;};break;

  110.                         case 4:if((i==3)||(i==4)){j++;if(j<30)continue;else if(j>60)j=0;};break;

  111.                         case 5:if(i==5){j++;if(j<30)continue;else if(j>60)j=0;};break;

  112.                 }

  113.                

  114.                 switch(i)

  115.                 {

  116.                         case 0: A=0;E=0;C=0;D=0;sendbyte(zcsmg_num[0]);delay(2);break;  //下右

  117.                         case 1: A=1;E=0;C=0;D=0;sendbyte(zcsmg_num[1]);delay(2);break;

  118.                         case 2: A=0;E=1;C=0;D=0;sendbyte(zcsmg_num[2]);delay(2);break;                        

  119.                         case 3: A=0;E=0;C=1;D=0;sendbyte(zcsmg_num[3]);delay(2);break;  //上右

  120.                         case 4: A=1;E=0;C=1;D=0;sendbyte(zcsmg_num[4]);delay(2);break;

  121.                         case 5: A=0;E=1;C=1;D=0;sendbyte(zcsmg_num[5]);delay(2);break;

  122.                 }

  123.         }

  124. }



  125. void Time0 (void) interrupt 1 using 1   //定时0中断函数

  126. {  

  127.         TH0=(65536-20000)/256;   //0XEC

  128.         TL0=(65536-20000)%256;   //0X78

  129.         count++;

  130.         if(count<25)

  131.                 L1=0;        //设置灯秒闪

  132.         else

  133.                 L1=1;

  134.         if(count==50)  

  135.         {  

  136.                 sec++;        

  137.                 count=0;

  138.                 if(sec==60)   

  139.                 {

  140.                         min++;        

  141.                         sec=0;

  142.       if(min==60)     

  143.                         {

  144.                                 hour++;      

  145.                                 min=0;

  146.                                 if(hour==39)    //  

  147.                                 {

  148.                                         hour=0;   

  149.                                         min=0;

  150.                                         sec=0;

  151.                                 }

  152.                         }

  153.                 }

  154.         }

  155. }



  156. void init()

  157. {

  158.         JDQ=1;                   //继电器高电平;

  159.         L1=1;

  160.         L2=1;

  161.         L3=1;

  162.         KEY=1;

  163.         

  164.         TMOD=0x01;               //定时器T0工作于方式1,采用12M晶振,定时20ms

  165.         TH0=(65536-20000)/256;   //0XEC

  166.         TL0=(65536-20000)%256;   //0X78

  167.         

  168.         TR0 = 1;          //定时器0开始计时               

  169.         ET0=1;            //开定时器0中断

  170.         

  171.         EA=1;             //开总中断

  172.         

  173. }



  174. void key_scan()

  175. {

  176.         uint i;

  177.         for(i=6;i<9;i++)

  178.         {

  179.                 switch(i)

  180.                 {

  181.                         case 6: A=1;E=1;C=1;D=0;delay(5);break;  //按键

  182.                         case 7: A=0;E=0;C=0;D=1;delay(5);break;

  183.                         case 8: A=1;E=0;C=0;D=1;delay(5);break;

  184.                 }

  185.                

  186.                 if(KEY==0)

  187.                 {

  188.                         delay(150);

  189.                         if((KEY==0)&&(i==6))

  190.                         {

  191.                                 key_press++;                                

  192.                                 if(key_press>5)

  193.                                         key_press=1;

  194.                         }

  195.                         if(key_press!=1)

  196.                         {

  197.                                 TR0=0;

  198.                                 sec=0;

  199.                                 min=0;

  200.                                 hour=0;

  201.                                 L1=0;

  202.                         }

  203.                         else

  204.                         {

  205.                                 TR0=1;

  206.                         }

  207.                         if((KEY==0)&&(i==7)&&(key_press!=1))

  208.                         {

  209.                                 L2=0;

  210.                                 delay(100);

  211.                                 switch(key_press%6)

  212.                                         {

  213.                                                 case 2:xmin++;if(xmin>59)xmin=0;break;

  214.                                                 case 3:xhour++;if((xhour>19)&&(xmin==0)){xhour=0;xmin=5;}else if(xhour>19)xhour=0;break;

  215.                                                 case 4:smin++;if(smin>59)smin=0;break;

  216.                                                 case 5:shour++;if((shour>19)&&(smin==0)){shour=0;smin=5;}else if(shour>19)shour=0;break;

  217.                                                         

  218.                                         }

  219.                                 L2=1;

  220.                         }

  221.                         else if((KEY==0)&&(i==8)&&(key_press!=1))

  222.                         {

  223.                                 L3=0;

  224.                                 delay(100);

  225.                                 switch(key_press%6)

  226.                                         {

  227.                                                 case 2:xmin--;if(xmin<0)xmin=59;break;

  228.                                                 case 3:xhour--;if((xhour==0)&&(xmin==0)){xhour=0;xmin=10;}else if(xhour<0)xhour=19;break;

  229.                                                 case 4:smin--;if(smin<0)smin=59;break;

  230.                                                 case 5:shour--;if((shour==0)&&(smin==0)){shour=0;smin=5;}else if(shour<0)shour=19;break;        

  231.                                         }        

  232.                                 L3=1;

  233.                         }

  234.                 }

  235.                 else

  236.                 {

  237.                         zcxs(key_press);

  238.                 }

  239.         }

  240. }



  241. void main()

  242. {

  243.         init();

  244.         while(1)

  245.         {

  246.                 key_scan();

  247.         }



  248. }
复制代码

51hei.png

Proteus仿真文件下载: 定时开关仿真.rar (88.64 KB, 下载次数: 11)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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