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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5055|回復: 6
打印 上一主題 下一主題
收起左側

懸賞求助!用1602LCD和溫度傳感器DS18B20設計的溫度報警器程序編寫求助!

[復制鏈接]
跳轉到指定樓層
樓主
6黑幣
編寫了程序但是仿真不成功,溫度顯示不正常而且改變不了溫度,三個按鈕的功能均沒反應!求助大神!

以下是仿真不成功的程序:
#include <reg52.h>
#include<intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit RW = P2^1;          //定義LCD的讀、寫選擇端
sbit RS = P2^0;           //定義LCD的數據、命令選擇端
sbit EN = P2^2;                 //定義LCD的使能信號端
sbit DS = P3^3;                 //定義DS18B20的IO口
sbit L=P2^3;                 //綠燈
sbit H=P2^6;                 //紅燈
sbit LS=P3^7;                 //蜂鳴器
sbit k1=P1^1;                 //顯示64位的ROM
sbit k2=P1^7;                 //顯示當前溫度
sbit k3=P1^4;                 //顯示溫度上限及下線,并支持調節
uchar k=2;                         //當前溫度顯示標志位
uchar table0[] = " Current Temp : ";         //當前溫度
uchar table1[] = " -- ROM CODE -- ";         //顯示DS18B20的ROM
uchar table2[] = "ALARM TEMP Hi Lo";         //顯示上下限溫度
uchar table3[] = "Hi:    Lo:      ";
uchar table4[] = {0,0,0,0,0,0,0,0};
uchar tempHL[] = { 20, 1};                                 //上下限溫度的初始值                                                                                   
void delayms(uint a)     //延時函數
{
    uint i,j;
    for(i = a; i > 0; i--) for(j = 100; j > 0; j--);
}
void writecom(uchar com)  //寫地址,也就是顯示的數據的位置
{
        RS = 0;                 
        P0 = com;
        EN = 1;
        delayms(1);
        EN = 0;
}
void writedata(uchar dat) //寫數據,也就是顯示的數據
{
        RS = 1;
        P0 = dat;
        EN = 1;
        delayms(1);
        EN = 0;
}
void init()                   //LCD初始化
{
        RW = 0;
        writecom(0x38);          //16*2顯示,5*7點陣
        writecom(0x0c);
        writecom(0x06);
        writecom(0x01);   //清除LCD的顯示內容
}

void writestring(uchar * str, uchar length)           //寫數據的過度函數。length:長度
{
    uchar i;
    for(i = 0; i < length; i++)
    {
       writedata(str[i]);
     }
}
void delay(uint num)        //延時函數
{
  while( --num );
}

DSinit(void)        //初始化ds1820  
{  
     DS= 1;      //DS復位
     delay(8);    //稍做延時
     DS= 0;      //將DS拉低
     delay(90);   //精確延時 大于 480u
     DS= 1;       //拉高總線
     delay(110);
     DS= 1;

}

uchar read_bit(void)     //讀一位(bit)
{
   uchar i;
   DS= 0;                      //將DS拉低開始讀時間隙
   DS= 1;                         // then return high
   for (i=0; i<3; i++);         // 延時15μs
   return(DS);                         // 返回 DS線上的電平值
}

uchar readbyte()        // 讀一個字節  
{
   uchar i = 0;
   uchar dat = 0;
   for (i=0;i<8;i++)
   {                                  // 讀取字節,每次讀取一個字節
      if(read_bit()) dat|=0x01<<i;           // 然后將其左移
      delay(4);
   }
    return (dat);
}

void write_bit(char bitval)       //寫一位  
{
   DS= 0;                                        // 將DS拉低開始寫時間隙
   if(bitval==1) DS=1;          // 如果寫1,DS返回高電平
   delay(5);                                       // 在時間隙內保持電平值,
   DS= 1;                      // delay函數每次循環延時16μs,因此delay(5) = 104μs
}        

void writebyte(uchar dat)  //寫一個字節
{
  uchar i = 0;
  uchar temp;
   for (i=0; i<8; i++)         // 寫入字節, 每次寫入一位
   {

   temp = dat>>i;                 
   temp &= 0x01;                 
   write_bit(temp);

    }
  delay(5);
}         
void sendchangecmd()           //DS18B20?開始獲取溫度并轉換
{
    DSinit();                         //DS18B20復位
    delayms(1);                       
    writebyte(0xcc);           //寫跳過讀ROM指令
    writebyte(0x44);           //寫溫度轉換指令
}

void sendreadcmd()                   //讀取寄存器中存儲的溫度數據
{
    DSinit();                           //DS18B20復位
    delayms(1);
    writebyte(0xcc);            //寫跳過讀ROM指令
    writebyte(0xbe);            //讀取暫存器的內容
}         

int gettmpvalue()
{
    uint tmpvalue;
    float t;
    uchar low, high;
    sendreadcmd();                   //讀取寄存器中存儲的溫度數據
    low = readbyte();            //讀取低八位
    high = readbyte();           //讀取高八位
    tmpvalue = high;
    tmpvalue <<= 8;                   //高八位左移八位
    tmpvalue |= low;       //兩個字節組合為1個字
    t = tmpvalue * 0.0625 * 100;   //分辨率為0.0625,在此將值擴大100倍
    return t;
}

void display(int v)            //顯示子函數
{
    uchar i;
    uchar datas[] = {0, 0, 0, 0, 0, 0, 0, 0};  //定義緩存數組datas
    uint tmp = abs(v);                                                   //abs是求絕對值函數
    datas[0] = tmp % 10000 / 1000;
    datas[1] = tmp % 1000 / 100;
    datas[2] = tmp % 100 / 10;
    datas[3] = tmp % 10;
        datas[4] = 80;                                                //空格的前30的ASCALL碼
        datas[5] = 175;                                                //溫度符號的前30的ASCALL碼
        datas[6] = 19;                                                //C的前30的ASCALL碼
    writecom(0xc0+3);
    if(v < 0)                                  //當V小于0則輸出負號
    {
        writestring("- ", 2);
    }
    else
    {
       writestring("+ ", 2);          //當V大于0則輸出正號
    }
    for(i = 0; i != 7; i++)
    {
        writedata('0'+datas[i]);   //顯示溫度
        if(i == 1)
        {
           writedata('.');                  //顯示溫度的小數點
        }
    }

}

void Read_RomCord()                   //讀取64位序列碼
{
     unsigned char j;
     DSinit();
     writebyte(0x33);      // 讀序列碼的操作
     for (j = 0; j < 8; j++)
     {
        table4[j] = readbyte();
     }
}

void Disp_RomCode()                           //數據轉換與顯示
{
   uchar j,i;
   writecom(0xc0);         //LCD第二行初始位置
   for(j=0;j<8;j++)
   {
    i=((table4[j]&0xf0)>>4);
    if(i>9)
     { i=i+0x37;}
    else{i=i+0x30;}         
    writedata(i);        //高位數顯示
    i=(table4[j]&0x0f);
    if(i>9)
     {i=i+0x37;}
    else {i=i+0x30;}         
    writedata(i);        //低位數顯示
   }
}

void lcd_display()                 //按鍵掃描
{
  uchar i,m;
  uchar hl[]={0, 0, 0, 0, 0};
  if(k1 == 0) k = 1;
  if(k2 == 0) k = 2;                                                                                                                                                                                          
  if(k3 == 0) k = 3;
  if(tempHL[0]<=gettmpvalue()/100)
  delayms(100),LS=!LS,H=~H;
  else
       LS=1,H=1;
  if(m==1)
  {
          if(tempHL[1]>=gettmpvalue()/100)
          delayms(100),LS=!LS,L=~L;
          else
            LS=1,L=1;
  }
  switch(k)
  {
        case 1:                                                       //顯示64位的ROM
                   writecom(0x01);
                   writecom(0x80);
                   writestring(table1, 16);
                   Read_RomCord();           //讀取64位序列碼
                   Disp_RomCode();                 //顯示64位序列
                   delayms(750);                         //溫度轉換時間需要750ms以上
                   break;
        case 2:                                                 //顯示當前溫度
                   delayms(750);                         //溫度轉換時間需要750ms以上
                   sendchangecmd();
                   writecom(0x01);
                   writecom(0x80);
                   writestring(table0, 16);
                   display(gettmpvalue());
                   break;
        case 3:                                                     //顯示溫度上限及下線,并支持調節
                   writecom(0x80);
                   writestring(table2, 16);
                   writecom(0xC0);
                   writestring(table3, 16);
                   hl[0] = tempHL[0] / 10;
                   hl[1] = tempHL[0] % 10;
                   if(m==1) hl[2] = 80;
                   if(m==0) hl[2] = 128;
                   hl[3] = tempHL[1] / 10;
                   hl[4] = tempHL[1] % 10;
                   writecom(0xC0+4);
                   for(i = 0; i != 2; i++)
                    {
                        writedata('0'+hl[i]);        //顯示上限溫度
                         }
                   writecom(0xC0+11);
                   for(i = 2; i != 5; i++)
                    {
                        writedata('0'+hl[i]);         //顯示下限溫度
                         }
                   break;
  }
}
void main()
{
        sendchangecmd();                        //讀取寄存器中存儲的溫度數據
    init();                                                //LCD初始化
    writecom(0x80);                                //選擇LCD第一行
    writestring(table0, 16);        //顯示當前溫度的英文字母
    while(1)
    {
        lcd_display();                         //掃描按鍵
    }
}


微信圖片_20171212224335.png (38.32 KB, 下載次數: 47)

仿真后的圖片。。。

仿真后的圖片。。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:258566 發表于 2017-12-13 14:35 | 只看該作者
  1. int gettmpvalue(void)
  2. {
  3.         uchar tempL, tempH;
  4.         int sdate;
  5.         bit fg = 0;
  6.         sendchangecmd();
  7.         sendreadcmd();
  8.         tempL = readbyte();        //讀取低八位
  9.         tempH = readbyte();        //讀取高八位
  10.         if (tempH >= 0xf8)
  11.         {  fg=1;
  12.        
  13.                 if (tempL == 0)
  14.                 {   
  15.                         tempH = (~tempH + 1);
  16.                         sdate = tempH * 16;         

  17.                 }
  18.                 else
  19.                 {

  20.                         tempH = ~tempH;
  21.                         tempL = ~tempL + 1;
  22.                         sdate = tempH * 16 + tempL / 16;

  23.                 }
  24.         }
  25.         else
  26.                 sdate = tempH * 16 + tempL / 16;

  27.         if (fg)
  28.                 return -sdate*100;
  29.    else
  30.         return sdate*100;

  31. }
復制代碼

hex.zip (2.21 KB, 下載次數: 47)

新工程1.zip (24.08 KB, 下載次數: 61)






回復

使用道具 舉報

板凳
ID:111634 發表于 2017-12-13 17:04 | 只看該作者
本帖最后由 zl2168 于 2017-12-13 17:07 編輯

實例97  一線式DS18B20測溫
⒈ DS18B20簡介
⑴ 內部組織結構    …
⑵ 操作步驟和操作指令    …
⒉ 電路設計    …
⒊ 程序設計    …
⒋ Keil調試    …
⒌ Proteus仿真    …
Proteus仿真一下,確認有效。
實例97 DS18B20測溫.rar (51.78 KB, 下載次數: 26)

以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。
回復

使用道具 舉報

地板
ID:258271 發表于 2017-12-13 20:18 | 只看該作者

可以提供一下完整的程序代碼嗎哈哈哈!這一段我不知道是加在哪里的呢
回復

使用道具 舉報

5#
ID:258566 發表于 2017-12-14 15:03 | 只看該作者
山不轉水轉 發表于 2017-12-13 20:18
可以提供一下完整的程序代碼嗎哈哈哈!這一段我不知道是加在哪里的呢

就是同名函數,把原函數刪除,替換下。溫度就顯示正常了
回復

使用道具 舉報

6#
ID:437321 發表于 2018-12-1 19:57 來自手機 | 只看該作者
同學,你好,你這程序是錯的啊
回復

使用道具 舉報

7#
ID:437321 發表于 2018-12-1 19:58 來自手機 | 只看該作者
山不轉水轉 發表于 2017-12-13 20:18
**** 作者被禁止或刪除 內容自動屏蔽 ****

同學。你這程序是錯的吧?我運行了一下,錯誤一大推
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 永久av | 欧美一级在线视频 | 亚洲国产精品va在线看黑人 | 国产成人在线播放 | 啪啪精品 | 亚洲久草 | 91一区二区三区在线观看 | 国产高清精品一区二区三区 | 日韩乱码一二三 | 国产精品久久久久久久久久久久久久 | 欧美综合一区二区 | 最新中文字幕在线 | 羞羞午夜| 日韩看片 | 欧美精品久久久久久 | jizz视频| 国产精品亚洲一区二区三区在线 | 久久国产香蕉 | 一色桃子av一区二区 | 一级毛片观看 | 国产亚洲网站 | 国产专区在线 | 三级av在线 | 亚洲欧美一区二区三区情侣bbw | 欧美精品一区三区 | 久久久久久久久久一区二区 | 欧美一二区| 免费精品 | 国产在线一区二区 | 中文字幕在线视频一区二区三区 | 久久久国产一区 | 久精品久久| 日韩在线观看 | 欧美日韩视频网站 | 久久久久国产一区二区三区 | 欧美专区在线 | 欧美网站一区 | 午夜在线影院 | 羞羞涩涩在线观看 | 日韩电影a | 亚洲日日夜夜 |