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

QQ登錄

只需一步,快速開始

搜索
查看: 3165|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

求大神幫忙解決個(gè)問題 關(guān)于單片機(jī)溫度巡檢的

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:48555 發(fā)表于 2013-4-30 21:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
#include #include #define uchar unsigned char sbit RS=P3^5; //定義LCD端口 sbit RW=P3^6; sbit E=P3^7; sbit DQ=P3^4; //定義單總線端口 uchar LCD_3,LCD_2,LCD_1,LCD_0; uchar ds18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28}; //四個(gè)DS18B20的64位ROM地址 uchar ds18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28}; uchar ds18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28}; uchar ds18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28}; uchar code LCDData[] ="0123456789"; uchar code dot_tab[] ="0112334456678899"; uchar first_line[16]="A:000.0 B:000.0"; //LCD第一行顯示緩存數(shù)組 uchar second_line[16]="C:000.0 D:000.0"; //LCD第二行顯示緩存數(shù)組 //************************************ //延時(shí)程序 //************************************ void delay(unsigned int N) { unsigned int i; for(i=0;i>i; temp=temp&0x01; write_bit(temp); delay(5); } } //************************************* //64位的ROM序列號(hào)匹配 //************************************* bit match_rom(uchar *rom) { uchar i; ds18b20_init(); write_byte(0x55); for(i=8;i>0;i--) { write_byte(*(rom+i-1)); } return 1; } //************************************ //從ds18b20中讀出64位序列號(hào) //************************************ /*uchar * read_rom(void) { uchar rom[8],i; ds18b20_init(); write_byte(0x33); for(i=8;i>0;i--) { rom[i-1]=read_byte(); } return &rom[0]; }*/ //************************************* //將64位序列號(hào)顯示在LCD上顯示出來 //************************************* /*void print_char(uchar a) { if(a>=0&&a<=9) write_data(a+0x30); else if(a>=0x0a &&a<= 0x0f) write_data(a+0x37); }*/ //************************************* //溫度轉(zhuǎn)換,將從ds18b20中讀出來的溫度值 //轉(zhuǎn)化成十進(jìn)制的溫度值,并存放顯示緩存 //************************************* void convert_T(uchar temp_data_h,uchar temp_data_l) { uchar temp; if((temp_data_h&0xf0)==0xf0) //如果溫度寄存器里的高位為1, { //則溫度為負(fù) temp_data_l=~temp_data_l; //負(fù)溫度將補(bǔ)碼轉(zhuǎn)成二進(jìn)制, if(temp_data_l==0xff) //取反再加1 { temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h; temp_data_h=temp_data_h+0x01; } else { temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h; } LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小數(shù)位的值 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4); LCD_3='-'; //顯示"-"號(hào) LCD_2=LCDData[(temp%100)/10]; //查表得負(fù)溫度溫度十位 LCD_1=LCDData[(temp%100)%10]; //查表得負(fù)溫度個(gè)位 } else //溫度為正 { LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小數(shù)位的值 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4); LCD_3=LCDData[temp/100]; //查表得溫度百位 LCD_2=LCDData[(temp%100)/10]; //查表得溫度十位 LCD_1=LCDData[(temp%100)%10]; //查表得溫度個(gè)位 } } void display(void) { uchar i; write_command(0x80); for(i=0;i<16;i++) { write_data(first_line); } write_command(0xc0); for(i=0;i<16;i++) { write_data(second_line); } } void main(void) { uchar temp_data_l,temp_data_h; /*uchar *ds18b20_rom;*/ init_lcd1602(); /*while(1) { uchar i; ds18b20_rom=read_rom(); //讀序列號(hào) write_command(0x80); for(i=0;i<8;i++) { ds18b20_romA=*ds18b20_rom; ds18b20_rom++; } write_command(0x80); for(i=0;i<8;i++) //顯示序列號(hào) { print_char(ds18b20_romA/16); print_char(ds18b20_romA%16); } }*/ while(1) { ds18b20_init(); write_byte(0xcc); write_byte(0x44); //啟動(dòng)溫度轉(zhuǎn)換 delay(700); match_rom(ds18b20_romA); //匹配第一路 write_byte(0xbe); //讀溫度 temp_data_l= read_byte(); //溫度低8位 temp_data_h = read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); first_line[2]=LCD_3; //溫度轉(zhuǎn)換后的各位 first_line[3]=LCD_2; //分別存入顯示緩存數(shù)組中 first_line[4]=LCD_1; first_line[6]=LCD_0; match_rom(ds18b20_romB); //匹配第二路 write_byte(0xbe); //讀溫度 temp_data_l= read_byte(); //溫度低8位 temp_data_h = read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); first_line[10]=LCD_3; //溫度轉(zhuǎn)換后的各位 first_line[11]=LCD_2; //分別存入顯示緩存數(shù)組中 first_line[12]=LCD_1; first_line[14]=LCD_0; display(); match_rom(ds18b20_romC); //匹配第三路 write_byte(0xbe); //讀溫度 temp_data_l= read_byte(); //溫度低8位 temp_data_h = read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); second_line[2]=LCD_3; //溫度轉(zhuǎn)換后的各位 second_line[3]=LCD_2; //分別存入顯示緩存數(shù)組中 second_line[4]=LCD_1; second_line[6]=LCD_0; match_rom(ds18b20_romD); //匹配第四路 write_byte(0xbe); //讀溫度 temp_data_l= read_byte(); //溫度低8位 temp_data_h = read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); second_line[10]=LCD_3; //溫度轉(zhuǎn)換后的各位 second_line[11]=LCD_2; //分別存入顯示緩存數(shù)組中 second_line[12]=LCD_1; second_line[14]=LCD_0; display(); } } 這段程序想加個(gè)報(bào)警系統(tǒng) 初學(xué)者不知道從何下手 希望各位能指導(dǎo)下 報(bào)警由一個(gè)揚(yáng)聲器和2個(gè)LED燈組成
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表