专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
proteus
求各位大神有没有at89c52温度系统设计的仿真及程序
2019-07-18 10:41
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
proteus
2372
3
990
求各位大神有没有at89c52温度系统设计的
仿真
及程序,,,,多谢各位大神了!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
颩憅
2019-07-18 20:45
/***************************************************/
#include "reg52.h"
#include "intrins.h" //_nop_();延时函数用
#include "math.h"
#define disdata P0 //段码输出口
#define discan P2 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit duqu=P3^6; //温度输入口
sbit dian=P0^7; //LED小数点控制
sbit beep=P1^6; //蜂鸣器
sbit key0=P3^0;
sbit key1=P3^1;
sbit key02=P3^2;
sbit key03=P3^3;
sbit led0=P1^0; //红灯
sbit led1=P1^1; //绿灯
sbit led2=P1^2; //黄灯
uint h;
uint temp;
uchar r;
char high=38,low=10;
uchar sign;
uchar st=1;
uchar ti;
uchar pp;
uchar ee;
uchar nn;
//**************温度小数部分用查表法***********//
Uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,
0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
Uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};
//共阴LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C" //
uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0}; //列扫描控制字
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
//显示单元数据,共4个数据和一个运算暂用
/*****************11us延时函数*************************/
void delay(uint t)
{
for (;t>0;t--);
}
/****************显示扫描函数********************/
void scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
discan=scan_con[k]; //位选
disdata=dis_7[display[k]]; //数据显示
if (k==1){dian=1;} //小数点显示
delay(200);
}
}
/****************DS18B20复位函数******************/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;
delay(50); //550 us
duqu=1;
delay(6); //66 us
presence=duqu;//presence=0 复位成功,继续下一步
}
delay(45); //延时500 us
presence=~duqu;
}
duqu=1; //拉高电平
}
/****************DS18B20写命令函数******************/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;_nop_();_nop_();_nop_();_nop_(); //5 us
duqu=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
duqu=1;
delay(1);
}
/****************DS18B20读1字节函数******************/
//从总线上取1个字节//
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_();
value>>=1;
duqu=0;_nop_();_nop_();_nop_();_nop_(); //4 us
duqu=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(duqu)value|=0x80;
delay(6); //66 us
}
duqu=1;
return(value);
}
/****************读出温度函数************************/
uint read_temp()
{
ow_reset(); //总线复位
delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delay(1);
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}
/****************温度数据处理函数******************/
//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
/*****************************************************/
work_temp(uint tem)
{
uchar n=0;
nn=0;
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;nn=1;} // 负温度求补码,标志位置1
display[4]=tem&0x0f; // 取小数部分的值
display[0]=ditab[display[4]]; // 存入小数部分显示值
display[4]=tem>>4; // 取中间八位,即整数部分的值
display[3]=display[4]/100; // 取百位数据暂存
display[1]=display[4]%100; // 取后两位数据暂存display[2]=display[1]/10; // 取十位数据暂存
display[1]=display[1]%10;
r=display[1]+display[2]*10+display[3]*100;
/******************符号位显示判断*********************/
if(!display[3])
{
display[3]=0x0a; //最高位为0时不显示
if(!display[2])
{
display[2]=0x0a; //次高位为0时不显示
}
}
if(n){display[3]=0x0b;} //负温度时最高位显示"-"
}
/******************蜂鸣器报警函数*********************/
void BEEP()
{
if(r>=high||r<=low)
{
beep=1;led1=1;
if(r>=high)
{
led0=0;led2=1;
}
else if (r<=low)
{
led2=0;led0=1;
}
}
else if ((nn==1)&&(r>=abs(low)))
{
led2=0;led0=1;beep=1;led1=1;
}
else
{
beep=0;led1=0;led0=1;led2=1;
}
}
/******************初始化函数**************************/
void init()
{
beep=0;
EA=1;
EX0=0;
EX1=0;
IT0=1;
IT1=1;
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-833)/256;
TL1=(65536-833)%256;
sign=0;
ti=high;
}
/******************温度/上下限调整切换****************/
void key11()
{
while(key1==0)
{
delay(300);
if(key1==0)
{
st++;
if(st==4)
st=1;
}
while(!key1);
delay(300);
while(!key1);
}
}
/******************切换调整上下限*******************/
void key10()
{
while(key0==0)
{
delay(300); //消抖动
if(key0==0)
{
sign=!sign;
}
while(!key0);
delay(300);
while(!key0);
}
}
/******************上下限加1************************/
void key2()
{
while(key02==0)
{
delay(400);
if(key02==0)
{
if(sign)
{ low=low+1;
if(low>high)
{pp=low;low=high;high=pp;}
}
else
{high=high+1;ti=high;}
}
while(!key02);
delay(400);
while(!key02);
}
}
/******************上下限减1***********************/
void key3()
{
while(key03==0)
{
delay(400);
if(key03==0)
{
if(sign)
low=low-1;
else
{ high=high-1;ti=high;
if(low>high)
{pp=low;low=high;high=pp;}
}
}
while(!key03);
delay(400);
while(!key03);
}
}
/******************上限温度显示*********************/
void high1()
{
uchar k;
if(high<100)
{ display[0]=high%10;
display[1]=high/10;
display[2]=10;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
else
{
display[0]=high%10;
display[1]=high%100/10;
display[2]=high/100;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
}
/******************下限温度显示*********************/
void low1()
{
uchar ki;
if(low>=0)
{ display[0]=low%10;
display[1]=low/10;
display[2]=10;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
else
{
ee=abs(low);
display[0]=ee%10;
display[1]=ee/10;
display[2]=11;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
}
/****************主函数************************/
void main()
{
init();
disdata=0x00; //初始化端口
discan=0x00;
for(h=0;h<4;h++) //开机显示"0000"
{display[h]=0;}
ow_reset(); //开机先转换一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
for(h=0;h<100;h++) //开机显示"0000"
{scan();}
while(1)
{
switch(st) //分支
{
case 1:{
work_temp(read_temp());
scan(); //显示温度
BEEP();
break;
}
case 2: {
high1(); // 显示上限温度
key10();
key2();
key3();
break;
}
case 3: {
low1(); //显示下限温度
key10();
key2();
key3();
break;
}
}
key11();
}
}
//***********************结束*******************//
求大神看看此程序是否有错误!!!!
加载中...
查看其它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
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include "reg52.h"
#include "intrins.h" //_nop_();延时函数用
#include "math.h"
#define disdata P0 //段码输出口
#define discan P2 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit duqu=P3^6; //温度输入口
sbit dian=P0^7; //LED小数点控制
sbit beep=P1^6; //蜂鸣器
sbit key0=P3^0;
sbit key1=P3^1;
sbit key02=P3^2;
sbit key03=P3^3;
sbit led0=P1^0; //红灯
sbit led1=P1^1; //绿灯
sbit led2=P1^2; //黄灯
uint h;
uint temp;
uchar r;
char high=38,low=10;
uchar sign;
uchar st=1;
uchar ti;
uchar pp;
uchar ee;
uchar nn;
//**************温度小数部分用查表法***********//
Uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,
0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
Uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};
//共阴LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C" //
uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0}; //列扫描控制字
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
//显示单元数据,共4个数据和一个运算暂用
/*****************11us延时函数*************************/
void delay(uint t)
{
for (;t>0;t--);
}
/****************显示扫描函数********************/
void scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
discan=scan_con[k]; //位选
disdata=dis_7[display[k]]; //数据显示
if (k==1){dian=1;} //小数点显示
delay(200);
}
}
/****************DS18B20复位函数******************/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;
delay(50); //550 us
duqu=1;
delay(6); //66 us
presence=duqu;//presence=0 复位成功,继续下一步
}
delay(45); //延时500 us
presence=~duqu;
}
duqu=1; //拉高电平
}
/****************DS18B20写命令函数******************/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;_nop_();_nop_();_nop_();_nop_(); //5 us
duqu=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
duqu=1;
delay(1);
}
/****************DS18B20读1字节函数******************/
//从总线上取1个字节//
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_();
value>>=1;
duqu=0;_nop_();_nop_();_nop_();_nop_(); //4 us
duqu=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(duqu)value|=0x80;
delay(6); //66 us
}
duqu=1;
return(value);
}
/****************读出温度函数************************/
uint read_temp()
{
ow_reset(); //总线复位
delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delay(1);
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}
/****************温度数据处理函数******************/
//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
/*****************************************************/
work_temp(uint tem)
{
uchar n=0;
nn=0;
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;nn=1;} // 负温度求补码,标志位置1
display[4]=tem&0x0f; // 取小数部分的值
display[0]=ditab[display[4]]; // 存入小数部分显示值
display[4]=tem>>4; // 取中间八位,即整数部分的值
display[3]=display[4]/100; // 取百位数据暂存
display[1]=display[4]%100; // 取后两位数据暂存display[2]=display[1]/10; // 取十位数据暂存
display[1]=display[1]%10;
r=display[1]+display[2]*10+display[3]*100;
/******************符号位显示判断*********************/
if(!display[3])
{
display[3]=0x0a; //最高位为0时不显示
if(!display[2])
{
display[2]=0x0a; //次高位为0时不显示
}
}
if(n){display[3]=0x0b;} //负温度时最高位显示"-"
}
/******************蜂鸣器报警函数*********************/
void BEEP()
{
if(r>=high||r<=low)
{
beep=1;led1=1;
if(r>=high)
{
led0=0;led2=1;
}
else if (r<=low)
{
led2=0;led0=1;
}
}
else if ((nn==1)&&(r>=abs(low)))
{
led2=0;led0=1;beep=1;led1=1;
}
else
{
beep=0;led1=0;led0=1;led2=1;
}
}
/******************初始化函数**************************/
void init()
{
beep=0;
EA=1;
EX0=0;
EX1=0;
IT0=1;
IT1=1;
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-833)/256;
TL1=(65536-833)%256;
sign=0;
ti=high;
}
/******************温度/上下限调整切换****************/
void key11()
{
while(key1==0)
{
delay(300);
if(key1==0)
{
st++;
if(st==4)
st=1;
}
while(!key1);
delay(300);
while(!key1);
}
}
/******************切换调整上下限*******************/
void key10()
{
while(key0==0)
{
delay(300); //消抖动
if(key0==0)
{
sign=!sign;
}
while(!key0);
delay(300);
while(!key0);
}
}
/******************上下限加1************************/
void key2()
{
while(key02==0)
{
delay(400);
if(key02==0)
{
if(sign)
{ low=low+1;
if(low>high)
{pp=low;low=high;high=pp;}
}
else
{high=high+1;ti=high;}
}
while(!key02);
delay(400);
while(!key02);
}
}
/******************上下限减1***********************/
void key3()
{
while(key03==0)
{
delay(400);
if(key03==0)
{
if(sign)
low=low-1;
else
{ high=high-1;ti=high;
if(low>high)
{pp=low;low=high;high=pp;}
}
}
while(!key03);
delay(400);
while(!key03);
}
}
/******************上限温度显示*********************/
void high1()
{
uchar k;
if(high<100)
{ display[0]=high%10;
display[1]=high/10;
display[2]=10;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
else
{
display[0]=high%10;
display[1]=high%100/10;
display[2]=high/100;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
}
/******************下限温度显示*********************/
void low1()
{
uchar ki;
if(low>=0)
{ display[0]=low%10;
display[1]=low/10;
display[2]=10;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
else
{
ee=abs(low);
display[0]=ee%10;
display[1]=ee/10;
display[2]=11;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
}
/****************主函数************************/
void main()
{
init();
disdata=0x00; //初始化端口
discan=0x00;
for(h=0;h<4;h++) //开机显示"0000"
{display[h]=0;}
ow_reset(); //开机先转换一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
for(h=0;h<100;h++) //开机显示"0000"
{scan();}
while(1)
{
switch(st) //分支
{
case 1:{
work_temp(read_temp());
scan(); //显示温度
BEEP();
break;
}
case 2: {
high1(); // 显示上限温度
key10();
key2();
key3();
break;
}
case 3: {
low1(); //显示下限温度
key10();
key2();
key3();
break;
}
}
key11();
}
}
//***********************结束*******************//
求大神看看此程序是否有错误!!!!
一周热门 更多>