📄 main.c
字号:
#include "AT89X52.H"
#include "1602S51.H"
#include "DS18B20S51.H"
unsigned char tt[16]={"I: . II: . "};
unsigned char PP[16]={"III: . "};
unsigned char sSendComBuf[5]={0x55,1,35,23,0xff};
unsigned char sRecComBuf[5];
unsigned char timecount=0;
unsigned int TesTemperature1=0;//实测得到温度 4位,到达千
unsigned int TesTemperature2=0;//实测得到温度
unsigned int TesTemperature3=0;//实测得到温度
bit ID_choose1=1; //第一路温度测量开关 1 开,0 关
bit ID_choose2=1; //第二路温度测量开关
bit ID_choose3=1; //第三路温度测量开关
unsigned int sst;
unsigned char count3;
unsigned char data bOut,bIn,bSout,bSin;
void initTimer(void); //初始化定时器0
int translate(unsigned int uiData,unsigned char ID);
void Key_Scan(void);//按键扫描
void PSendChar(unsigned char ch) ;
void PSendString(unsigned char *st) ;
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0 );
TI= 0 ;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned char strlen)
{
unsigned char k= 0 ;
do
{
send_char_com(str[k]);
k++;
} while (k < strlen);
}
//------------------------------
//串口-中断方式
//当要发送时,往SBUF里送值,设TI=1,设ES=1,就能发送了,
//UART init
void initUart(void)
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFa ; //Baud:9600 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt ES=1.EA=1
TR1 = 1 ; // timer 1 run
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
static bit fist;
if (RI)
{
unsigned char ch;
RI = 0 ;
ch=SBUF;
// PP[10]=ch+'0';
if (ch==0x55 ) //第一字节
{
fist=1; //帧头
count3= 0 ;
sRecComBuf[count3]=ch;
}
if((fist==1)&&(count3==4)&&(ch==0xff)) //帧尾
{
fist=0; //帧尾
switch(sRecComBuf[1]) //路数选择
{
case 1:
if(sRecComBuf[2]==0x01)
{
ID_choose1=1;//启动第一路
}
else if(sRecComBuf[2]==0x02)
{
ID_choose1=0;//关闭第一路
}
break;
case 2:
if(sRecComBuf[2]==0x01)
{
ID_choose2=1;//启动第一路
}
else if(sRecComBuf[2]==0x02)
{
ID_choose2=0;//关闭第一路
}
break;
case 3:
if(sRecComBuf[2]==0x01)
{
ID_choose3=1;//启动第一路
}
else if(sRecComBuf[2]==0x02)
{
ID_choose3=0;//关闭第一路
}
break;
default:break;
}
}
sRecComBuf[count3]=ch;
count3++;
}
}
void main()
{
initUart();
init_LCD(); //初始化LCD----来自1602S51.H文件
display(0x80,tt,16); //界面显示
display(0xC0,PP,16);
while(1)
{
display(0x80,tt,16); //界面显示
display(0xC0,PP,16);
Key_Scan();
if(ID_choose1)
{
sst=Read_Temperature(1); //第一路
TesTemperature1=translate(sst,1);
sSendComBuf[1]=ID_choose1; //路号
sSendComBuf[2]=TesTemperature1/100 ; //整数位
sSendComBuf[3]=TesTemperature1%100; //小数位
send_string_com(sSendComBuf,5);
delay_ms(50);
}
if(ID_choose2)
{
sst=Read_Temperature(2); //第二路
TesTemperature2=translate(sst,2);
sSendComBuf[1]=2; //路号
sSendComBuf[2]=TesTemperature2/100 ; //整数位
sSendComBuf[3]=TesTemperature2%100; //小数位
send_string_com(sSendComBuf,5);
delay_ms(50);
}
if(ID_choose3)
{
sst=Read_Temperature(3); //第三路
TesTemperature3=translate(sst,3);
sSendComBuf[1]=3; //路号
sSendComBuf[2]=TesTemperature3/100 ; //整数位
sSendComBuf[3]=TesTemperature3%100; //小数位
send_string_com(sSendComBuf,5);
delay_ms(50);
}
}
}
//--------------------------------------------------------
//把读到的温度放到要显示缓存中
//输入:uiData 读到的数值 ID是温度的路号1表是第一路,2表示第二路,3表示第三路
//输出:通过给相应的数组赋值,达到输出
int translate(unsigned int uiData,unsigned char ID)
{
unsigned int uiInteger; //数据的整数部分
unsigned int uiDecimal; //数据的小数部分
unsigned int uiBai; //显示温度的百位
unsigned int uiShi; //显示温度的十位
unsigned int uiGe; //显示温度的个位
unsigned int uiShi_d; //显示温度的十分位
unsigned int uiBai_d; //显示温度的百分位
// unsigned int uiQian_d; //显示温度的千分位
unsigned int uiResidue; //数据的余数,作除法
uiInteger = 0;
uiDecimal = 0;
if(uiData & 0x0400)
uiInteger += 64; //转换为整数部分
if(uiData & 0x0200)
uiInteger += 32;
if(uiData & 0x0100)
uiInteger += 16;
if(uiData & 0x0080)
uiInteger += 8;
if(uiData & 0x0040)
uiInteger += 4;
if(uiData & 0x0020)
uiInteger += 2;
if(uiData & 0x0010)
uiInteger += 1;
if(uiData & 0x0008)
uiDecimal += 5000; //转换为小数部分
if(uiData & 0x0004)
uiDecimal += 2500;
if(uiData & 0x0002)
uiDecimal += 1250;
if(uiData & 0x0001)
uiDecimal += 625;
uiBai = uiInteger/100; //小数点前面部分
uiResidue = uiInteger%100;
uiInteger = uiResidue;
uiShi = uiInteger/10;
uiResidue = uiInteger%10;
uiGe = uiResidue;
uiShi_d = uiDecimal/1000; //小数点后面部分
uiResidue = uiDecimal%1000;
uiDecimal = uiResidue;
uiBai_d = uiDecimal/100;
uiResidue = uiDecimal%100;
uiDecimal = uiResidue;
//显示
switch(ID)
{
case 1:
tt[2]=uiShi+'0' ;
tt[3]=uiGe+'0' ;
// tt[4]='.';
tt[5]= uiShi_d+'0';
tt[6]= uiBai_d+'0' ;
break;
case 2:
tt[11]=uiShi+'0' ;
tt[12]=uiGe+'0' ;
// tt[13]='.';
tt[14]= uiShi_d+'0';
tt[15]= uiBai_d+'0' ;
break;
case 3:
PP[4]=uiShi+'0' ;
PP[5]=uiGe+'0' ;
// PP[6]='.';
PP[7]= uiShi_d+'0';
PP[8]= uiBai_d+'0' ;
break;
default:break;
}
return uiShi*1000+uiGe*100+uiShi_d*10+uiBai_d ;
}
void Key_Scan(void)//按键扫描
{
static unsigned char spo=0;
P2_0=1;
P2_1=1;
P2_2=1;
P2_3=1;
if(P2_0==0) //全开
{
delay_ms(5);
if(P2_0==0)
{
ID_choose1=1;
ID_choose2=1;
ID_choose3=1;
while(P2_0==0)
{;}
}
}
if(P2_1==0) //开/关第一路
{
delay_ms(5);
if(P2_1==0)
{
ID_choose1=~ID_choose1;
while(P2_1==0)
{;}
}
}
if(P2_2==0) //开/关第二路
{
delay_ms(5);
if(P2_2==0)
{
ID_choose2=~ID_choose2;
while(P2_2==0)
{;}
}
}
if(P2_3==0) //开/关第三路
{
delay_ms(5);
if(P2_3==0)
{
spo++;
if(spo>8)
{
spo=0;
}
ID_choose3=~ID_choose3;
sSendComBuf[1]=ID_choose1; //路号
sSendComBuf[2]=TesTemperature1/100 ; //整数位
sSendComBuf[3]=TesTemperature1%100; //小数位
send_string_com(sSendComBuf,5);
while(P2_3==0)
{;}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -