久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4184|回復: 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


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美6一10sex性hd | 污视频免费在线观看 | 免费在线观看一区二区三区 | 丝袜美腿一区 | 久久伊人影院 | 日韩色视频 | 中文字幕高清一区 | 美女国内精品自产拍在线播放 | 亚洲国产精品美女 | 久久久国产一区二区三区四区小说 | 在线电影日韩 | 亚洲精品区| 国产精品欧美一区二区三区不卡 | 精品一区二区三区免费毛片 | 久久久久国产精品一区二区 | 日本在线观看网址 | 国产精品揄拍一区二区久久国内亚洲精 | av一级毛片 | 久久久精彩视频 | www.中文字幕av | 国产美女在线观看 | 国产精品视频久久 | 在线日韩中文字幕 | 成人在线视频免费观看 | 岛国视频 | 欧洲精品码一区二区三区免费看 | 国产在线1区| 亚洲欧洲在线看 | www日韩高清 | 欧美视频福利 | 国产精品久久久久av | 成人欧美一区二区三区黑人孕妇 | 久久成人精品视频 | 精品国产欧美在线 | 精品视频99 | 国产精品视频一区二区三区不卡 | 成人欧美一区二区三区在线观看 | 久久中文字幕一区 | 婷婷色网| 亚洲精品在线观 | 女人夜夜春 |