基于单片机应用AVR 18B20程序编写

#include//包含型号头文件#include//包含“位”操作头文件#include//标准输入输出头文件#include//包含自定义常量头文件#include“smg.c”//包含数码管显示函数/*****************************************
#include//包含型号头文件
#include//包含“位”操作头文件
#include//标准输入输出头文件
#include《avr_pq1a.h》//包含自定义常量头文件
#include“smg.c”//包含数码管显示函数
/*******************************************
函数名称:b20_init
功能:复位ds18b20
参数:无
返回值:无
/********************************************/
voidb20_init(void)
{
ddra|=bit(ds18b20);//配置为输出
porta|=bit(ds18b20);
delayus(10);
porta&=~bit(ds18b20);//拉低
delayus(750);//等待600微秒
porta|=bit(ds18b20);//释放总线
delayus(60);//等待60微秒
ddra&=~bit(ds18b20);//配置为输入
while((pina&(bit(ds18b20))));//等待ds18b20拉低
while(!(pina&(bit(ds18b20))));//等待ds18b20释放总线
}
/*******************************************
函数名称:b20_readb
功能:读取一个字节的数据
参数:无
返回值:retd--返回的一个字节数据
/********************************************/
ucharb20_readb(void)
{
uchari,retd=0;
for(i=0;i《8;i++)//位计数值
{
retd》》=1;//右移,准备接受新的数据位
ddra|=bit(ds18b20);//配置为输出
porta&=~bit(ds18b20);//拉低,启动读数据位
porta|=bit(ds18b20);//释放总线
delayus(5);//等待5微秒
ddra&=~bit(ds18b20);//配置为输入,开始读取数据位
if(pina&bit(ds18b20))//该位是否为高
{
retd|=0x80;//是就将此位置高
}
delayus(50);//等待50微秒
}
returnretd;//将读到的一个字节返回
}
/*******************************************
函数名称:b20_writeb
功能:写入一个字节的数据
参数:wrd--要写入的数据
返回值:无
/********************************************/
voidb20_writeb(ucharwrd)
{
uchari;
for(i=0;i《8;i++)//位计数值
{
ddra|=bit(ds18b20);//配置为输出
porta&=~bit(ds18b20);//拉低,启动写数据位
delayus(1);//等待1微秒
if(wrd&0x01)//此位数据是否为高
{
porta|=bit(ds18b20);//是高则将单总线拉高
}
else
{
porta&=~bit(ds18b20);//是低则将单总线拉低
}
delayus(50);//等待50微秒
porta|=bit(ds18b20);//释放总线
wrd》》=1;//右移,为写入新的数据位做准备
}
delayus(50);//等待50微秒
}
/*******************************************
函数名称:read_temp
功能:读取温度值
参数:无
返回值:rettemp--返回的温度值
/********************************************/
uintread_temp(void)
{
uchartempl,temph;
uinttemp;
b20_init();//初始化,每次写命令都从初始化开始
b20_writeb(0xcc);//跳过rom
b20_writeb(0x44);//启动温度转换
b20_init();//初始化,每次写命令都从初始化开始
b20_writeb(0xcc);//跳过rom
b20_writeb(0xbe);//读寄存器
templ=b20_readb();//读温度低字节
temph=b20_readb();//读温度高字节
temp=templ+temph*256;//将温度整理成16位变量
returntemp;//返回16位变量
}
/*******************************************
函数名称:num_bcd
功能:将一个字节的整数转换成三位bcd码
参数:num--需要转换的整数
返回值:chr--三位bcd码数组指针
/********************************************/
uchar*num_bcd(uintnum)
{
uchari,chr[3];
uchar*rept;
rept=&(chr[0]);//返回指针指向bcd码数组
for(i=0;i《3;i++)
{
chr[2-i]=num%10;//对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
num/=10;//除以10,为取出下一位做准备
}
returnrept;//返回指针
}
/*******************************************
函数名称:main
功能:完成温度的读取与显示
参数:无
返回值:无
/********************************************/
voidmain(void)
{
uintt;
uchar*temppt;
uchari,temp[3];
board_init();//初始化开发板
while(1)
{
t=read_temp();//读取温度值
t*=0.625;//转换成实际温度的10倍
while(t==850)
{
t=read_temp();//读取温度值
t*=0.625;
}
temppt=num_bcd(t);//将实际温度的10倍转换成bcd码
for(i=0;i《3;i++)//将转换后的bcd码存入显示数组
{
temp[i]=*(temppt+i);
}
for(i=0;i《3;i++)//显示温度
{
if(i==1)
{
temp[1]+=16;//如果是各位,则加上小数点(数码管的译码数组有所改变,读者可以看10_ds18b20文件夹下的smg.c文件)
}
one_smg_display(temp[i],i+1);
delayms(5);
}
}
}

需求动能不足 电视面板Q2出货年衰退7.1%
直线电机激光打标加工硅胶奶瓶
人工智能影响着自闭症服务业务的运营方案
五大两网企业负责人年度薪酬情况披露
罗永浩微博变活跃, 知情人士确认锤子要发新机
基于单片机应用AVR 18B20程序编写
受小间距拉动 LED显示屏将获得重要的增长动力
腾讯开源首个3D医疗影像大数据预训练模型
一名90后程序员的工作经历
简易计时器的制作
几种二极管的检测方法(桥堆,硅堆,变阻,肖特基二极管)
热敏干簧继电器的特点 热敏干簧继电器的选型
如何避免Zigbee与Wifi的信道重叠
万德2000光绘软件操作说明(二)
华为轮值董事长郭平:华为2018年营收将达1085亿美元 5G商用合同达到26个
iPhone12 Pro销售不如iPhone12 Pro Max火爆?
光纤HDMI高清线在4k长距离传输中的优势
GTC23 | NVIDIA 发布用于加速量子-经典混合计算的全新系统
从8K到4K,海信CES正式发布全世界首台双色4K激光电视
在美国火爆的物联网通信技术RPMA正式登录中国