问题遇到的现象和发生背景
数码管显示有问题,主要就是温湿度当前数值的显示不能持续显示,总是跳闪,请个位帮我看看,刚才上次提出的问题我已经解决了。
温度是通过ds18b20调整 湿度是通过ad电压转换的
问题相关代码,请勿粘贴截图
#include "reg52.h"
#include "alonebutton.h"
#include "delay.h"
#include "iic.h"
#include "ls138.h"
#include "smg.h"
#include "onewire.h"
#include "keyboard.h"
#define KEY P1
unsigned char keynum;
bit ReadNowTempFlag = 0;
bit ReadNowHumFlag = 0;
sbit beep = P3^3;
float temp_f;
char temp_z;
unsigned char TMIN=11;
unsigned char TMAX=21;
unsigned char HMIN=10;
unsigned char HMAX=20;
unsigned char Tmode;
unsigned char Hmode;
unsigned char CT;
unsigned char CH;
unsigned int T_data=0;
unsigned char isShowReadNowHumFlag =1;
bit showVolFlag=0;
bit isShowCurvol=1;
unsigned char convertVal;
unsigned char setflag=0;//设置标志位 0为正常显示 1为更改上下限 2为保存退出
unsigned char modeflag=0; //模式标志位 0为温度 1为湿度
void initSystem(){
SelectHC573(4);//led
P0 = 0xff;
SelectHC573(5);//蜂鸣器
P0=0x00;
SelectHC573(0);
}
void initTimer0(){
TMOD =TMOD|0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
TR0=1;
EA =1;
}
void ServiceTimer0() interrupt 1
{
static unsigned int count = 0;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
showLed();
count++;
if(count%50==0&&modeflag==0){
ReadNowTempFlag = 1;
}
}
void initTimer1(){
TMOD =TMOD|0X10;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
ET1=1;
TR1=1;
EA =1;
}
void ServiceTimer1() interrupt 3
{
static unsigned int count1 = 0;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count1++;
if(count1%80==0&&modeflag==1){
ReadNowHumFlag = 1;
}
}
//////////////////////////////
unsigned int Read_Temperature()
{
unsigned char LSB , MSB;
unsigned int T_date;
TR0 = 0;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
TR0 = 1;
DelayMs(700);
TR0 = 0;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xBE);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
Init_DS18B20();
TR0 = 1;
T_date = 0x0000;
T_date = MSB;
T_date <<= 8;
T_date = T_date | LSB;
return T_date;
}
void UpdateSmg_temperature(){
if((T_data&0xf800)==0x0000){
temp_f=T_data*0.0625;
CT=temp_f;
if(CT/10>=1){
updateLed(6,CT/10);//十位
}else updateLed(6,10);//灭
updateLed(7,CT%10);//个位
}
}
unsigned char regionT(void)
{
if(CT<TMIN)
return 0;
if(CT>=TMIN&&CT<=TMAX)
return 1;
if(CT>TMAX)
return 2;
return 0;//其他情况为0
}
void UpdateSmgT(){
Tmode=regionT();
updateLed(0,13);
updateLed(1,12);
updateLed(2,Tmode);
updateLed(3,12);
updateLed(4,10);
updateLed(5,10);
UpdateSmg_temperature();
}
//////////////////////湿度
void getDateFrom8591()
{
convertVal=Read_PCF8591(1);
}
unsigned char regionH(void)
{
if(CH<HMIN)
return 0;
if(CH>=HMIN&&CH<=HMAX)
return 1;
if(CH>HMAX)
return 2;
return 0;//其他情况为0
}
void displayVol()//255 —>5v convertVal(0-255)-->vol(0-5v)-->湿度
{
float vol;
//if(isShowCurvol==1)//当前值
//{
getDateFrom8591();
vol=5.0/255*convertVal;
//val=vol*100;//扩大10倍方便求小数
CH=vol/5*100;
updateLed(6,CH/10);//十位
updateLed(7,CH%10);//个位
Hmode=regionH();
updateLed(0,14);
updateLed(1,12);
updateLed(2,Hmode);
updateLed(3,12);
updateLed(4,10);
updateLed(5,10);
// }
}
void updatelimt_temp()
{
updateLed(0,13);
updateLed(1,12);
updateLed(2,TMAX/10);
updateLed(3,TMAX%10);
updateLed(4,10);
updateLed(5,12);
updateLed(6,TMIN/10);
updateLed(7,TMIN%10);
}
void updatelimt_hum()
{
updateLed(0,14);
updateLed(1,12);
updateLed(2,HMAX/10);
updateLed(3,HMAX%10);
updateLed(4,10);
updateLed(5,12);
updateLed(6,HMIN/10);
updateLed(7,HMIN%10);
}
////////////////独立按键//////////
void updatesmg()
{
if(modeflag==0&&setflag==1)
{
updatelimt_temp();
}
if(modeflag==1&&setflag==1)
{
updatelimt_hum();
}
if(ReadNowTempFlag == 1&&modeflag==0&&setflag==0)
{
ReadNowTempFlag = 0;
T_data=Read_Temperature();
UpdateSmgT();
}
if(ReadNowHumFlag==1&&modeflag==1&&setflag==0)
{
ReadNowHumFlag=0;
displayVol();
}
}
void DoKeys_limt()
{
unsigned char keycode;
keycode = readKey();//因为没有按键按下,所以一直会等待按键。
switch(keycode)
{
case 19://设置
setflag++;
if(setflag>1){setflag=0;}//0为正常显示 1为更改上下限
break;
case 18://切换
modeflag++;
if(modeflag>1){modeflag=0;}// 0温度 1湿度
break;
case 17:
modeflag=0;
break;
case 16:
modeflag=1;
break;
case 15://温度上限 +
TMAX++;
if(TMAX>100)
TMAX=50;
break;
case 14://温度上限 -
TMAX--;
if(TMAX<=TMIN)
TMAX=TMIN+1;
break;
case 13://温度下限 +
TMIN++;
if(TMIN>TMAX)
TMIN=TMAX-1;
break;
case 12://温度下限 -
TMIN--;
if(TMIN<0)
TMIN=10 ;
break;
case 11://湿度上限 +
HMAX++;
if(HMAX>100)
HMAX=55;
break;
case 10://湿度上限 -
HMAX--;
if(HMAX<=HMIN)
HMAX=HMIN+1;
break;
case 9: //湿度下限 +
HMIN++;
if(HMIN>HMAX)
HMIN=HMAX-1;
break;
case 8://湿度下限 -
HMIN--;
if(HMIN<0)
HMIN=15 ;
break;
default: break;
}
updatesmg();
}
void main(){
initSystem();
initTimer0();
initTimer1();
while(1){
DoKeys_limt();
updatesmg();
}
}