基于ATS及DSB的数码管显示数字温度计C语言程序.docx

上传人:b****1 文档编号:235917 上传时间:2022-10-07 格式:DOCX 页数:5 大小:11.09KB
下载 相关 举报
基于ATS及DSB的数码管显示数字温度计C语言程序.docx_第1页
第1页 / 共5页
基于ATS及DSB的数码管显示数字温度计C语言程序.docx_第2页
第2页 / 共5页
基于ATS及DSB的数码管显示数字温度计C语言程序.docx_第3页
第3页 / 共5页
基于ATS及DSB的数码管显示数字温度计C语言程序.docx_第4页
第4页 / 共5页
基于ATS及DSB的数码管显示数字温度计C语言程序.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于ATS及DSB的数码管显示数字温度计C语言程序.docx

《基于ATS及DSB的数码管显示数字温度计C语言程序.docx》由会员分享,可在线阅读,更多相关《基于ATS及DSB的数码管显示数字温度计C语言程序.docx(5页珍藏版)》请在冰豆网上搜索。

基于ATS及DSB的数码管显示数字温度计C语言程序.docx

#include"reg52.h"

#include"intrins.h"//_nop_();延时函数用

#defineDisdataP0//段码输出口

#definediscanP2//扫描口

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P3^3;//温度输入口

sbitDIN=P0^7;//LED小数点控制

uinth;

ucharflag;

//**************温度小数部分用查表法***********//

ucharcodeditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//

ucharcodedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"

ucharcodescan_con[4]={0xbf,0x7f,0xef,0xfe};//列扫描控制字

uchardatatemp_data[2]={0x00,0x00};//读出温度暂放

uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用

//

//

//

/***********11微秒延时函数**********/

//

voiddelay(uintt)

{

for(;t>0;t--);

}

//

/***********显示扫描函数**********/

scan()

{

chark;

for(k=0;k<4;k++)//四位LED扫描控制

{

Disdata=0xff;

Disdata=dis_7[display[k]];

if(k==1){DIN=0;}

discan=scan_con[k];delay(90);

discan=0xff;

}

}

//

//

/***********18B20复位函数**********/

ow_reset(void)

{

charpresence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();

DQ=0;//

delay(50);//550us

DQ=1;//

delay(6);//66us

presence=DQ;//presence=0继续下一步

}

delay(45);//延时500us

presence=~DQ;

}

DQ=1;

}

//

//

/**********18B20写命令函数*********/

//向1-WIRE总线上写一个字节

voidwrite_byte(ucharval)

{

uchari;

for(i=8;i>0;i--)//

{

DQ=1;_nop_();_nop_();

DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

DQ=val&0x01;//最低位移出

delay(6);//66us

val=val/2;//右移一位

}

DQ=1;

delay

(1);

}

//

/*********18B20读1个字节函数********/

//从总线上读取一个字节

ucharread_byte(void)

{

uchari;

ucharvalue=0;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ=0;//

_nop_();_nop_();_nop_();_nop_();//4us

DQ=1;_nop_();_nop_();_nop_();_nop_();//4us

if(DQ)value|=0x80;

delay(6);//66us

}

DQ=1;

return(value);

}

//

/***********读出温度函数**********/

//

read_temp()

{

ow_reset();//总线复位

write_byte(0xCC);//发SkipROM命令

write_byte(0xBE);//发读命令

temp_data[0]=read_byte();//温度低8位

temp_data[1]=read_byte();//温度高8位

ow_reset();

write_byte(0xCC);//SkipROM

write_byte(0x44);//发转换命令

}

//

/***********温度数据处理函数**********/

voidwork_temp()

{

ucharn=0;

uchardoth,dotl;

ucharflag3=1,flag2=1;//数字显示修正标记

if((temp_data[1]&0xf8)!

=0x00)

{

temp_data[1]=~(temp_data[1]);

temp_data[0]=~(temp_data[0])+1;

n=1;

flag=1;

}//负温度求补码

if(temp_data[0]>255)

{

temp_data[1]++;

}

display[4]=temp_data[0]&0x0f;

display[0]=ditab[display[4]];

doth=display[0]/10;

dotl=display[0]%10;

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);

display[3]=display[4]/100;

display[2]=display[4]/10%10;

display[1]=display[4]%10;

if(!

display[3])

{

display[3]=0x0a;

flag3=0;

if(!

display[2])

{

display[2]=0x0a;

flag2=0;

}

}//最高位为0时都不显示

if(n)

{

display[3]=0x0b;//负温度时最高位显示"-"

flag3=0;

}

}

//

//

/**************主函数****************/

main()

{

Disdata=0xff;//初始化端口

discan=0xff;

for(h=0;h<4;h++){display[h]=8;}//开机显示8888

ow_reset();//开机先转换一次

write_byte(0xCC);//SkipROM

write_byte(0x44);//发转换命令

for(h=0;h<500;h++)

{scan();}//开机显示"8888"2秒

while

(1)

{

read_temp();//读出18B20温度数据

work_temp();//处理温度数据

scan();//显示温度值2秒

}

}

//

//*********************结束**************************//

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1