欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AVR 學習 ATMEGA16 測溫DS18B20 如何在PD5口添加蜂鳴器,求指教嗎???

[復制鏈接]
跳轉到指定樓層
樓主
ID:102167 發表于 2016-1-6 22:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<iom16v.h>  
#define uchar unsigned char  
這個的意思就是預定義 uchar unsigned char 的一個代名詞
以后使用uchar就可以代替unsigned char來聲明了。
#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晶振下,延時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--);//延時480us  
   temp_h;  
   temp_i;//不須配置PORT內部上拉電阻,MCU輸入輸出自動切換  
   while((tmp==0x08));//&&(i>0)) i--;  
   led_o;  
   led_l;//開指示燈  
   for(count=700;count>0;count--);//延時480us  
}  
void Ds18b20_write(uchar dat)//DS18B20寫一個字節  
{  
   uchar count;  
   uchar i;  
   temp_o;  
   for(i=8;i>0;i--)  
   {  
       temp_l;  
       for(count=2;count>0;count--);  
       //temp_h;//不能有此語句  
       if(dat&0x01==0x01)  
           temp_h;  
       else  
           temp_l;  
       for(count=120;count>0;count--);//延時60us  
       temp_h;  
       dat>>=1;   
   }     
}  
uchar Ds18b20_read(void)//DS18B20讀一個字節  
{  
   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;//此語句必須有,參考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寫命令  
{  
   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寫數據  
{  
   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指定行、指定列、寫數據  
{  
   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)//遺留問題,溫度為25時讀出dat1=144,dat2=1正確,但卻進入if(dat2&0xf8==0xf8)分支;  
   {  
       dat=(~(dat2*256+dat1)+1)*(0.0625*10);//取反加一,保留一位小數  
       flag=1;  
   }  
   else   //正溫度計算
   {  
       dat=(dat2*256+dat1)*(0.0625*10);  
       flag=0;  
   };  
   if(flag==1)//負溫度顯示  
   {  
       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);//顯示空格,刷掉負號  
   }  
}  
void main(void)  
{  
   lcd_init();  
   while(1)  
   {  
       dat1=0x00;  
       dat2=0x00;  
       Ds18b20_reset();  
       Ds18b20_write(0xcc);  
       Ds18b20_write(0x44);//發送溫度轉換命令  
       delayms(1000);//延時1s,等待溫度轉換完成  
       Ds18b20_reset();  
       Ds18b20_write(0xcc);  
       Ds18b20_write(0xbe);//發送讀溫度寄存器命令  
       dat1=Ds18b20_read();  
       dat2=Ds18b20_read();  
       show();  
       led_h;//關指示燈  
       delayms(2000);  
   }  
}  
//編譯前一定要在工程選項中設置好目標單片機型號;  
//輸出送PORT寄存器  
//輸入檢測PIN寄存器  
http://blog.csdn.net/armtravel/article/details/7525091 這是代碼網址
現在我想在PD5口加一個蜂鳴器,使溫度顯示20度以上時報警,如何添加

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


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表