当前位置:首页 > 单片机 > 单片机
[导读] //DS18b20的C语言驱动程序,三位数码管显示,读取当前环境温度,精度达0.1度,温度范围0-99度//DS18B20详细引脚功能描述1、GND地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下//

//DS18b20的C语言驱动程序,三位数码管显示,读取当前环境温度,精度达0.1度,温度范围0-99度
//DS18B20详细引脚功能描述1、GND地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下
//也可以向器件提供电源;3、VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。
//DS18B20的使用方法。DS18B20采用的是1-Wire总线协议方式

//即在一根数据线实现数据的双向传输
//编译环境AVRStudio4.13/AVRGCC
//系统时钟7.3728MHz,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
//***********************************************************************
//包含文件
//***********************************************************************

#include
#include
#defineF_CPU7372800//单片机主频为7.3728MHz,用于延时子程序
#include
#include
#include
#include//中断信号头文件

//***********************************************************************
//定义变量区
//CH451各个功能命令值,根据需要写入
//***********************************************************************
#defineCH451_RESET0x0201//复位
#defineCH451_LEFT MOV 0x0300//设置移动方式-作移
#defineCH451_LEFTCYC0x0301//设置移动方式-左循
#defineCH451_RIGHT MOV 0x0302//设置移动方式-右移
#defineCH451_RIGHTCYC0x0303//设置移动方式-右循
#defineCH451_SYSOFF0x0400//关显示、键盘、看门狗
#defineCH451_SYSON10x0401//开显示
#defineCH451_SYSON20x0403//开显示、键盘
#defineCH451_SYSON30x0407//开显示、键盘、看门狗功能
#defineCH451_DSP0x0500//设置默认显示方式
#defineCH451_BCD0x0580//设置BCD译码方式
#defineCH451_TWINKLE0x0600//设置闪烁控制
#defineCH451_DIG00x0800//数码管位0显示
#defineCH451_DIG10x0900//数码管位1显示
#defineCH451_DIG20x0a00//数码管位2显示
#defineCH451_DIG30x0b00//数码管位3显示
#defineCH451_DIG40x0c00//数码管位4显示
#defineCH451_DIG50x0d00//数码管位5显示
#defineCH451_DIG60x0e00//数码管位6显示
#defineCH451_DIG70x0f00//数码管位7显示

#defineLED00x0000//数码管位0显示的数据
#defineled10x0000//数码管位0显示的数据;0x0010为不亮
#defineled20x0000//数码管位0显示的数据
#defineled30x0010//数码管位0显示的数据
#defineled40x0010//数码管位0显示的数据
#defineled50x0010//数码管位0显示的数据
#defineled60x0010//数码管位0显示的数据
#defineled70x0010//数码管位0显示的数据

#definedclk0PORTD&=~(1<#definedclk1PORTD|=(1<#definedin0PORTD&=~(1<#definedin1PORTD|=(1<#defineload0PORTD&=~(1<#defineload1PORTD|=(1<
#defineDQ_INDDRC&=~(1<#defineDQ_OUTDDRC|=(1<#defineDQ_CLRPORTC&=~(1<#defineDQ_SETPORTC|=(1<#defineDQ_RPINC&(1<

#definedelay_us(x)_delay_us(x)//AVRGCC延时函数x(us)
#definedelay_ms(x)_delay_ms(x)//AVRGCC延时函数x(ms)

#defineucharunsignedchar
#defineuintunsignedint
uintvalue;
uinttemp,A1,A2,A3;//定义的变量,显示数据处理
ucharflag1;
uchartable[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,
0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,
0x0e,0x0f};//数码管的BCD码


//*************************************************************************
//初始化子程序
//*************************************************************************

voidsystem_init()
{

SFIOR=(1<<2)|SFIOR;//PUD=1;关闭上拉电阻
PORTD=0x70;
DDRD=0x70;

}

voidch451_init()
{
din0;//先低后高,选择4线输入
din1;

}
//*************************************************************************
//输出命令子程序
//定义一无符号整型变量存储12字节的命令字
//************************************************************************
voidch451_write(unsignedintcommand)
{
unsignedchari;
load0;//命令开始
for(i=0;i<12;i++)
{//送入12位数据,低位在前

if(command&1)
{
din1;

}
else
din0;
dclk0;
dclk1;//上升沿有效
command>>=1;
}
load1;//加载数据

}

//*************************************************************************
//显示函数
//*************************************************************************
voiddisplay(uintb_d,uints_d,uintg_d)
{
ch451_init();
ch451_write(CH451_SYSOFF);//关显示、键盘、看门狗
ch451_write(CH451_SYSON1);//开显示
ch451_write(CH451_BCD);//设置BCD译码方式
ch451_write(CH451_TWINKLE);//设置闪烁控制

ch451_write(CH451_DIG0|table[b_d]);//显示百位数据
ch451_write(CH451_DIG1|table[s_d]|0x80);//显示十位数据
ch451_write(CH451_DIG2|table[g_d]);//显示个位数据
ch451_write(CH451_DIG3|led3);//其他数码管不显示,熄灭状态
ch451_write(CH451_DIG4|led4);
ch451_write(CH451_DIG5|led5);
ch451_write(CH451_DIG6|led6);
ch451_write(CH451_DIG7|led7);

}


//*************************************************************************
//DS18B20初始化
//*************************************************************************

unsignedchards1820_reset(void)//初始化和复位

{
unsignedchari;
DQ_OUT;
DQ_CLR;
delay_us(500);//延时500uS(480-960)
DQ_SET;
DQ_IN;
delay_us(80);//延时80uS
i=DQ_R;
delay_us(500);//延时500uS(保持>480uS)

if(i)
{
return0x00;

}
else
{
return0x01;

}

}


//*************************************************************************
//DS18B20读一个字节函数
//*************************************************************************

unsignedchards1820_read_byte(void)
{

unsignedchari;
unsignedcharvalue=0;
for(i=8;i!=0;i--)
{
value>>=1;
DQ_OUT;
DQ_CLR;
delay_us(4);//*延时4uS

DQ_SET;
DQ_IN;
delay_us(10);//*延时10uS

if(DQ_R)
{
value|=0x80;

}
delay_us(60);//*延时60uS

}

return(value);
}

//*************************************************************************
//向18B20写一个字节函数
//*************************************************************************

/*DS18B20字节写入函数*/
voidds1820_write_byte(unsignedcharvalue)
{

unsignedchari;
for(i=8;i!=0;i--)
{
DQ_OUT;
DQ_CLR;
delay_us(4);//延时4uS
if(value&0x01)
{
DQ_SET;

}
delay_us(80);//延时80uS
DQ_SET;//位结束
value>>=1;

}

}
//*************************************************************************
//发送温度转换命令
//*************************************************************************

/*启动ds1820转换*/
voidds1820_start(void){

ds1820_reset();
ds1820_write_byte(0xCC);//勿略地址
ds1820_write_byte(0x44);//启动转换
}

//*************************************************************************
//DS8B20读取温度信息
//*************************************************************************

unsignedintds1820_read_temp(void)
{

unsignedinti;
unsignedcharbuf[9];

ds1820_reset();
ds1820_write_byte(0xCC);//勿略地址
ds1820_write_byte(0xBE);//读取温度
for(i=0;i<9;i++)
{
buf[i]=ds1820_read_byte();

}
i=buf[1];
i<<=8;
i|=buf[0];
value=i;
value=value*0.625;//不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据
//比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275
//然后在显示的时候确定小数点的位置即可,就能显示出27.5度了
//value=value*10;
returni;
}



//*************************************************************************
//温度数据处理函数
//*************************************************************************
voiddata_do(uintd)
{
uintA2t;
A1=d/100;//分出百,十,和个位
A2t=d%100;
A2=A2t/10;
A3=A2t%10;
}

//*************************************************************************
//主程序
//*************************************************************************

voidmain(void)
{

DDRC=0x00;
PORTC=0xFF;
system_init();//系统初始化
delay_ms(250);
ds1820_reset();//复位D18B20
while(1)
{
ds1820_start();//启动一次转换
delay_ms(300);//等待转换结束
ds1820_read_temp();//读取温度数值
data_do(value);//处理数据,得到要显示的值
display(A1,A2,A3);//显示温度值
delay_ms(1000);//延时1S

}
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭