久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3719|回復: 1
收起左側

單片機溫度報警器課程設計 帶仿真 源碼 論文

[復制鏈接]
ID:149353 發表于 2016-11-21 22:38 | 顯示全部樓層 |閱讀模式
51單片機 溫度報警器原理圖:
0.png
0.png
所有資料下載:
單片機溫度報警器.rar (881.83 KB, 下載次數: 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與單片機連接口
  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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:108622 發表于 2016-11-28 04:56 來自手機 | 顯示全部樓層
非常好的資料,51黑有你更精彩。!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲天堂中文字幕 | 免费成人在线网站 | 在线观看成人 | 欧美a级成人淫片免费看 | 六月色婷 | 91久操视频 | 亚洲精品在线视频 | 久久成人精品 | 国产不卡在线观看 | 精品欧美一区二区三区久久久 | 亚洲永久免费观看 | 日韩在线视频一区二区三区 | 黄片毛片免费看 | 国产精品亚洲综合 | 成人免费视频 | 精品亚洲一区二区 | 日本精a在线观看 | 欧美一区二区三区四区视频 | 亚洲视频在线看 | jizz中国日本 | 国产一区h| 欧美中文字幕一区二区三区 | 9191在线播放 | 欧美日韩专区 | 激情网站在线 | 91影院在线观看 | 亚洲欧美日韩精品久久亚洲区 | 免费国产视频 | 欧美黄色片 | 九色国产 | 日日噜噜噜夜夜爽爽狠狠视频97 | 伊人春色成人 | 成人午夜免费视频 | 日韩手机视频 | 人人看人人草 | 日本 欧美 国产 | 在线观看日韩av | 成人毛片在线观看 | 欧美黄色片 | 欧美亚洲视频在线观看 | 久久成人免费视频 |