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

QQ登錄

只需一步,快速開(kāi)始

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

AVR 學(xué)習(xí) ATMEGA16 測(cè)溫DS18B20 如何在PD5口添加蜂鳴器,求指教嗎???

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102167 發(fā)表于 2016-1-6 22:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<iom16v.h>  
#define uchar unsigned char  
這個(gè)的意思就是預(yù)定義 uchar unsigned char 的一個(gè)代名詞
以后使用uchar就可以代替unsigned char來(lái)聲明了。
#define uint unsigned int  
#define rs_h (PORTB|=0x01)      //  |逐位“或”
#define rs_l (PORTB&=0xfe)       //  & 逐位“與”
#define rs_o (DDRB|=0x01)      
#define rw_h (PORTB|=0x02)  
#define rw_l (PORTB&=0xfd)  
#define rw_o (DDRB|=0x02)  
#define en_h (PORTB|=0x04)   
#define en_l (PORTB&=0xfb)  
#define en_o (DDRB|=0x04)  
#define temp_h (PORTB|=0x08)   
#define temp_l (PORTB&=0xf7)   
#define LCD PORTA   
#define tmp (PINB&0x08)  
#define temp_o (DDRB|=0x08)  
#define temp_i (DDRB&=0xf7)  
uchar dat1,dat2;//保存讀出的溫度  
#define led_o (DDRB|=0x10)  
#define led_l (PORTB&=0xef)  
#define led_h (PORTB|=0x10)  
unsigned long int dat=0;  
uchar flag=0;  
void delayms(uint z)      //8M晶振下,延時(shí)1ms  
{  
uintx,y;  
for(x=z;x>0;x--)  
                 for(y=1333;y>0;y--);  
}  
void Ds18b20_reset(void)//DS18B20初始化  
{  
   uint count;  
   uint i=60000;  
   temp_o;  
   temp_l;  
   for(count=700;count>0;count--);//延時(shí)480us  
   temp_h;  
   temp_i;//不須配置PORT內(nèi)部上拉電阻,MCU輸入輸出自動(dòng)切換  
   while((tmp==0x08));//&&(i>0)) i--;  
   led_o;  
   led_l;//開(kāi)指示燈  
   for(count=700;count>0;count--);//延時(shí)480us  
}  
void Ds18b20_write(uchar dat)//DS18B20寫(xiě)一個(gè)字節(jié)  
{  
   uchar count;  
   uchar i;  
   temp_o;  
   for(i=8;i>0;i--)  
   {  
       temp_l;  
       for(count=2;count>0;count--);  
       //temp_h;//不能有此語(yǔ)句  
       if(dat&0x01==0x01)  
           temp_h;  
       else  
           temp_l;  
       for(count=120;count>0;count--);//延時(shí)60us  
       temp_h;  
       dat>>=1;   
   }     
}  
uchar Ds18b20_read(void)//DS18B20讀一個(gè)字節(jié)  
{  
   uchar i,datt;  
   uchar count;  
   for(i=8;i>0;i--)  
   {  
       datt>>=1;  
       temp_o;  
       temp_l;  
       for(count=2;count>0;count--);  
       temp_h;//此語(yǔ)句必須有,參考datasheetP15  
       for(count=1;count>0;count--);  
       temp_i;  
       if(tmp==0x08)  
           datt|=0x80;  
       for(count=120;count>0;count--);   
   }  
   return datt;  
}  
void lcd_com(uchar com)//LCD1602寫(xiě)命令  
{  
   rs_o;  
   rw_o;  
   en_o;  
   DDRA=0xff;  
   rs_l;  
    rw_l;  
   LCD=com;  
   delayms(1);  
   en_h;  
   delayms(1);   
   en_l;  
}  
void lcd_dat(uchar dat)//LCD1602寫(xiě)數(shù)據(jù)  
{  
   rs_o;  
   rw_o;  
   DDRA=0xff;  
   en_o;  
   rs_h;  
   rw_l;  
   LCD=dat;  
   delayms(1);  
   en_h;  
   delayms(1);  
   en_l;  
}  
void lcd_write(uchar c,uchar r,uchar dat)//LCD1602指定行、指定列、寫(xiě)數(shù)據(jù)  
{  
   lcd_com(0x80+0x40*c+r);  
   lcd_dat(dat);  
   delayms(1);  
}  
void lcd_init(void)//LCD1602初始化,初始化后第一行顯示temperature:,第二行顯示.C  
{  
   DDRA=0xff;  
   DDRB|=0x17;  
   lcd_com(0x38);  
   lcd_com(0x0c);  
   lcd_com(0x06);  
   lcd_write(0,2,0x54);  //顯示T
   lcd_write(0,3,0x65); //E
   lcd_write(0,4,0x6d);  
   lcd_write(0,5,0x70);  
   lcd_write(0,6,0x65);  
   lcd_write(0,7,0x72);  
   lcd_write(0,8,0x61);  
   lcd_write(0,9,0x74);  
   lcd_write(0,10,0x75);  
   lcd_write(0,11,0x72);  
   lcd_write(0,12,0x65);  
   lcd_write(0,13,0x3a);  
   lcd_write(1,11,0xdf);  
   lcd_write(1,12,0x43);  
}  
void show(void)//把溫度值送LCD1602顯示  
{  
   if(dat2>=240)//遺留問(wèn)題,溫度為25時(shí)讀出dat1=144,dat2=1正確,但卻進(jìn)入if(dat2&0xf8==0xf8)分支;  
   {  
       dat=(~(dat2*256+dat1)+1)*(0.0625*10);//取反加一,保留一位小數(shù)  
       flag=1;  
   }  
   else   //正溫度計(jì)算
   {  
       dat=(dat2*256+dat1)*(0.0625*10);  
       flag=0;  
   };  
   if(flag==1)//負(fù)溫度顯示  
   {  
       lcd_write(1,10,0x30+dat%10);  
       lcd_write(1,9,0xa5);  
       lcd_write(1,8,0x30+dat%100/10);  
       lcd_write(1,7,0x30+dat%1000/100);
       lcd_write(1,6,0x30+dat/1000);  
       lcd_write(1,5,0x2d);  
   }  
   if(flag==0)//正溫度顯示  
   {  
       lcd_write(1,10,0x30+dat%10);  
       lcd_write(1,9,0xa5);  
       lcd_write(1,8,0x30+dat%100/10);  
       lcd_write(1,7,0x30+dat%1000/100);
       lcd_write(1,6,0x30+dat/1000);  
       lcd_write(1,5,0x20);//顯示空格,刷掉負(fù)號(hào)  
   }  
}  
void main(void)  
{  
   lcd_init();  
   while(1)  
   {  
       dat1=0x00;  
       dat2=0x00;  
       Ds18b20_reset();  
       Ds18b20_write(0xcc);  
       Ds18b20_write(0x44);//發(fā)送溫度轉(zhuǎn)換命令  
       delayms(1000);//延時(shí)1s,等待溫度轉(zhuǎn)換完成  
       Ds18b20_reset();  
       Ds18b20_write(0xcc);  
       Ds18b20_write(0xbe);//發(fā)送讀溫度寄存器命令  
       dat1=Ds18b20_read();  
       dat2=Ds18b20_read();  
       show();  
       led_h;//關(guān)指示燈  
       delayms(2000);  
   }  
}  
//編譯前一定要在工程選項(xiàng)中設(shè)置好目標(biāo)單片機(jī)型號(hào);  
//輸出送PORT寄存器  
//輸入檢測(cè)PIN寄存器  
http://blog.csdn.net/armtravel/article/details/7525091 這是代碼網(wǎng)址
現(xiàn)在我想在PD5口加一個(gè)蜂鳴器,使溫度顯示20度以上時(shí)報(bào)警,如何添加

file:///c:/users/administrator/appdata/roaming/360se6/User Data/temp/1335809066_4881.jpg


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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