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項目使用的內部時鐘并不精確? ? ? ? ? ? 
發表于 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的神秘面紗。回到
發表于 2020-09-08
開發板上有4個按鍵,我們可以把每一個按鍵連接到一個單片機引腳上,來實現按鍵狀態的檢測。但是常見的鍵盤有104鍵,是每一個鍵分別連接到一個引腳上的嗎?我沒有考證過,但我們確實有節省引腳的方法。矩陣鍵盤這是一個4*4的矩陣鍵盤,共有16個按鍵只需要8個引腳就可以驅動。我們先來看看它的原理。每個按鍵有兩個引腳,當按鍵按下時接通。每一行的一個引腳接在一起,分別連接到左邊4個端口,稱為“行引腳”;每一列的另一個引腳接在一起,分別連接到右邊的4個端口,稱為“列引腳”。這就是矩陣鍵盤內部的電路連接方式。那么如何驅動它呢?首先我們簡化一下,只考慮第一排:這樣就很簡單了吧,只要讓行引腳保持低電平,4個列引腳設置為輸入并開啟上拉電阻,讀到低電平
發表于 2020-09-08
總結
以上是生活随笔為你收集整理的ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言仓库管理系统链表,仓库管理系统 C
- 下一篇: Linux 查看显存带宽,Vega 20