日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...

發布時間:2024/4/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

***************************************************/

#include #include #define uchar unsigned char

#define uint? unsigned int

#include "1602LCD_drive.h"???//包含LCD驅動程序軟件包

#include "DS18B20_drive.h"???//DS18B20驅動程序軟件包

#define beep_0? (PORTD=PORTD&0xbf) ?//PD6上的蜂鳴器發聲

#define beep_1? (PORTD=PORTD|0x40) ?//PD6上的蜂鳴器不發聲

uchar? temp_flag ;???//判斷DS18B20是否正常標志位,正常時為1,不正常時為0

uchar? temp_comp;???//用來存放測量溫度的整數部分

uchar disp_buf[8]={0};???//顯示緩沖

uchar? temp_data[2] = {0x00,0x00};??//用來存放溫度數據的高位和低位

uchar?? line1_data[] = "?? DS18B20 OK?? ";? ?//DS18B20正常時第1行顯示的信息

uchar?? line2_data[] = " TEMP:????????? "; ?//DS18B20正常時第2行顯示的信息

uchar?? menu1_error[] = "?? DS18B20 ERR? ";? //DS18B20出錯時第1行顯示的信息

uchar?? menu2_error[] = " TEMP: ----???? "; ?//DS18B20出錯時第2行顯示的信息

/********以下是函數聲明,由于本例采用的函數較多,應加入函數聲明部分********/

void port_init(void);

void? TempDisp(void);???//溫度值顯示函數聲明

void? beep(void);????//蜂鳴器響一聲函數聲明

void? MenuError(void);???//DS18B20出錯菜單函數聲明

void? MenuOk(void);????//DS18B20正常菜單函數聲明

void GetTemperture(void);???//讀取溫度值函數聲明

void TempConv(void);????//溫度值轉換函數聲明

/********端口設置函數********/

void port_init(void)

{

PORTA = 0xFF;???//輸出高電平

DDRA? = 0xFF;??//設為輸出

PORTC = 0xff; ??//輸出高電平

DDRC? = 0xFF; ??//設為輸出

//DDRD =(1<

DDRD =(0<

PORTD = 0xFF;

PORTB=0xff;

}

/*********蜂鳴器響一聲函數********/

void? beep()

{

uint bb;

for(bb=0;bb<10;bb++)

{

beep_0;?????? ??//蜂鳴器響

Delay_ms(100);

beep_1;?????????? ?//關閉蜂鳴器

Delay_ms(100);

}

}

/********溫度值顯示函數,負責將測量溫度值顯示在LCD上********/

void? TempDisp()

{

LocateXY(6,1);?? ?????//從第1行第6列開始顯示溫度值

lcd_wdat(disp_buf[3]);????? ??//百位數顯示

lcd_wdat(disp_buf[2]);????? ?//十位數顯示

lcd_wdat(disp_buf[1]);????? ?//個位數顯示

lcd_wdat('.');??????????? ?//顯示小數點

lcd_wdat(disp_buf[0]);????? ?//小數位數顯示

lcd_wdat(0xdf);??????????? ?//0xdf是圓圈°的代碼,以便和下面的C配合成溫度符號℃

lcd_wdat('C');???????????? ?//顯示C

}

/********DS18B20正常時的菜單函數********/

void? MenuOk()

{

LCD_write_str(0,0,line1_data);?//在第0行的第0列顯示"?? DS18B20 OK?? "

LCD_write_str(0,1,line2_data);?//在第1行的第0列顯示" TEMP:????????? "

}

/********DS18B20出錯時的菜單函數********/

void? MenuError()

{

lcd_clr();?????//LCD清屏

LCD_write_str(0,0,menu1_error);?//在第0行的第0列顯示"?? DS18B20 ERR?? "

LCD_write_str(0,1,menu2_error);?//在第1行的第0列顯示" TEMP:????????? "

LocateXY(11,1);?????//從第1行第11列開始顯示

lcd_wdat(0xdf);??????????? ??//0xdf是圓圈°的代碼,以便和下面的C配合成溫度符號℃

lcd_wdat('C');???????????? ??//顯示C

}

/********讀取溫度值函數********/

void GetTemperture(void)

{

SREG=0x00;????????????????????? //禁止全局中斷;???????????????????? ??//關中斷,防止讀數錯誤

Init_DS18B20();????//DS18B20初始化

if(yes0==0) ?????// yes0為Init_DS18B20函數的返回值,若yes0為0,說明DS18B20正常

{

WriteOneByte(0xCC);? ??// 跳過讀序號列號的操作

WriteOneByte(0x44);? ??// 啟動溫度轉換

Delay_ms(1000);????//延時1s,等待轉換結束

Init_DS18B20();

WriteOneByte(0xCC);? ??//跳過讀序號列號的操作

WriteOneByte(0xBE);? ??//讀取溫度寄存器

temp_data[0] = ReadOneByte();? ?//溫度低8位

temp_data[1] = ReadOneByte();? ?//溫度高8位

//temp_TH = ReadOneByte();? ?//溫度報警TH

//temp_TL = ReadOneByte();? ?//溫度報警TL

temp_flag=1;

}

else temp_flag=0;????//否則,出錯標志置0

SREG=0x80;????????????????????? //溫度數據讀取完成后再開中斷

}

/********溫度數據轉換函數,將溫度數據轉換為適合LCD顯示的數據********/

void TempConv()

{

uchar sign=0;??????//定義符號標志位

uchar? temp;?????//定義溫度數據暫存

if(temp_data[1]>127)????????????????? ?//大于127即高4位為全1,即溫度為負值

{

temp_data[0]=(~temp_data[0])+1;???? ?//取反加1,將補碼變成原碼

if((~temp_data[0])>=0xff)???//若大于或等于0xff

temp_data[1]=(~temp_data[1])+1;?//取反加1

else temp_data[1]=~temp_data[1];?//否則只取反

sign=1;?????//置符號標志位為1

}

temp =temp_data[0]&0x0f;????//取小數位

disp_buf[0]=(temp *10/16)+0x30;???//將小數部分變換為ascii碼

temp_comp =((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//取溫度整數部分

disp_buf[3]= temp_comp /100+0x30;??//百位部分變換為ascii碼

temp = temp_comp%100;????//十位和個位部分

disp_buf[2]= temp /10+0x30;???//分離出十位并變換為ascii碼

disp_buf[1]= temp %10+0x30;???//分離出個位并變換為ascii碼

if(disp_buf[3]==0x30)??????? ???//百位ascii碼為0x30(即數字0),不顯示

{

disp_buf[3]=0x20;????????????? ?//0x20為空字符碼,即什么也不顯示

if(disp_buf[2]==0x30)?????? ??//十位為0,不顯示

disp_buf[2]=0x20;

}

if(sign) disp_buf[3]=0x2d;??????????? ?//如果符號標志位為1,則顯示負號(0x2d為負號的字符碼)

}

/********主函數********/

void main(void)

{

port_init();

PortDS18B20_Init();

lcd_init();? ????//初始化LCD

lcd_clr();????//LCD清屏

while(1)

{

GetTemperture();??//讀取溫度數據

if(temp_flag==0)

{

beep();??? ??//若DS18B20不正常,蜂鳴器報警

MenuError();??//顯示出錯信息函數

}

if(temp_flag==1)??//若DS18B20正常,則往下執行

{

TempConv();????//將溫度轉換為適合LCD顯示的數據

MenuOk();????//顯示溫度值菜單

TempDisp();????//調用LCD顯示函數

}

}

}

關注eeworld公眾號

快捷獲取更多信息

關注eeworld服務號

享受更多官方福利

推薦閱讀

AVR單片機需要設置合適的熔絲位才能實現其功能,如果熔絲位設置的不對將有可能導致單片機自鎖,這是我整理的AVR單片機熔絲位的設置及拯救方,希望對大家有幫助。

發表于 2020-09-17

單片機源程序如下:/***版權所有(c)2018,艁ukasz Marcin Podkalicki*2009年12月13日? ? ? ? ? ??*簡單定時器(啟動/復位/停止),使用基于TM1637的一個按鈕和7段顯示模塊。? ? ? ? ? ? ? *? ? ? ? ? ??*注意,這個ATtiny13項目使用的內部時鐘并不精確? ? ? ? ? ?&nbsp

發表于 2020-09-16

為0到9,分別表示LED的占空比為0/9到9/9。比如,當占空比為4/9時,在9毫秒的周期中,前4毫秒LED亮,后5毫秒LED不亮。可以看見,占空比越大,LED亮度也越高。原來,在亮與暗之間,LED還有中間的狀態。我們不是通過讓引腳輸出一個0V和5V之間的電壓,而是讓引腳電平迅速地在高低之間變化來實現的。這種通過電平的快速跳變來實現模擬量效果的技術,稱為脈沖寬度調制,簡稱PWM。定時器大多數單片機的定時器都可以輸出PWM波,外設豐富的AVR單片機自然不例外。上一講提到定時器0有四種工作模式,后兩種就是快速PWM模式與相位修正PWM模式。在快速PWM模式中,TCNT0寄存器的動作與普通模式相同,但還可以把OCR0A作為上限。對于非反轉輸出

發表于 2020-09-09

7)接到一個單片機引腳上。關于為什么會有這種詭異的接法,這是設計時的失誤(也可能是不得已吧,畢竟單片機的32個IO已經占滿了),參見:一個低電平引發的思考。協議1602與單片機之間是通過并行總線通信的。AVR單片機硬件上不支持并行總線,需要通過軟件模擬時序來實現。寫操作的時序如下:進行一個寫操作,需要先讓RS根據寫的類型設置電平,R/W輸出低電平,D0~D7輸出要發送的數據,然后在E的上升沿數據被對方讀取,并保持R/W與D0~D7電平不變,直到E的下降沿之后。兩次E的上升沿之間至少需要400us時間間隔。1602共有8條指令,都是一字節長度的。從高位到低位,每一條指令都由若干個0、一個1和有效指令組成,使得沒有兩條指令會有相同的二進制

發表于 2020-09-09

在第一期中,我們已經開始使用UART來實現單片機開發板與計算機之間的通信,但只是簡單地講了講一些概念和庫函數的使用。在這一篇教程中,我們將從硬件與軟件等各方面更深入地了解UART。USART組件一直在講的UART其實是USART組件的一部分,USART比UART多了同步的一部分,但這一部分用得太少(我從來沒用過),而且缺乏實例,所以就略過了。然而,單片機的設計者很機智地把這個雞肋功能升華了一下,USART組件可以支持SPI模式。SPI是一種同步串行總線,可以支持很高的傳輸速率。這個功能使得ATmega324PA支持最多3個SPI通道,其中一個是純SPI,另兩個就是SPI模式下的USART。我們將在下一講中揭開SPI的神秘面紗?;氐?/p>

發表于 2020-09-08

開發板上有4個按鍵,我們可以把每一個按鍵連接到一個單片機引腳上,來實現按鍵狀態的檢測。但是常見的鍵盤有104鍵,是每一個鍵分別連接到一個引腳上的嗎?我沒有考證過,但我們確實有節省引腳的方法。矩陣鍵盤這是一個4*4的矩陣鍵盤,共有16個按鍵只需要8個引腳就可以驅動。我們先來看看它的原理。每個按鍵有兩個引腳,當按鍵按下時接通。每一行的一個引腳接在一起,分別連接到左邊4個端口,稱為“行引腳”;每一列的另一個引腳接在一起,分別連接到右邊的4個端口,稱為“列引腳”。這就是矩陣鍵盤內部的電路連接方式。那么如何驅動它呢?首先我們簡化一下,只考慮第一排:這樣就很簡單了吧,只要讓行引腳保持低電平,4個列引腳設置為輸入并開啟上拉電阻,讀到低電平

發表于 2020-09-08

總結

以上是生活随笔為你收集整理的ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。