找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于c51单片机恒温控制系统程序+电路图

[复制链接]
跳转到指定楼层
楼主
第一次弄 也不怎么会 哈哈哈哈
用ad弄得仿真图 也不怎么会弄....
电路原理图如下:


单片机源程序如下:
  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include<stdio.h>
  3. #include "18b20.h"
  4. #include "1602.h"
  5. #include "delay.h"

  6. #define SETDOWN 0x01
  7. #define SETUP 0x02

  8. sbit key1=P2^0;        //引脚定义
  9. sbit key2=P2^1;
  10. sbit key3=P2^2;

  11. sbit relay_jiare=P1^0;
  12. sbit relay_zhileng=P1^1;
  13. sbit buzzer=P1^4;

  14. unsigned int setL= 20;         //上限
  15. unsigned int setH= 50;        //下限
  16. unsigned char DisFlag=0;                //更新显示标志
  17. unsigned char SetFlag=0;                //设置参数标志

  18. unsigned long time2ms=0;        //定时计数
  19. unsigned int buzLater=0;  //蜂鸣器计时报

  20. int temp1;                                                //读取温度初始值
  21. float temperature;                                //实际温度值
  22. unsigned char ReadTempFlag=0;//定义读时间标志

  23. char dis0[16];//定义显示区域临时存储数组
  24. char dis1[16];//定义显示区域临时存储数组

  25. unsigned char Num=0;         //计数

  26. void CheckKey(void);
  27. void Init_Timer0(void);//定时器初始化

  28. void main (void)
  29. {                  
  30.         relay_jiare=0;
  31.         relay_zhileng=0;
  32.         buzzer=0;

  33.         Init_Timer0();
  34.         LCD_Init();           //初始化液晶
  35.         DelayMs(200);          //延时有助于稳定
  36.         LCD_Clear();          //清屏

  37.         relay_jiare=1;
  38.         relay_zhileng=1;
  39.         buzzer=1;

  40.         while (1)         //主循环
  41.         {
  42.                 CheckKey();                          //检测按键
  43.                 if(ReadTempFlag==1)                //读取温度标志
  44.                 {
  45.                         ReadTempFlag=0;
  46.                         temp1=ReadTemperature();        //读取温度
  47.                         temperature=(float)temp1*0.0625;          //温度值转换
  48.                 }
  49.                 if(DisFlag==1)       
  50.                 {
  51.                         DisFlag=0;
  52.                         if((temperature>0)&&(temperature<150))
  53.                         {
  54.                                 sprintf(dis0,"Temp:%4.1f C",temperature);//打印温度值
  55.                                 LCD_Write_String(0,0,dis0);//显示第二行
  56.                                 LCD_Write_Char(9,0,0xdf);//写入温度右上角点
  57.                                
  58.                                 if(temperature<setL)         //温度过低
  59.                                 {
  60.                                         relay_jiare=0;        //开启升温 关闭降温
  61.                                         relay_zhileng=1;
  62.                                 }
  63.                                 else if((temperature)>setH)                  //温度超高
  64.                                 {
  65.                                         relay_jiare=1;        //关闭升温 开启降温
  66.                                         relay_zhileng=0;
  67.                                 }
  68.                                 else                         //正常温度
  69.                                 {
  70.                                         relay_jiare=1;        //关闭升温 关闭降温
  71.                                         relay_zhileng=1;
  72.                                         buzLater=0;
  73.                                 }
  74.                                 if(buzLater>=60)//正常清零 否则过高过低都会累加 超过1min
  75.                                 {buzzer=0;}        //打开蜂鸣器                               
  76.                                 else
  77.                                 {buzzer=1;}        //关闭蜂鸣器
  78.                                                        
  79.                         }
  80.                         sprintf(dis1," %02d-- %02d       ",setL,setH);
  81.                         LCD_Write_String(0,1,dis1);        //初始化显示
  82.                        
  83.                         if(SetFlag == 0)//按键设置标志
  84.                         {
  85.                                 LCD_Write_Char(0,1,' ');LCD_Write_Char(5,1,' ');//更新显示标志
  86.                         }
  87.                         else if(SetFlag == 1)//按键设置标志
  88.                         {
  89.                                 LCD_Write_Char(0,1,'S');LCD_Write_Char(5,1,' ');//更新显示标志
  90.                         }                       
  91.                         else if(SetFlag == 2)//按键设置标志
  92.                         {
  93.                                 LCD_Write_Char(0,1,' ');LCD_Write_Char(5,1,'S');//更新显示标志
  94.                         }       
  95.                 }
  96.         }
  97. }

  98. void CheckKey(void)
  99. {
  100.         static unsigned  char rekey =0;
  101.         if((key1==0)||(key2==0)||(key3==0))                 //检测到按键按下
  102.         {
  103.                 DelayMs(10);   //小抖动
  104.                 if(rekey==0)
  105.                 {
  106.                         if(key1==0)    //检测是否按下
  107.                         {
  108.                                 rekey=1;
  109.                                 SetFlag++;//设置标志
  110.                                 if(SetFlag >= 3) SetFlag = 0;
  111.                         }       
  112.                         else if(key2==0)//设置值键
  113.                         {
  114.                                 rekey=1;
  115.                                 if(SetFlag==1)      //处于设置1
  116.                                 {
  117.                                         if(setL > 0 )
  118.                                         {setL=setL-1;}
  119.                                 }
  120.                                 else if(SetFlag==2)//处于设置2
  121.                                 {
  122.                                         if(setH > 0)
  123.                                         {setH=setH-1;}
  124.                                 }                                               
  125.                         }
  126.                         else if(key3==0)//设置值键
  127.                         {
  128.                                 rekey=1;
  129.                                 if(SetFlag==1)      //处于设置1
  130.                                 {
  131.                                         if(setL < 99 )
  132.                                         {setL=setL+1;}
  133.                                 }
  134.                                 else if(SetFlag==2)//处于设置2
  135.                                 {
  136.                                         if(setH < 99 )
  137.                                         {setH=setH+1;}
  138.                                 }                               
  139.                         }
  140.                 }
  141.         }
  142.         else
  143.         {
  144.         rekey=0;    //防止重复检测到按键
  145.         }
  146. }


  147. /*------------------------------------------------
  148.                     定时器初始化子程序
  149. ------------------------------------------------*/
  150. void Init_Timer0(void)
  151. {
  152.         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  153.         //TH0=0x00;              //给定初值
  154.         //TL0=0x00;
  155.         EA=1;            //总中断打开
  156.         ET0=1;           //定时器中断打开
  157.         TR0=1;           //定时器开关打开
  158. }
  159. /*------------------------------------------------
  160.                  定时器中断子程序
  161. ------------------------------------------------*/
  162. void Timer0_isr(void) interrupt 1
  163. {
  164.         TH0=(65536-20000)/256;                  //重新赋值 20ms
  165.         TL0=(65536-20000)%256;
  166.         time2ms++;

  167.         if(time2ms%10==0)        //更新显示
  168.         {
  169.                 DisFlag=1;
  170.                 if(time2ms%50==0)                 //读取温度
  171.                 {
  172.                         ReadTempFlag=1; //读标志位置1       
  173.                         if(buzLater<200)buzLater++;
  174.                 }
  175.         }
  176. }
复制代码

所有资料51hei提供下载:
Desktop.rar (73.5 KB, 下载次数: 52)
单片机.rar (2.96 MB, 下载次数: 70)


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

使用道具 举报

沙发
ID:455936 发表于 2020-4-9 21:42 | 只看该作者
求个proteus仿真图
回复

使用道具 举报

板凳
ID:455936 发表于 2020-4-9 21:43 | 只看该作者
有没有proteus仿真图呀
回复

使用道具 举报

地板
ID:790137 发表于 2020-6-26 12:59 | 只看该作者
求仿真图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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