找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机温度报警器课程设计 带仿真 源码 论文

[复制链接]
跳转到指定楼层
楼主
51单片机 温度报警器原理图:


所有资料下载:
单片机温度报警器.rar (881.83 KB, 下载次数: 115)

源程序:
  1. #include <AT89X51.H>

  2. #define u8 unsigned char
  3. #define u16 unsigned int
  4. #define line01 0x80
  5. #define line02 0xc0
  6. #define DATA_BUS P0

  7. sbit Detect=P3^2;
  8. sbit DQ=P2^7;                        // ds18b20与单片机连接口
  9. sbit EN=P2^0;                           // lcd1602控制
  10. sbit RS=P2^1;                        // lcd1602与单片机控制接口
  11. sbit RW=P2^2;                        // lcd1602控制
  12. sbit MOTOR1=P2^4;                // 电机1控制端
  13. sbit MOTOR2=P2^5;                // 电机2控制端
  14. sbit LED0=P1^0;                        // 电机慢速指示
  15. sbit LED1=P1^1;                        // 电机快速指示
  16. sbit Set_Clock=P1^5;                // 调定时控制
  17. sbit Adjust_TL=P1^6;                // 调TL控制
  18. sbit Adjust_TH=P1^7;                // 调TH控制
  19. sbit Key_up=P3^6;                // +1操作键
  20. sbit Key_dn=P3^7;                // -1操作键
  21. sbit BEEP=P3^3;
  22.            

  23. u8 code str1[]={"TR:"};
  24. u8 code str2[]={"TH:"};
  25. u8 code str3[]={"    TL:"};

  26. u8 disdata[5];
  27. u16 Temperature;                // 检测到的温度(扩大了10倍)
  28. u16 Temperature_H=300;                // 预设的高温控制温度(扩大了10倍)
  29. u16 Temperature_L=200;                // 预设的低温控制温度(扩大了10倍)

  30. u8 Clock_Timer=30;                // 预设定时为30分钟;
  31. u8 Temperature_flag;                // 温度正负标志

  32. /*************************lcd1602程序**************************/
  33. void delay1ms(u16 ms)        // 非精确延时1毫秒
  34. {
  35.         u8 i,j;
  36.         for(;ms>0;ms--)
  37.         for(i=2;i>0;i--)
  38.         for(j=250;j>0;j--);
  39. }

  40. void wr_com(u8 com)                // LCD1602写指令//
  41. {  
  42.         delay1ms(1);
  43.         EN=0;
  44.         RS=0;
  45.         RW=0;

  46.         DATA_BUS=com;
  47.         delay1ms(1);
  48.         EN=1;
  49.         delay1ms(1);
  50.         EN=0;
  51.   }

  52. void wr_dat(u8 dat)                // LCD1602写数据//
  53. {  
  54.         delay1ms(1);;
  55.         RS=1;
  56.         RW=0;
  57.         EN=0;
  58.         DATA_BUS=dat;
  59.         delay1ms(1);
  60.         EN=1;
  61.         delay1ms(1);
  62.         EN=0;
  63. }

  64. void lcd_init()                        // 初始化设置 //
  65. {
  66.         delay1ms(15);
  67.         wr_com(0x38);delay1ms(5);
  68.         wr_com(0x08);delay1ms(5);
  69.         wr_com(0x01);delay1ms(5);
  70.         wr_com(0x06);delay1ms(5);
  71.         wr_com(0x0c);delay1ms(5);
  72. }

  73. void Display_String(u8 *p)        // 显示 //
  74. {
  75.         while(*p!='\0')
  76.         {
  77.                 wr_dat(*p);
  78.                 p++;
  79.                 delay1ms(10);
  80.         }
  81. }

  82. void Init_Display_String()        //初始化显示
  83. {
  84.         lcd_init();
  85.         wr_com(0x80);
  86.         Display_String("Have a nice day!");
  87.         wr_com(0xc0);
  88.         Display_String("   2015-03=6-25   ");
  89. }

  90. /******************************ds1820程序***************************************/
  91. void delay_18B20(u8 i)                // 延时i微秒
  92. {
  93.         for(;i>0;i--);
  94. }

  95. void ds1820rst()                //*ds1820复位*/
  96. {  
  97.         u8 x=0;
  98.         DQ = 1;                  // DQ复位
  99.         delay_18B20(4);          // 延时
  100.         DQ = 0;                  // DQ拉低
  101.         delay_18B20(100);         // 精确延时大于480us
  102.         DQ = 1;                  // 拉高
  103.         delay_18B20(40);         
  104. }
  105.   
  106. u8 ds1820rd()                        //*读数据*/
  107. {
  108.         u8 i=0;
  109.         u8 dat = 0;
  110.         for (i=8;i>0;i--)
  111.         {   
  112.                 DQ = 0;         //给脉冲信号
  113.                 dat>>=1;
  114.                 DQ = 1;         //给脉冲信号
  115.                 if(DQ)
  116.                 dat|=0x80;
  117.                 delay_18B20(10);
  118.          }
  119.         return(dat);
  120. }

  121. void ds1820wr(u8 wdata)                //*写数据*/
  122. {
  123.         u8 i=0;
  124.         for (i=8; i>0; i--)
  125.         {
  126.                 DQ = 0;
  127.                 DQ = wdata&0x01;
  128.                 delay_18B20(10);
  129.                 DQ = 1;
  130.                 wdata>>=1;
  131.    }
  132. }
  133.   

  134. void Read_Temperature()                //*读取温度值并转换*/
  135. {
  136.         u8 a,b;
  137.         ds1820rst();   
  138.         ds1820wr(0xcc);                //*跳过读序列号*/
  139.         ds1820wr(0x44);                //*启动温度转换*/
  140.         ds1820rst();   
  141.         ds1820wr(0xcc);                //*跳过读序列号*/
  142.         ds1820wr(0xbe);                //*读取温度*/
  143.         a=ds1820rd();
  144.         b=ds1820rd();
  145.         Temperature=a+b*256;
  146.             if(Temperature<=0x0fff)Temperature_flag=0;
  147.             else
  148.         {
  149.                 Temperature=~Temperature+1;
  150.                 Temperature_flag=1;
  151.         }
  152.         Temperature=Temperature*(0.625);//温度值扩大10倍,以精确到1位小数       
  153. }

  154. /*******************************************************************/
  155. void Display_Temperature()//温度值显示
  156. {
  157.         disdata[0]=Temperature/1000+0x30;                        //百位数
  158.         disdata[1]=Temperature/100%10+0x30;                        //十位数
  159.         disdata[2]=Temperature/10%10+0x30;                        //个位数
  160.         disdata[3]=Temperature%10+0x30;                                //小数位

  161.         wr_com(0x80);
  162.         Display_String(str1);;
  163.         if(Temperature_flag==1)wr_dat(0x2d);                        //显示符号位
  164.         if(disdata[0]!=0x30)wr_dat(disdata[0]);                        //显示百位
  165.         wr_dat(disdata[1]);                                        //显示十位        
  166.         wr_dat(disdata[2]);                                        //显示个位        
  167.         wr_dat(0x2e);                                                //显示小数点        
  168.         wr_dat(disdata[3]);                                        //显示小数位
  169.         wr_dat('C');

  170.         if(Set_Clock==0)
  171.         {
  172.                 Display_String("  CLK:");
  173.                 wr_dat(Clock_Timer/10+0x30);
  174.                 wr_dat(Clock_Timer%10+0x30);
  175.         }

  176.         wr_com(0xc0);
  177.         Display_String(str2);
  178.         wr_dat(Temperature_H/100+0x30);
  179.         wr_dat(Temperature_H/10%10+0x30);
  180.         wr_dat('C');

  181.         Display_String(str3);
  182.         wr_dat(Temperature_L/100+0x30);
  183.         wr_dat(Temperature_L/10%10+0x30);
  184.         wr_dat('C');                                                                                
  185. }
  186. //报警程序
  187. void baojing(void)
  188. {
  189.    unsigned int j;
  190.    for(j=100;j>0;j--)//响30ms
  191.    {
  192.          BEEP=0;        //输出频率800Hz P0=0x7E;
  193.          delay1ms(84);//延时310us
  194.          BEEP=1;
  195.          delay1ms(10);//延时310us
  196.          }
  197. }
  198. void MOTOR_control01()
  199. {
  200.         if(Temperature>Temperature_H)                 //大于TH,电机全速
  201.         {
  202.                 MOTOR1=0;
  203.                 MOTOR2=1;
  204.                 LED0=1;
  205.                 LED1=0;
  206.                 delay1ms(1);
  207.                 baojing();

  208.         }

  209.         else if((Temperature>=Temperature_L)&&(Temperature<=Temperature_H))        //小于TH大于TL,电机半速
  210.         {
  211.                 MOTOR1=1;
  212.                 MOTOR2=1;
  213.                 LED0=1;
  214.                 LED1=1;
  215.                 BEEP=0;
  216.                 delay1ms(1);
  217.         }
  218.         else                                        //小于TL,电机关闭
  219.         {
  220.                 MOTOR1=1;
  221.                 MOTOR2=0;
  222.                 LED0=0;
  223.                 LED1=1;
  224.             delay1ms(1);
  225.                 baojing();
  226.         }                       
  227. }

  228. void MOTOR_control02()        //关闭电机
  229. {
  230.         MOTOR1=1;
  231.         MOTOR2=1;
  232.         LED0=1;
  233.         LED1=1;                                               
  234. }

  235. void Timer0_init(void)
  236. {
  237.         TMOD=0x01;
  238.         TH0=(65536-10000)/256;               //在这里,10000本应该是50000的,为了加快仿真的效果,加速了5倍。
  239.         TL0=(65536-10000)%256;
  240.         TR0=1;
  241.         ET0=1;
  242.         EA=1;
  243. }
  244. /********************主程序***********************************/

  245. void main()
  246. {
  247.         Init_Display_String();                //初始化显示
  248.         Read_Temperature();                //读取温度
  249.         MOTOR_control02();                  //电机控制
  250.         delay1ms(1000);                     //延时1秒
  251.         wr_com(0x01);                        //LCD清屏
  252.         Display_Temperature();                //显示温度
  253.         Timer0_init();
  254.         while(1)
  255.         {
  256.                  Read_Temperature();                        //读取温度
  257.                 Display_Temperature();                        //显示温度
  258.                 if(Detect==0)MOTOR_control01();          //电机控制
  259.                 else MOTOR_control02();                  //电机停止

  260.                 if(Adjust_TH==0)                        //调节TH 。
  261.                 {
  262.                         if(Key_up==0)
  263.                         {
  264.                                 Temperature_H+=10;
  265.                                 if(Temperature_H>350)Temperature_H=350;
  266.                                 while(Key_up==0)Display_Temperature();
  267.                         }
  268.                         if(Key_dn==0)
  269.                         {
  270.                                 Temperature_H-=10;
  271.                                 if(Temperature_H<=250)Temperature_H=250;
  272.                                 while(Key_up==0)Display_Temperature();
  273.                         }
  274.                 }
  275.                 if(Adjust_TL==0)                        //调节TL 。
  276.                 {
  277.                         if(Key_up==0)
  278.                         {
  279.                                 Temperature_L+=10;
  280.                                 if(Temperature_L>250)Temperature_L=250;
  281.                                 while(Key_up==0)Display_Temperature();
  282.                         }
  283.                         if(Key_dn==0)
  284.                         {
  285.                                 Temperature_L-=10;
  286.                                 if(Temperature_L<=150)Temperature_H=150;
  287.                                 while(Key_up==0)Display_Temperature();
  288.                         }
  289.                 }

  290.                 if(Set_Clock==0)                        //调节定时。
  291.                 {
  292.                         if(Key_up==0)
  293.                         {
  294.                                 EA=0;
  295.                                 Clock_Timer++;
  296.                                 if(Clock_Timer>90)Clock_Timer=90;
  297.                                 while(Key_up==0)Display_Temperature();
  298.                                 EA=1;
  299.                         }
  300.                         if(Key_dn==0)
  301.                         {
  302.                                 EA=0;
  303.                                 Clock_Timer--;
  304.                                 if(Clock_Timer>90)Clock_Timer=0;
  305.                                 while(Key_up==0)Display_Temperature();
  306.                                 EA=1;
  307.                         }
  308.                         if(Clock_Timer==0)MOTOR_control02();          //在定时模式下,定时到则电机停止。

  309.                 }
  310.         }
  311. }

  312. void Timer0()interrupt 1                //定时器0用于在定时模式下,控制电机工作。
  313. {
  314.         u8 i,sec;                        //Clock_Timer
  315.         TH0=(65536-10000)/256;                //在这里,10000本应该是50000的,为了加快仿真的效果,加速了5倍。
  316.         TL0=(65536-10000)%256;
  317.         i++;
  318.         if(i>=20)
  319.         {
  320.                 i=0;
  321.                 sec++;
  322.                 if(sec>=60)
  323.                 {
  324.                         sec=0;
  325.                         Clock_Timer--;
  326.                         if(Clock_Timer==0)Clock_Timer=0;
  327.                 }       
  328.         }
  329. }
  330. void Timer1()interrupt 2
  331. {
  332. TCON=0X04;
  333. IE=0X84;
  334. }

复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:108622 发表于 2016-11-28 04:56 来自手机 | 只看该作者
非常好的资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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