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

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 3739|回復(fù): 1
收起左側(cè)

單片機(jī)溫度報(bào)警器課程設(shè)計(jì) 帶仿真 源碼 論文

[復(fù)制鏈接]
ID:149353 發(fā)表于 2016-11-21 22:38 | 顯示全部樓層 |閱讀模式
51單片機(jī) 溫度報(bào)警器原理圖:
0.png
0.png
所有資料下載:
單片機(jī)溫度報(bào)警器.rar (881.83 KB, 下載次數(shù): 117)

源程序:
  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與單片機(jī)連接口
  9. sbit EN=P2^0;                           // lcd1602控制
  10. sbit RS=P2^1;                        // lcd1602與單片機(jī)控制接口
  11. sbit RW=P2^2;                        // lcd1602控制
  12. sbit MOTOR1=P2^4;                // 電機(jī)1控制端
  13. sbit MOTOR2=P2^5;                // 電機(jī)2控制端
  14. sbit LED0=P1^0;                        // 電機(jī)慢速指示
  15. sbit LED1=P1^1;                        // 電機(jī)快速指示
  16. sbit Set_Clock=P1^5;                // 調(diào)定時(shí)控制
  17. sbit Adjust_TL=P1^6;                // 調(diào)TL控制
  18. sbit Adjust_TH=P1^7;                // 調(diào)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;                // 檢測(cè)到的溫度(擴(kuò)大了10倍)
  28. u16 Temperature_H=300;                // 預(yù)設(shè)的高溫控制溫度(擴(kuò)大了10倍)
  29. u16 Temperature_L=200;                // 預(yù)設(shè)的低溫控制溫度(擴(kuò)大了10倍)

  30. u8 Clock_Timer=30;                // 預(yù)設(shè)定時(shí)為30分鐘;
  31. u8 Temperature_flag;                // 溫度正負(fù)標(biāo)志

  32. /*************************lcd1602程序**************************/
  33. void delay1ms(u16 ms)        // 非精確延時(shí)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寫(xiě)指令//
  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寫(xiě)數(shù)據(jù)//
  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()                        // 初始化設(shè)置 //
  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)                // 延時(shí)i微秒
  92. {
  93.         for(;i>0;i--);
  94. }

  95. void ds1820rst()                //*ds1820復(fù)位*/
  96. {  
  97.         u8 x=0;
  98.         DQ = 1;                  // DQ復(fù)位
  99.         delay_18B20(4);          // 延時(shí)
  100.         DQ = 0;                  // DQ拉低
  101.         delay_18B20(100);         // 精確延時(shí)大于480us
  102.         DQ = 1;                  // 拉高
  103.         delay_18B20(40);         
  104. }
  105.   
  106. u8 ds1820rd()                        //*讀數(shù)據(jù)*/
  107. {
  108.         u8 i=0;
  109.         u8 dat = 0;
  110.         for (i=8;i>0;i--)
  111.         {   
  112.                 DQ = 0;         //給脈沖信號(hào)
  113.                 dat>>=1;
  114.                 DQ = 1;         //給脈沖信號(hào)
  115.                 if(DQ)
  116.                 dat|=0x80;
  117.                 delay_18B20(10);
  118.          }
  119.         return(dat);
  120. }

  121. void ds1820wr(u8 wdata)                //*寫(xiě)數(shù)據(jù)*/
  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()                //*讀取溫度值并轉(zhuǎn)換*/
  135. {
  136.         u8 a,b;
  137.         ds1820rst();   
  138.         ds1820wr(0xcc);                //*跳過(guò)讀序列號(hào)*/
  139.         ds1820wr(0x44);                //*啟動(dòng)溫度轉(zhuǎn)換*/
  140.         ds1820rst();   
  141.         ds1820wr(0xcc);                //*跳過(guò)讀序列號(hào)*/
  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);//溫度值擴(kuò)大10倍,以精確到1位小數(shù)       
  153. }

  154. /*******************************************************************/
  155. void Display_Temperature()//溫度值顯示
  156. {
  157.         disdata[0]=Temperature/1000+0x30;                        //百位數(shù)
  158.         disdata[1]=Temperature/100%10+0x30;                        //十位數(shù)
  159.         disdata[2]=Temperature/10%10+0x30;                        //個(gè)位數(shù)
  160.         disdata[3]=Temperature%10+0x30;                                //小數(shù)位

  161.         wr_com(0x80);
  162.         Display_String(str1);;
  163.         if(Temperature_flag==1)wr_dat(0x2d);                        //顯示符號(hào)位
  164.         if(disdata[0]!=0x30)wr_dat(disdata[0]);                        //顯示百位
  165.         wr_dat(disdata[1]);                                        //顯示十位        
  166.         wr_dat(disdata[2]);                                        //顯示個(gè)位        
  167.         wr_dat(0x2e);                                                //顯示小數(shù)點(diǎn)        
  168.         wr_dat(disdata[3]);                                        //顯示小數(shù)位
  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. //報(bào)警程序
  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);//延時(shí)310us
  194.          BEEP=1;
  195.          delay1ms(10);//延時(shí)310us
  196.          }
  197. }
  198. void MOTOR_control01()
  199. {
  200.         if(Temperature>Temperature_H)                 //大于TH,電機(jī)全速
  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,電機(jī)半速
  210.         {
  211.                 MOTOR1=1;
  212.                 MOTOR2=1;
  213.                 LED0=1;
  214.                 LED1=1;
  215.                 BEEP=0;
  216.                 delay1ms(1);
  217.         }
  218.         else                                        //小于TL,電機(jī)關(guān)閉
  219.         {
  220.                 MOTOR1=1;
  221.                 MOTOR2=0;
  222.                 LED0=0;
  223.                 LED1=1;
  224.             delay1ms(1);
  225.                 baojing();
  226.         }                       
  227. }

  228. void MOTOR_control02()        //關(guān)閉電機(jī)
  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本應(yīng)該是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();                  //電機(jī)控制
  250.         delay1ms(1000);                     //延時(shí)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();          //電機(jī)控制
  259.                 else MOTOR_control02();                  //電機(jī)停止

  260.                 if(Adjust_TH==0)                        //調(diào)節(jié)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)                        //調(diào)節(jié)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)                        //調(diào)節(jié)定時(shí)。
  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();          //在定時(shí)模式下,定時(shí)到則電機(jī)停止。

  309.                 }
  310.         }
  311. }

  312. void Timer0()interrupt 1                //定時(shí)器0用于在定時(shí)模式下,控制電機(jī)工作。
  313. {
  314.         u8 i,sec;                        //Clock_Timer
  315.         TH0=(65536-10000)/256;                //在這里,10000本應(yīng)該是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. }

復(fù)制代碼

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:108622 發(fā)表于 2016-11-28 04:56 來(lái)自觸屏版 | 顯示全部樓層
非常好的資料,51黑有你更精彩!�。�
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表