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

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

QQ登錄

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

搜索
查看: 2559|回復(fù): 0
收起左側(cè)

一個(gè)簡(jiǎn)單的單片機(jī)溫度報(bào)警系統(tǒng)程序

[復(fù)制鏈接]
ID:995385 發(fā)表于 2021-12-21 20:59 | 顯示全部樓層 |閱讀模式
工程截圖.jpg

單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdio.h>

  4. typedef unsigned int uint;
  5. typedef unsigned char uchar;

  6. /********************引腳定義********************/
  7. #define LCD_DATA P0
  8. sbit LCD_RS = P2^0;
  9. sbit LCD_RW = P2^1;
  10. sbit LCD_EN = P2^2;
  11. sbit KEY_1 = P1^7;                        //功能鍵
  12. sbit KEY_2 = P1^4;                        //減少鍵
  13. sbit KEY_3 = P1^2;                        //增加按鍵
  14. sbit DS18B20 = P2^6;
  15. /************************************************/

  16. /********************全局變量********************/
  17. #define KeyTime 200                                        //200 * 1ms = 200ms
  18. #define DispTime 100                                //100 * 1ms = 100ms
  19. #define UartTime 150                                //150 * 1ms = 150ms
  20. volatile uchar KEY_1ms = 0;
  21. volatile uchar Disp_1ms = 0;
  22. volatile uchar Uart_1ms = 0;
  23. volatile uchar Menu = 0;                //0(顯示當(dāng)前溫度), 1(設(shè)置最低溫度), 2(設(shè)置最低溫度)
  24. volatile int MaxTemp = 40;
  25. volatile int MinTemp = -10;
  26. volatile float Temperature = 0;
  27. /************************************************/

  28. /********************函數(shù)聲明********************/
  29. void Delay_us(uchar x);
  30. void Delay_ms(uchar x);
  31. void Timer0Init(void);
  32. void KEY_Proc(void);
  33. void DispTemp(void);
  34. void LCD_WriteCommand(uchar com);
  35. void LCD_WriteData(uchar dat);
  36. void LCD_Init(void);
  37. void LCD_Show_Home(void);
  38. void LCD_Show_Setting(void);
  39. void DS18B20_Init(void);
  40. uchar DS18B20_ReadByte(void);
  41. void DS18B20_WriteByte(uchar dat);
  42. float DS18B20_ReadTmp(void);
  43. void UartInit(void);
  44. void Uart_Proc(void);
  45. /************************************************/

  46. /*********************主函數(shù)*********************/
  47. int main(void)
  48. {
  49.         LCD_Init();
  50.         Temperature = DS18B20_ReadTmp();
  51.         Delay_ms(200);
  52.         Delay_ms(200);
  53.         UartInit();
  54.         Timer0Init();
  55.         LCD_Show_Home();
  56.         while(1)
  57.         {
  58.                 DispTemp();
  59.                 KEY_Proc();
  60.                 Uart_Proc();
  61.         }
  62. }
  63. /************************************************/

  64. /*****************延時(shí)函數(shù)******************/
  65. void Delay_us(uchar x)                //@12.000MHz
  66. {
  67.         while(x--)
  68.         {
  69.                 _nop_();
  70.                 _nop_();
  71.                 _nop_();
  72.                 _nop_();
  73.         }
  74. }

  75. void Delay_ms(uchar x)                //@12.000MHz
  76. {
  77.         uchar i, j;
  78.         while(x--)
  79.         {
  80.                 _nop_();
  81.                 _nop_();
  82.                 i = 12;
  83.                 j = 169;
  84.                 do
  85.                 {
  86.                         while (--j);
  87.                 } while (--i);
  88.         }
  89. }
  90. /************************************************/

  91. /*******************計(jì)數(shù)器0模塊*******************/
  92. void Timer0Init(void)
  93. {
  94.         TMOD |= 0x01;        //選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。
  95.         TH0 = 0xFC;                //給定時(shí)器賦初值,定時(shí)1ms
  96.         TL0 = 0x18;        
  97.         ET0 = 1;                        //打開(kāi)定時(shí)器0中斷允許
  98.         EA = 1;                                //打開(kāi)總中斷
  99.         TR0 = 1;                        //打開(kāi)定時(shí)器
  100. }

  101. void Timer0(void) interrupt 1
  102. {
  103.         TH0 = 0xFC;                //給定時(shí)器賦初值,定時(shí)1ms
  104.         TL0 = 0x18;
  105.         KEY_1ms ++;
  106.         Disp_1ms ++;
  107.         Uart_1ms ++;
  108. }
  109. /************************************************/

  110. /*****************按鍵模塊******************/
  111. void KEY_Proc(void)
  112. {
  113.         if (KEY_1ms >= KeyTime)
  114.         {
  115.                 KEY_1ms = 0;
  116.                 if (KEY_1 == 0)
  117.                 {
  118.                         Menu ++;
  119.                         LCD_Show_Setting();
  120.                         if (Menu == 3)
  121.                         {
  122.                                 Menu = 0;
  123.                                 LCD_Show_Home();
  124.                         }
  125.                 }
  126.                 else if (KEY_2 == 0)
  127.                 {
  128.                         if (Menu == 1)
  129.                         {
  130.                                 MinTemp --;
  131.                         }
  132.                         else if (Menu == 2)
  133.                         {
  134.                                 MaxTemp --;
  135.                                 if ((MaxTemp - 1) == MinTemp)
  136.                                 {
  137.                                         MaxTemp ++;
  138.                                 }
  139.                         }
  140.                 }
  141.                 else if (KEY_3 == 0)
  142.                 {
  143.                         if (Menu == 1)
  144.                         {
  145.                                 MinTemp ++;
  146.                                 if ((MaxTemp - 1) == MinTemp)
  147.                                 {
  148.                                         MinTemp --;
  149.                                 }
  150.                         }
  151.                         else if (Menu == 2)
  152.                         {
  153.                                 MaxTemp ++;
  154.                         }
  155.                 }
  156.         }
  157. }
  158. /************************************************/

  159. /*****************溫度顯示函數(shù)******************/
  160. void DispTemp(void)
  161. {
  162.         if (Disp_1ms >= DispTime)
  163.         {
  164.                 uchar i;
  165.                 uchar Disp[6] = "      ";
  166.                 uchar Disp1[4] = "    ";
  167.                 Disp_1ms = 0;
  168.                 if (Menu == 0)
  169.                 {
  170.                         LCD_WriteCommand(0xC7);
  171.                         Temperature = DS18B20_ReadTmp();
  172.                         sprintf(Disp, "%.1f", Temperature);
  173.                         for(i=0; i<6; i++)
  174.                         {
  175.                                 LCD_WriteData(Disp[i]);
  176.                         }
  177.                 }
  178.                 else if (Menu == 1)
  179.                 {
  180.                         LCD_WriteCommand(0x80);
  181.                         LCD_WriteData('>');
  182.                         LCD_WriteCommand(0xC0);
  183.                         LCD_WriteData(' ');
  184.                         LCD_WriteCommand(0x8B);
  185.                         sprintf(Disp, "%d", MinTemp);
  186.                         for(i=0; i<4; i++)
  187.                         {
  188.                                 LCD_WriteData(Disp[i]);
  189.                         }
  190.                 }
  191.                 else if (Menu == 2)
  192.                 {
  193.                         LCD_WriteCommand(0x80);
  194.                         LCD_WriteData(' ');
  195.                         LCD_WriteCommand(0xC0);
  196.                         LCD_WriteData('>');
  197.                         LCD_WriteCommand(0xCB);
  198.                         sprintf(Disp, "%d", MaxTemp);
  199.                         for(i=0; i<4; i++)
  200.                         {
  201.                                 LCD_WriteData(Disp[i]);
  202.                         }
  203.                 }
  204.         }
  205. }
  206. /************************************************/

  207. /*******************LCD模塊*******************/
  208. void LCD_WriteCommand(uchar com)
  209. {
  210.         LCD_EN = 0;     //使能
  211.         LCD_RS = 0;                  //選擇發(fā)送命令
  212.         LCD_RW = 0;                   //選擇寫入
  213.         
  214.         LCD_DATA = com; //放入命令
  215.         Delay_us(1);                //等待數(shù)據(jù)穩(wěn)定

  216.         LCD_EN = 1;            //寫入時(shí)序
  217.         Delay_us(5);          //保持時(shí)間
  218.         LCD_EN = 0;
  219. }
  220.            
  221.            
  222. void LCD_WriteData(uchar dat)
  223. {
  224.         LCD_EN = 0;                        //使能清零
  225.         LCD_RS = 1;                        //選擇輸入數(shù)據(jù)
  226.         LCD_RW = 0;                        //選擇寫入

  227.         LCD_DATA = dat; //寫入數(shù)據(jù)
  228.         Delay_us(1);

  229.         LCD_EN = 1;           //寫入時(shí)序
  230.         Delay_us(5);          //保持時(shí)間
  231.         LCD_EN = 0;
  232. }

  233. void LCD_Init(void)
  234. {
  235.          LCD_WriteCommand(0x38);  //開(kāi)顯示
  236.         LCD_WriteCommand(0x0C);  //開(kāi)顯示不顯示光標(biāo)
  237.         LCD_WriteCommand(0x06);  //寫一個(gè)指針加1
  238.         LCD_WriteCommand(0x01);  //清屏
  239.         LCD_WriteCommand(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
  240. }

  241. void LCD_Show_Home(void)
  242. {
  243.         uchar i;
  244.         uchar Disp[16];
  245.         LCD_WriteCommand(0x80);
  246.         sprintf(Disp, " Current Temp:  ");
  247.         for(i=0; i<16; i++)
  248.         {
  249.                 LCD_WriteData(Disp[i]);
  250.         }
  251.         LCD_WriteCommand(0xC0);
  252.         sprintf(Disp, " Temp:        C ");
  253.         for(i=0; i<16; i++)
  254.         {
  255.                 LCD_WriteData(Disp[i]);
  256.         }
  257.         LCD_WriteCommand(0xCD);
  258.         LCD_WriteData(0xDF);
  259. }

  260. void LCD_Show_Setting(void)
  261. {
  262.         uchar i;
  263.         uchar Disp[16];
  264.         LCD_WriteCommand(0x80);
  265.         sprintf(Disp, " Min Temp: %d   ", MinTemp);
  266.         for(i=0; i<16; i++)
  267.         {
  268.                 LCD_WriteData(Disp[i]);
  269.         }
  270.         LCD_WriteCommand(0xC0);
  271.         sprintf(Disp, " Max Temp: %d   ", MaxTemp);
  272.         for(i=0; i<16; i++)
  273.         {
  274.                 LCD_WriteData(Disp[i]);
  275.         }
  276. }
  277. /************************************************/

  278. /*******************DS18B20模塊*******************/
  279. void DS18B20_Init(void)
  280. {
  281.         DS18B20 = 1;
  282.         Delay_us(1);
  283.         DS18B20 = 0;
  284.         Delay_us(40);
  285.         DS18B20 = 1;
  286.         Delay_us(11);
  287. }

  288. uchar DS18B20_ReadByte(void)
  289. {
  290.          uchar i,dat=0;
  291.         DS18B20 = 1;
  292.         for(i=0;i<8;i++)
  293.         {
  294.                 DS18B20 = 1;
  295.                 Delay_us(1);
  296.                  DS18B20 = 0;
  297.                 dat >>= 1;
  298.                 DS18B20 = 1;
  299.                 if(DS18B20)
  300.                         dat |= 0X80;
  301.                 Delay_us(2);
  302.         }
  303.         return dat;
  304. }

  305. void DS18B20_WriteByte(uchar dat)
  306. {
  307.          uchar i;
  308.         for(i=0;i<8;i++)
  309.         {
  310.                  DS18B20 = 0;
  311.                 DS18B20 = dat& 0x01;
  312.                 Delay_us(2);
  313.                 DS18B20 = 1;
  314.                 dat >>= 1;
  315.         }
  316.         Delay_us(2);
  317. }

  318. float DS18B20_ReadTmp(void)
  319. {
  320.         float Temp;
  321.         uint Temp_Value[]={0, 0};
  322.         DS18B20_Init();
  323.         DS18B20_WriteByte(0xCC);
  324.         DS18B20_WriteByte(0x44);
  325.         Delay_us(20);
  326.         DS18B20_Init();
  327.         DS18B20_WriteByte(0xCC);
  328.         DS18B20_WriteByte(0xBE);
  329.         Temp_Value[0] = DS18B20_ReadByte();
  330.         Temp_Value[1] = DS18B20_ReadByte();
  331.         if((Temp_Value[1]&0xF8)==0xF8)
  332.         {
  333.                 Temp = -1 * (128 - 0.0625 * (Temp_Value[0] | ((Temp_Value[1]&0x07)<<8)));
  334.         }
  335.         else
  336.         {
  337.                 Temp = 0.0625 * (Temp_Value[0] | ((Temp_Value[1]&0x07)<<8));
  338.         }
  339.         return Temp;
  340. }
  341. /************************************************/

  342. /*******************串口通信模塊*******************/
  343. void UartInit(void)
  344. {
  345.         SCON = 0x50;                //設(shè)置為工作方式1
  346.         TMOD |= 0x20;                //設(shè)置計(jì)數(shù)器工作方式2
  347.         PCON = 0x80;                //波特率加倍
  348.         TH1=0xF3;                                //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
  349.         TL1=0xF3;
  350. //        ES=1;                                                //打開(kāi)接收中斷
  351. //        EA=1;                                                //打開(kāi)總中斷
  352.         TR1=1;                                        //打開(kāi)計(jì)數(shù)器
  353. }

  354. void Uart_Proc(void)
  355. {
  356. //        if (Uart_1ms >= UartTime)
  357. //        {
  358. //                Uart_1ms = 0;
  359.                 if (Temperature < MinTemp)
  360.                 {
  361.                         SBUF = 'A';
  362.                         while(!TI);
  363.                         TI = 0;
  364.                 }
  365.                 else if (Temperature > MaxTemp)
  366.                 {
  367.                         SBUF = 'B';
  368.                         while(!TI);
  369.                         TI = 0;
  370.                 }
  371.                 else
  372.                 {
  373.                         SBUF = 'O';
  374.                         while(!TI);
  375.                         TI = 0;
  376.                 }
  377. //        }
  378. }
復(fù)制代碼
Proteus仿真工程下載: TemperatureMonitor-master.rar (223.29 KB, 下載次數(shù): 31)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲午夜精品久久久久久app | 理论片87福利理论电影 | 国产精品久久久久久一区二区三区 | 成人精品一区二区三区中文字幕 | 亚洲精品永久免费 | 日日射夜夜骑 | 亚洲久久一区 | 久久午夜视频 | 欧美日韩一区二区三区四区五区 | 日韩一区二区三区视频 | 日韩在线一区二区三区 | 九九伦理电影 | 中文字幕一区二区三区四区五区 | 久久视频精品 | 一二三区av | 亚洲精品电影网在线观看 | 国产在线观看网站 | a视频在线观看 | 欧美精品一区二区在线观看 | 国产免费一区二区三区 | 中文字幕国产视频 | 春色av| 日韩一区二区在线视频 | 日本一区二区三区四区 | 国产91久久久久久久免费 | 九九视频网 | 欧美中文字幕一区二区 | avmans最新导航地址 | 亚洲免费观看视频网站 | 国产91丝袜在线熟 | 欧美成人一区二区三区片免费 | 国产成人精品久久二区二区91 | 青草青草久热精品视频在线观看 | 九九热精品在线 | 亚洲人成在线观看 | aaaa日韩| 国产日韩欧美综合 | 久久久久久国产精品免费 | 国产欧美精品一区二区色综合朱莉 | 日韩在线一区二区 | 99精品国产一区二区青青牛奶 |