欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2697|回復: 0
收起左側

基于51單片機LCD1602顯示DS18B20測溫的項目工程

[復制鏈接]
ID:171036 發表于 2020-5-14 19:29 | 顯示全部樓層 |閱讀模式
  1. #include<reg52.h>//包含51單片機內部寄存器頭文件
  2. #define uchar unsigned char // 自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
  3. #define uint unsigned int//自定義uint為unsigned int(即無符號字符整數型數據,數據范圍:0到6355。)         
  4. sbit RS=P2^0;//位定義LCD1602字符型液晶顯示器的數據/命令選擇引腳                 
  5. sbit RW=P2^1;//位定義LCD1602字符型液晶顯示器的讀寫引腳                        
  6. sbit EN=P2^2; //位定義LCD1602字符型液晶顯示器的使能引腳
  7. sbit DQ=P1^4;//位定義DS18B20數據端口
  8. uint temperature,t;//讀溫度值變量
  9. uint temperatureflag;//負溫度標志位變量                                 //DS18B20數據信號端口
  10. uint wendu,wendubai,wendushi,wenduge,xiaoshudian,xiaoshu,fuhaowei;//溫度值變量、溫度百位變量、溫度十位變量、溫度個位變量、小數點變量、符號位變量、
  11. uchar code table[]="Welcome To";                  
  12. uchar code table1[]="Our System !";              
  13. uchar code table2[]="temperature is:";   
  14.   void Delay(uint z)//延時程序
  15. {
  16.    uint x,y;
  17.    for(x=z;x>0;x--)
  18.     for(y=110;y>0;y--);
  19. }
  20.   void WriteCommand(uchar command)//LCD1602字符型液晶顯示器寫指令函數
  21. {
  22.    RS=0;//LCD1602字符型液晶顯示器指令寄存器低電平
  23.    RW=0;//LCD1602字符型液晶顯示器寫指令操作低電平
  24.    P0=command;//LCD1602字符型液晶顯示器寫指令函數寫指令到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器指令寄存器中執行。
  25.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  26.    EN=1;//LCD1602字符型液晶顯示器使能端高電平  
  27.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  28.    EN=0;//LCD1602字符型液晶顯示器使能端低電平
  29. }
  30.   void WriteData(uchar information)//LCD1602字符型液晶顯示器寫數據函數
  31. {  
  32.    RS=1;//LCD1602字符型液晶顯示器數據寄存器高電平
  33.    RW=0;//LCD1602字符型液晶顯示器寫數據操作低電平
  34.    P0=information;//LCD1602字符型液晶顯示器寫數據函數寫數據到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器上顯示。
  35.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  36.    EN=1;//LCD1602字符型液晶顯示器使能端高電平
  37.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  38.    EN=0;//LCD1602字符型液晶顯示器使能端低電平
  39. }
  40.   void LCD1602Init()//LCD1602初始化函數
  41. {
  42.    WriteCommand(0x38);//設置LCD1602字符型液晶顯示器16x2顯示,5*7或5*8點陣,8位數據并口,簡稱顯模。
  43.    WriteCommand(0x08);//設置LCD1602字符型液晶顯示器顯示開,簡稱亮屏。
  44.    WriteCommand(0x01);//設置清除LCD1602字符型液晶顯示器屏上所有內容,并讓光標復位到LCD1602字符型液晶顯示器屏左上角,簡稱清屏。
  45.    WriteCommand(0x06);//設置開光標(或字符)地址指針自增1,光標右移動一個字符位,整屏顯示不移動。
  46.    WriteCommand(0x0c);//設置開LCD1602字符型液晶顯示器顯示,關光標,關光標(字符)閃爍。
  47. }
  48.   void LCD1602Display()//LCD1602字符型液晶顯示器顯示函數
  49. {
  50.    uchar j;//j表示數組元素個數變量
  51.    WriteCommand(0x80+0x00);//LCD1602字符型液晶顯示器第一行第一個位置顯示
  52.    for(j=0;j<10;j++)//有10個字符,要循環10次。
  53.   {
  54.     WriteData(table[j]);//顯示字符串
  55.     Delay(5);
  56.    }
  57.    WriteCommand(0x80+0x40);//LCD1602字符型液晶顯示器第二行第一個位置顯示
  58.    for(j=0;j<11;j++)//有8個字符,要循環8次。
  59.   {
  60.     WriteData(table1[j]);//顯示字符串
  61.     Delay(5);
  62.    }
  63. }
  64.   void DS18B20_Delay(uint i)//微妙級延時函數
  65. {
  66.    while(i--);
  67. }
  68. //  void FengNingQi_Alarm()//蜂鳴器報警函數
  69. //{
  70. //   uint x;
  71. //   uint y;
  72. //   uint t;
  73. //   for(x=0;x<t;x++)
  74. //  {
  75. //    for(y=0;y<50;y++);
  76. //    FengNingQi=~FengNingQi;//蜂鳴器按位取反FengNingQi
  77. //   }
  78. // }
  79.   bit DS18B20Init()//DS18B20初始化函數
  80. {
  81.    uchar x=0;
  82.    DQ = 1;//單片機將DS18B20通信端口DQ拉高復位  
  83.    DS18B20_Delay(8);//稍做延時
  84.    DQ = 0;//單片機將DS18B20通信端口DQ拉低
  85.    DS18B20_Delay(80);//延時在480us與960us之間
  86.    DQ = 1;//單片機將DS18B20通信端口DQ拉高
  87.    DS18B20_Delay(4);//延時在15us與60us之間
  88.    x=DQ;//稍做延時后,如果x=0,則初始化成功,若x=1則初始化失敗。
  89.    DS18B20_Delay(20);//延時在60us與240us之間
  90.    return x;
  91. }
  92.   void DS18B20_WriteOneByte(uchar j)//DS18b20寫一個字節函數
  93. {
  94.    uchar i=0;
  95.    for (i=8; i>0; i--)//單片機向DS18B20寫入數據
  96.   {
  97.     DQ = 0;//單片機將DS18B20通信端口DQ從高電平拉至低電平時,單片機向DS18B20寫數據開始。
  98.     DQ = j&0x01;//單片機按將字節低位寫入DS18B20
  99.     DS18B20_Delay(5);//延時在60us與120us之間
  100.     DQ = 1;//單片機將DS18B20通信端口DQ拉高
  101.     j>>=1;//變量j右移一位,最高位補零。例如當j=1,換成二進制是0000 0001,右移一位就是0000 000。擴展:單片機無符號或有符號數左移幾位,高位就依次補幾位0,低位也依次去掉幾位,讓左移幾位依次代替低位去掉的幾位。單片機有符號數,如果是正數,右移幾位,先是確定最高位用0,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位,如果是負數,右移幾位,先是確定最高位用1,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位。      
  102.    }
  103. }
  104.   uchar DS18B20_ReadOneByte()//DS18B20讀一個字節函數
  105. {
  106.    uchar i=0;
  107.    uchar j = 0;
  108.    for (i=8;i>0;i--)//單片機讀取DS18B20采集的溫度數據轉換成一個字節
  109.   {
  110.     DQ = 0;//單片機將DS18B20通信端口DQ從高電平拉成低電平時,單片機讀取DS18B20所采集到溫度數據開始。
  111.     j>>=1;//變量j右移一位,最高位補零。例如當j=1,換成二進制是0000 0001,右移一位就是0000 000。擴展:單片機無符號或有符號數左移幾位,高位就依次補幾位0,低位也依次去掉幾位,讓左移幾位依次代替低位去掉的幾位。單片機有符號數,如果是正數,右移幾位,先是確定最高位用0,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位,如果是負數,右移幾位,先是確定最高位用1,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位。
  112.     DQ = 1;//單片機將DS18B20通信端口DQ拉高
  113.     if(DQ)//判斷DQ是否等于1
  114.     j|=0x80;//若DQ=1,則讓當前j最高位為1,在下次循環中移位至次高位,最后達到從低位到高位接收的目的;若DQ=0,則可跳過此語句,直接在下次循環對byte進行移位補0。  
  115.     DS18B20_Delay(4);//稍做延時
  116.   }
  117.    return j;
  118. }
  119.   uint DS18B20_ReadTemperature()//單片機讀取DS18b20當前溫度
  120. {
  121.    uchar L=0;//定義溫度值低8位變量
  122.    uchar H=0;//定義溫度值高8位變量   
  123.    DS18B20Init( );//DS18B20初始化函數
  124.    DS18B20_WriteOneByte(0xcc);//單片機只連一個DS18B20溫度傳感器時,可寫該段代碼,表示單片機向DS18B20寫入跳過讀DS18B20序號列號指令。
  125.    DS18B20_WriteOneByte(0x44);//單片機向DS18B20九字節暫存器(包括兩個字節儲溫溫度寄存器、一字節高溫觸發器、一字節低溫觸發器、一字節溫度精度轉換配置寄存器、三個字節的保留位、一字節DS18B20的64位ROM前56位編碼校驗CRC發生器)中前兩個字節溫度寄存器寫入啟動DS18B20溫度轉換指令
  126. // DS18B20_Delay(100);//稍作延時
  127.    DS18B20Init( );//DS18B20初始化函數
  128.    DS18B20_WriteOneByte(0xcc);//單片機只連一個DS18B20溫度傳感器時,可寫該段代碼,表示單片機向DS18B20寫入跳過讀DS18B20序號列號指令。
  129.    DS18B20_WriteOneByte(0xbe);//單片機向DS18B20九字節暫存器(包括兩個字節儲溫溫度寄存器、一字節高溫觸發器、一字節低溫觸發器、一字節溫度精度轉換配置寄存器、三個字節的保留位、一字節DS18B20的64位ROM前56位編碼校驗CRC發生器)中前兩個字節溫度寄存器寫入讀取溫度的指令
  130. // DS18B20_Delay(100);//稍作延時
  131.    L=DS18B20_ReadOneByte( );//單片機向DS18B20發送讀取溫度值低8位指令,把讀到的溫度值低8位賦給溫度值低8位變量
  132.    H=DS18B20_ReadOneByte( );//單片機向DS18B20發送讀取溫度值高8位指令,把讀到的溫度值高8位賦給溫度值高8位變量
  133.    temperature = H;//DS18B20讀到的溫度值高8位賦給溫度值變量,變成高8位溫度值變量,還不是一個溫度值變量,由于一個溫度值變量是由高8位低8位共16位組成。
  134.    temperature = temperature << 8;//溫度值高8位變量左移8位,就可以變成一個只有高8位低8位全0的溫度值變量。
  135.    temperature = temperature | L;//只有高8位低8位全0的溫度值變量與溫度值低8位變量或運算后就變成一個真正有高8位低8位共16位的溫度值變量
  136.    if(temperature>0x0fff)//判斷表示溫度寄存器16位二進制數的溫度值變量是否大于表示溫度寄存器16位二進制數的正溫度值,假若大于且當表示溫度寄存器16位二進制數的溫度值變量的前5位二進制數全為1時,該溫度值變量表示負溫度值。
  137.   {
  138.     temperature = ~temperature+2;//負溫度值
  139.     temperatureflag=1;//負溫度標志變量等于1
  140.    }
  141.    else
  142.   {      
  143.     temperatureflag=0;//負溫度標志變量等于0
  144.    }
  145.    temperature = temperature*0.0625*10;//擴大10倍的溫度值
  146.    return temperature;//返回擴大10倍的溫度值
  147.      
  148. }
  149.   void TemperatureFenJie()//LCD1602的溫度顯示函數   
  150. {
  151.    wendu=DS18B20_ReadTemperature();//DS18B20讀到的溫度值賦給溫度值變量
  152.    if(temperatureflag==1)//判斷負溫度標志變量是否等于1
  153.   {   
  154.     fuhaowei=0x2d;//負符號
  155.     wendubai=wendu/1000;//溫度值百位
  156.     wendushi=wendu%1000/100;//溫度值十位
  157.     wenduge=wendu%100/10;//溫度值個位
  158.     xiaoshudian=0x2e;//小數點
  159.     xiaoshu=wendu%10;//小數位
  160.    }
  161.    else
  162.   {
  163.     fuhaowei=0x2b;//正符號
  164.     if(wendu==0)//判斷溫度是否等于0
  165.    {
  166.      fuhaowei=0x20;//無符號
  167.     }
  168.     wendubai=wendu/1000;//溫度值百位
  169.     wendushi=wendu%1000/100;//溫度值十位
  170.     wenduge=wendu%100/10;//溫度值個位
  171.     xiaoshudian=0x2e;//小數點
  172.     xiaoshu=wendu%10;//小數位
  173.    }         
  174. }
  175.   void TemperatureDisplay()//LCD1602的溫度顯示函數   
  176. {
  177.    WriteCommand(0x80+0x40);//LCD1602字符型液晶顯示器第二行第九個(從第零開始數)顯示位
  178.    WriteData(fuhaowei);//符號位顯示。
  179.    WriteData(0x30+wendubai);//0x30表示字符庫的數字0,整個代碼表示溫度值百位可顯示0到9的數字。
  180.    WriteData(0x30+wendushi);//0x30表示字符庫的數字0,整個代碼表示溫度值十位可顯示0到9的數字。
  181.    WriteData(0x30+wenduge);//0x30表示字符庫的數字0,整個代碼表示溫度值個位可顯示0到9的數字。
  182.    WriteData(xiaoshudian);//小數點
  183.    WriteData(0x30+xiaoshu);//0x30表示字符庫的數字0,整個代碼表示小數位可顯示0到9的數字。
  184.    WriteData(0xdf);//0xdf表示字符庫中攝氏度左上角的符號   
  185.    WriteData(0x43);//0x43表示字符庫中大寫字母C
  186. }
  187.   void main()                                 //主函數
  188. {
  189.    uchar num;
  190.    LCD1602Init();//LCD1602字符型液晶顯示器初始化函數
  191.    LCD1602Display();//LCD1602字符型液晶顯示器顯示函數
  192.    Delay(500);
  193.    WriteCommand(0x01);          //清除LCD1602顯示的內容
  194.    DS18B20Init();//DS18B20初始化函數
  195.    while(1)
  196. {
  197.     WriteCommand(0x80+0x00);//把LCD1602寫進來的字符顯示地址設為從0x80H(即00H)的上排第一位開始寫
  198.     for(num=0;num<15;num++)//將table2[]中的字符依次寫入LCD1602的第一排
  199.    {
  200.      WriteData(table2[num]);
  201.      Delay(5);
  202.     }
  203.     TemperatureFenJie();//溫度分解函數
  204.     TemperatureDisplay();//溫度顯示函數
  205.   }
  206. }
復制代碼
圖片113.png
圖片114.png

圖片115.png

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表