专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
proteus
大神来看看DS18B20电子温度计的设计出了点问题
2019-07-18 10:17
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
proteus
7081
3
1439
本帖最后由 roger0928 于 2016-11-12 22:10 编辑
设计的
电子
温度计有点问题,就是显示阈值按键不起作用,随贴附上
仿真
电路图
和c程序,请各位大神帮忙看看,用的是 51
单片机
ATC89C52 ,8位共阴数码管
温度计.zip
下载积分: 积分 -1 分
21.32 KB, 下载次数: 4, 下载积分: 积分 -1 分
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
roger0928
2019-07-18 14:42
sbit D1=P2^1; //段选
sbit D2=P2^0; //位选
sbit key_add=P1^0; //阈值加1键
sbit key_dec=P1^1; //阈值减1键
sbit key_xian=P1^2; //显示阈值键
code unsigned char seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x76,0x38}; //不带小数点的共阴段码,含H,L,-,等符号
code unsigned char seg7codeB[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00}; //带小数的共阴段码
sbit DQ=P3^7; //数据传输线接单片机的相应的引脚
unsigned char tempL=0; //设全局变量
unsigned char tempH=0;
unsigned int sdata;//测到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
unsigned int htime=20; //设阈值初始值为20
// unsigned int diskey;
bit fg=1; //温度正负标志
//******************延时程序 *******************************
//??????????????time=i*8+10,?????2ms???
//************************************************************
void delay(unsigned char i)
{
for(i;i>0;i--);
}
//***********************************************************
// 延时程序
//************************************************************
void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延时1002us
}
//*****************************初始化 *********************************//
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ???
delay(8); //???
DQ=0; //??????
delay(80); //??(>480us)
DQ=1; //?????
delay(5); //??(15~60us)
x=DQ; //?X?????????????,18B20????X=0,??X=1
delay(20);
}
//**********读一个字节************//
ReadOneChar(void) //?????????????1us??,??????????,???????
{
unsigned char i=0; //?????????????60us,??????????1us?????????
unsigned char dat=0;
for (i=8;i>0;i--) //?????8?
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//*********************** **写一个字节**************************//
WriteOneChar(unsigned char dat)
{
unsigned char i=0; //????????????,????????15us??????????????,
for(i=8;i>0;i--) //?15~60us??????????,????????1,??0???
{
DQ=0; //?????????????1us??????????
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//读温度值(低位放tempL;高位放tempH;)
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(???????????????)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负的
{
tempL=~tempL+1; //补码转换 取反加1
tempH=~tempH;
fg=0; //温度为负时fg=0
}
sdata = tempL/16+tempH*16; //整数部分
xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
}
//********************显示函数****************
void Led(unsigned int date)
{
if(fg==1) //温度为正数时
{
if(sdata>htime) //测得的温度整数部分大于阈值
{
P0=0x7f;
D2=1;
D2=0;
P0=seg7code[12]; // 在最后面显示字母H
D1=1;
D1=0;
delay(62);
P0=0x00;
P0=0xfb;
D2=1;
D2=0;
P0=seg7code[date/10]; //十位,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xf7;
D2=1;
D2=0;
P0=seg7codeB[date%10]; //个位,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xef;
D2=1;
D2=0;
P0=seg7code[xiaoshu1]; //小数点第一位
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xdf;
D2=1;
D2=0;
P0=seg7code[xiaoshu2]; //小数点第二位
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
}
/*if(sdata=htime)
{
P0=0xfb; //P1.0=0,?????
D2=1;
D2=0;
P0=seg7code[htime/10]; //???,??,??
D1=1;
D1=0;
delay(248);
P0=0x00; //??
P0=0xf7; //P1.1=0,?????,???
D2=1;
D2=0;
P0=seg7code[htime%10];
D1=1;
D1=0;
delay(248);
P0=0x00; //??
} */
if(sdata<=htime) //测得的温度值小于等于阈值
{
P0=0xfb;
D2=1;
D2=0;
P0=seg7code[date/10]; //正常显示温度,位码,段码和输出方式同上
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xf7;
D2=1;
D2=0;
P0=seg7codeB[date%10];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xef;
D2=1;
D2=0;
P0=seg7code[xiaoshu1];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xdf;
D2=1;
D2=0;
P0=seg7code[xiaoshu2];
D1=1;
D1=0;
delay(248);
P0=0x00; }
}
if(fg==0) //测得的温度为负数时
{
P0=0x7f;
D2=1;
D2=0;
P0=seg7code[13]; // 最前面加上负号
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xfb;
D2=1;
D2=0; // 位码,段码 和输出方式同上
P0=seg7code[11];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xf7;
D2=1;
D2=0;
P0=seg7code[date/10];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xef;
D2=1;
D2=0;
P0=seg7codeB[date%10];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xdf;
D2=1;
D2=0;
P0=seg7code[xiaoshu1];
D1=1;
D1=0;
delay(248);
P0=0x00;
}
}
void yu(void) //阈值函数
{
if(fg==1) //为正数时
{
if(!key_add)
{
delay(10); //延时消抖
while(!key_add);
{
if(htime<99)
htime++; //阈值加1
}
}
if(!key_dec)
{
delay(10);
while(!key_dec); //消抖
{
if(htime>0)
htime--; //阈值减1
}
}
/* if(!key_xian)
{ delay(10);
while(!key_xian);
{
diskey=htime;
}
} */
}
}
//**************************** //???
main()
{
while(1)
{
fg=1;
ReadTemperature();
Led(sdata);
yu();
if(!key_xian) //显示阈值程序
{
delay(10); //消抖
while(!key_xian);
{
P0=0xfb;
D2=1;
D2=0;
P0=seg7code[htime/10]; //阈值的十位部分,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xf7;
D2=1;
D2=0;
P0=seg7code[htime%10]; //阈值的个位部分,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
}
}
}
}
这是c程序
加载中...
查看其它3个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
为什么Proteus 仿真点阵字体缺笔画 而且速度奇慢
7 个回答
2012~~单片机C语言程序设计实训100例-基于8051+Proteus仿真(第2版)
27 个回答
新手求帮忙解决proteus的问题
1 个回答
大家好,请问用三菱plc仿真软件跟mcgs组态软件怎么样连接?
1 个回答
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
proteus
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
sbit D2=P2^0; //位选
sbit key_add=P1^0; //阈值加1键
sbit key_dec=P1^1; //阈值减1键
sbit key_xian=P1^2; //显示阈值键
code unsigned char seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x76,0x38}; //不带小数点的共阴段码,含H,L,-,等符号
code unsigned char seg7codeB[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00}; //带小数的共阴段码
sbit DQ=P3^7; //数据传输线接单片机的相应的引脚
unsigned char tempL=0; //设全局变量
unsigned char tempH=0;
unsigned int sdata;//测到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
unsigned int htime=20; //设阈值初始值为20
// unsigned int diskey;
bit fg=1; //温度正负标志
//******************延时程序 *******************************
//??????????????time=i*8+10,?????2ms???
//************************************************************
void delay(unsigned char i)
{
for(i;i>0;i--);
}
//***********************************************************
// 延时程序
//************************************************************
void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延时1002us
}
//*****************************初始化 *********************************//
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ???
delay(8); //???
DQ=0; //??????
delay(80); //??(>480us)
DQ=1; //?????
delay(5); //??(15~60us)
x=DQ; //?X?????????????,18B20????X=0,??X=1
delay(20);
}
//**********读一个字节************//
ReadOneChar(void) //?????????????1us??,??????????,???????
{
unsigned char i=0; //?????????????60us,??????????1us?????????
unsigned char dat=0;
for (i=8;i>0;i--) //?????8?
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//*********************** **写一个字节**************************//
WriteOneChar(unsigned char dat)
{
unsigned char i=0; //????????????,????????15us??????????????,
for(i=8;i>0;i--) //?15~60us??????????,????????1,??0???
{
DQ=0; //?????????????1us??????????
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//读温度值(低位放tempL;高位放tempH;)
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(???????????????)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负的
{
tempL=~tempL+1; //补码转换 取反加1
tempH=~tempH;
fg=0; //温度为负时fg=0
}
sdata = tempL/16+tempH*16; //整数部分
xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
}
//********************显示函数****************
void Led(unsigned int date)
{
if(fg==1) //温度为正数时
{
if(sdata>htime) //测得的温度整数部分大于阈值
{
P0=0x7f;
D2=1;
D2=0;
P0=seg7code[12]; // 在最后面显示字母H
D1=1;
D1=0;
delay(62);
P0=0x00;
P0=0xfb;
D2=1;
D2=0;
P0=seg7code[date/10]; //十位,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xf7;
D2=1;
D2=0;
P0=seg7codeB[date%10]; //个位,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xef;
D2=1;
D2=0;
P0=seg7code[xiaoshu1]; //小数点第一位
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xdf;
D2=1;
D2=0;
P0=seg7code[xiaoshu2]; //小数点第二位
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
}
/*if(sdata=htime)
{
P0=0xfb; //P1.0=0,?????
D2=1;
D2=0;
P0=seg7code[htime/10]; //???,??,??
D1=1;
D1=0;
delay(248);
P0=0x00; //??
P0=0xf7; //P1.1=0,?????,???
D2=1;
D2=0;
P0=seg7code[htime%10];
D1=1;
D1=0;
delay(248);
P0=0x00; //??
} */
if(sdata<=htime) //测得的温度值小于等于阈值
{
P0=0xfb;
D2=1;
D2=0;
P0=seg7code[date/10]; //正常显示温度,位码,段码和输出方式同上
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xf7;
D2=1;
D2=0;
P0=seg7codeB[date%10];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xef;
D2=1;
D2=0;
P0=seg7code[xiaoshu1];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xdf;
D2=1;
D2=0;
P0=seg7code[xiaoshu2];
D1=1;
D1=0;
delay(248);
P0=0x00; }
}
if(fg==0) //测得的温度为负数时
{
P0=0x7f;
D2=1;
D2=0;
P0=seg7code[13]; // 最前面加上负号
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xfb;
D2=1;
D2=0; // 位码,段码 和输出方式同上
P0=seg7code[11];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xf7;
D2=1;
D2=0;
P0=seg7code[date/10];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xef;
D2=1;
D2=0;
P0=seg7codeB[date%10];
D1=1;
D1=0;
delay(248);
P0=0x00;
P0=0xdf;
D2=1;
D2=0;
P0=seg7code[xiaoshu1];
D1=1;
D1=0;
delay(248);
P0=0x00;
}
}
void yu(void) //阈值函数
{
if(fg==1) //为正数时
{
if(!key_add)
{
delay(10); //延时消抖
while(!key_add);
{
if(htime<99)
htime++; //阈值加1
}
}
if(!key_dec)
{
delay(10);
while(!key_dec); //消抖
{
if(htime>0)
htime--; //阈值减1
}
}
/* if(!key_xian)
{ delay(10);
while(!key_xian);
{
diskey=htime;
}
} */
}
}
//**************************** //???
main()
{
while(1)
{
fg=1;
ReadTemperature();
Led(sdata);
yu();
if(!key_xian) //显示阈值程序
{
delay(10); //消抖
while(!key_xian);
{
P0=0xfb;
D2=1;
D2=0;
P0=seg7code[htime/10]; //阈值的十位部分,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
P0=0xf7;
D2=1;
D2=0;
P0=seg7code[htime%10]; //阈值的个位部分,输出
D1=1;
D1=0;
delay(248);
P0=0x00; //消隐
}
}
}
}
这是c程序
一周热门 更多>