找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3548|回复: 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 单片机教程网

快速回复 返回顶部 返回列表