单片机程序和仿真图如下,现在要添加一个摄氏转华氏的按钮,请问一下单片机大佬们cx程序该加什么东西?proteous元件该如何改动?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1=P2^2;
sbit d2=P2^1;
sbit d3=P2^0;
sbit d4=P2^3;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit beep=P3^3;
sbit DS=P1^2;
sbit ACC_7=ACC^7;
uint count=1000,alarm=300;
uchar shu;
uchar shi,fen,ri,yue,nian,xq,miao,ss;
uint temp; // 温度变量
uchar flag;
uchar code tempt[]={32,34,36,37,39,41};
/*数组,设置在EPROM中,长度为实际输入的数值数*/
uchar ftoc(uchar degc)
{ return tempt[degc]; /*返回华氏温度值*/
}
uchar code tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
uchar code tab1[]=//小数点点亮
{0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0x78,0x00,0x10
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void dsreset()//发复位
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
uchar tmpread() //读取一字节
{
uchar j,k,dat;
uint i;
for(j=1;j<=8;j++)
{
DS=0;i++; //延时
DS=1;i++;i++;
k=DS;
i=8;while(i>0)i--;
dat=(k<<7)|(dat>>1);//读出的数据最低位在最前面存一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //写一个字节
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //写 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange() //DS18B20温度变换
{
dsreset();
delay(1);
tmpwritebyte(0xcc); //跳过读取内存rom
tmpwritebyte(0x44); //开始转换
}
uint tmp() //读取温度
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread(); //a为低字节8位
b=tmpread(); //b为高字节8位
temp=b; //temp为温度值UINT 16bit
temp<<=8; //两个字节组合到一起
temp=temp|a;
if(b>127)
{
flag=1;
ss=flag;
temp=~temp+1;
}
tt=temp*0.0625; // temp/16 则是温度的真实值tt.7位整数,4位小数
temp=tt*10+0.5; // 扩大十倍取出了第一位小数
return(temp);
}
void displayTemp(uint temp) //显示温度程序
{
uchar ge,shi,bai,qian,ser;
d1=0;
d1=0;
d3=0;
d4=0;
dsreset();
ser=temp/10; //分离出三位要显示的数字
SBUF=ser;
qian=temp/1000;
bai=temp/100%10; // 百位数字
shi=temp/10%10; // 十位数字
ge=temp%10; // 个位数字
if(flag==1)
{
flag=0;
P0=0xbf;
d1=1;
delay(2);
d1=0;
}
if(qian!=0)
{
P0=tab[qian];
d1=1;
delay(2);
d1=0;
}
else
{
P0=0xff;
d1=1;
delay(2);
d1=0;
}
if(temp>99)
{
P0=tab[bai];
d2=1;
delay(2);
d2=0;
}
P0=tab1[shi];
d3=1;
delay(2);
d3=0;
P0=tab[ge];
d4=1;
delay(2);
d4=0;
}
uint keyscan()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
shu++;
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
count=count+10;
if(shu==2)
{
alarm+=10;
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
count=count-10;
if(shu==2)
{
alarm-=10;
}
}
}
return(count);}void main()
{
beep=0;
delay(10);
while( 1 )
{
tmpchange();
if(shu==0)
{
displayTemp(tmp( ));
}
keyscan();
if(shu==1)
{
displayTemp(count);
}
if(shu==2)
{
displayTemp(alarm);
}
if(shu==3)
{
shu=0;
}
if(temp>count||(temp<alarm))
{
beep=0; }
if(shu==x)
{
x=ftoc(5); /*得到与5℃相对应的华氏温度值*/
}
else
beep=1;
}
}
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1=P2^2;
sbit d2=P2^1;
sbit d3=P2^0;
sbit d4=P2^3;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit beep=P3^3;
sbit DS=P1^2;
sbit ACC_7=ACC^7;
uint count=1000,alarm=300;
uchar shu;
uchar shi,fen,ri,yue,nian,xq,miao,ss;
uint temp; // 温度变量
uchar flag;
uchar code tempt[]={32,34,36,37,39,41};
/*数组,设置在EPROM中,长度为实际输入的数值数*/
uchar ftoc(uchar degc)
{ return tempt[degc]; /*返回华氏温度值*/
}
uchar code tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
uchar code tab1[]=//小数点点亮
{0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0x78,0x00,0x10
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void dsreset()//发复位
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
uchar tmpread() //读取一字节
{
uchar j,k,dat;
uint i;
for(j=1;j<=8;j++)
{
DS=0;i++; //延时
DS=1;i++;i++;
k=DS;
i=8;while(i>0)i--;
dat=(k<<7)|(dat>>1);//读出的数据最低位在最前面存一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //写一个字节
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //写 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange() //DS18B20温度变换
{
dsreset();
delay(1);
tmpwritebyte(0xcc); //跳过读取内存rom
tmpwritebyte(0x44); //开始转换
}
uint tmp() //读取温度
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread(); //a为低字节8位
b=tmpread(); //b为高字节8位
temp=b; //temp为温度值UINT 16bit
temp<<=8; //两个字节组合到一起
temp=temp|a;
if(b>127)
{
flag=1;
ss=flag;
temp=~temp+1;
}
tt=temp*0.0625; // temp/16 则是温度的真实值tt.7位整数,4位小数
temp=tt*10+0.5; // 扩大十倍取出了第一位小数
return(temp);
}
void displayTemp(uint temp) //显示温度程序
{
uchar ge,shi,bai,qian,ser;
d1=0;
d1=0;
d3=0;
d4=0;
dsreset();
ser=temp/10; //分离出三位要显示的数字
SBUF=ser;
qian=temp/1000;
bai=temp/100%10; // 百位数字
shi=temp/10%10; // 十位数字
ge=temp%10; // 个位数字
if(flag==1)
{
flag=0;
P0=0xbf;
d1=1;
delay(2);
d1=0;
}
if(qian!=0)
{
P0=tab[qian];
d1=1;
delay(2);
d1=0;
}
else
{
P0=0xff;
d1=1;
delay(2);
d1=0;
}
if(temp>99)
{
P0=tab[bai];
d2=1;
delay(2);
d2=0;
}
P0=tab1[shi];
d3=1;
delay(2);
d3=0;
P0=tab[ge];
d4=1;
delay(2);
d4=0;
}
uint keyscan()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
shu++;
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
count=count+10;
if(shu==2)
{
alarm+=10;
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
count=count-10;
if(shu==2)
{
alarm-=10;
}
}
}
return(count);}void main()
{
beep=0;
delay(10);
while( 1 )
{
tmpchange();
if(shu==0)
{
displayTemp(tmp( ));
}
keyscan();
if(shu==1)
{
displayTemp(count);
}
if(shu==2)
{
displayTemp(alarm);
}
if(shu==3)
{
shu=0;
}
if(temp>count||(temp<alarm))
{
beep=0; }
if(shu==x)
{
x=ftoc(5); /*得到与5℃相对应的华氏温度值*/
}
else
beep=1;
}
}