1、程序运行时出现温度闪烁
2、温度十位秒点出现与时间显示秒点同时闪烁,但只是微亮。
是什么原因造成以上两点。
程序如何修改程序如下:
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define ON 0 //定义0为打开
#define OFF 1 //定义1为关闭
#define LEDBus P0 //定义p0口为数码管段码口
//数码管正向安装数码表
uchar code LEDTab[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
//0 1 2 3 4 5 6 7 8 9
//数码管反向安装数码表
uchar code LEDTab1[]={0x28,0x7d,0x32,0x34,0x65,0xa4,0xa0,0x3d,0x20,0x24,0x8a};
// 0 1 2 3 4 5 6 7 8 9 ℃
/******延时程序*******/
void delay1(unsigned int m)
{
unsigned int i,j;
for(i=m;i>0;i--)
for(j=80;j>0;j--);
}
/****************************************************************************
函数功能:延时子程序
入口参数:k
出口参数:
****************************************************************************/
void delay(unsigned int k)
{
unsigned int n;
n=0;
while(n < k)
{n++;}
return;
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
/****时钟 端口定义******/
***it PS3=P2^7; //时十位位选
***it PS2=P2^6; //时个位位选
***it PS1=P2^5; //分十位位选
***it PS0=P2^4; //分个位位选
***it PS4=P0^5; // 闪烁标志位
***it key=P3^5; //时间调整配合
////////////////////////////////////////////
/***************按键调时程序***************/
***it H_KEY=P3^6; //时调整键
***it M_KEY=P3^7; //分调整键
bit SHAN; //闪烁标志位
uchar second,minute,hour; //定义秒、分、时寄存器
void init(); //初始化函数
void display(); //显示函数
void min_
tiao(); //分调整函数
void hou_tiao(); //时调整函数
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/********定时器初始化*************/
void init()
{
TMOD=1; //定义定时器0,工作方式1
TH0=0x3c; //高8位
TL0=0xb0; //低8位
EA=1; //开全局中断
ET0=1;
TR0=1; //打开定时器
}
/***************************************
函 数 名:display
功 能:显示函数
说 明:
入口参数:无
返 回 值:无
***************************************/
void display()
{
LEDBus=LEDTab[minute%10]; //分个位送数码管显示
PS0=ON; //打开分个位位选
delay1(3); //显示1毫秒
PS0=OFF; //关闭分个位位选
LEDBus=LEDTab[minute/10]; //分十位送数码管显示
PS1=ON; //打开分十位位选
delay1(3); //显示1毫秒
PS1=OFF; //关闭分十位位选
LEDBus=LEDTab[hour%10]; //时个位送数码管显示
PS4=SHAN; //秒点闪烁
PS2=ON; //打开时个位位选
delay1(3); //显示1毫秒
PS2=OFF; //关闭时个位位选
if(hour/10) //如果时十位为0,不显示十位数字
{
LEDBus=LEDTab[hour/10]; //时十位送数码管显示
PS3=ON; //打开时十位位选
delay1(3); //显示1毫秒
PS3=OFF; //关闭时十位位选
}
}
/***************************************
函 数 名:min_tiao
功 能:分调整
说 明:
入口参数:无
返 回 值:无
***************************************/
void min_tiao()
{
if(!key)
{
while(!M_KEY) display(); //等待分调整键松开
second=0;minute++; //秒清零、分加1
if(minute==60) minute=0; //如果分等于60,分变0
}
}
/***************************************
函 数 名:hou_tiao
功 能:时调整
说 明:
入口参数:无
返 回 值:无
***************************************/
void hou_tiao()
{
if(!key)
{
while(!H_KEY) display() ; //等待时调整键松开
second=0;hour++; //秒清零,时加1
if(hour==24) hour=0; //如果时等于24,时变0
}
}
/***************************************
函 数 名:delay
功 能:延时函数
说 明:
入口参数:t:延时时间长短
返 回 值:无
***************************************/
//void delay(uchar t)
//{
//uchar i; //定义变量
// for(;t>0;t--) //如果t大于0,t减1(外层循环)
// for(i=124;i>0;i--); //i等于124,如果i大于0,i减1
// }
/***************************************
函 数 名:timer0
功 能:定时器0中断函数
说 明:
入口参数:无
返 回 值:无
***************************************/
void timer0() interrupt 1 //定时器0(中断1)
{
uchar tim1,tim2; //定义临时变量
TL0=TL0+0XB0;TH0=0X3C; //重装定时器初值
tim1++; //每中断一次tim1加1
if(tim1==10) //中断10(0.5秒)
{
SHAN=!SHAN; //闪烁标志取反
tim1=0;tim2++; //tim1清零,tim2加1
if(tim2==2) //到了1秒
{
tim2=0;second++; //tim2清零,秒加1
if(second==60) //如果秒到60
{
second=0;minute++; //秒变0,分加1
if(minute==60) //如果分到60
{
minute=0;hour++; //分变0,时加1
if(hour==24) hour=0; //如果时到24,时变0
}
}
}
}
}
/****温度 端口定义******/
***it wx5=P2^3; //温度十位位选
***it wx6=P2^2; //温度个位位选
***it wx7=P2^1; //温度小数点位选
***it wx8=P2^0; //断电关闭显示
***it DQ=P3^3; //DS18B20传感器入口
uint temp, temp1,temp2, xs;
//uchar code LEDTab[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
// 0 1 2 3 4 5 6 7 8 9
/*********************************定义全局变量******************************/
unsigned char tempL=0; //临时变量低位
unsigned char tempH=0; //临时变量高位
float temperature; //温度值
float i;
/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/
/*void delay1(void)
{
int k;
for(k=0;k<400;k++);
}
/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display1(int k)
{
wx5=0;
P0=LEDTab1[k%100/10];
delay1(2);
wx5=1;
/*
P0=LEDTab1[k/1000];
delay1();
*/
wx6=0;
P0=LEDTab1[k%10];
delay1(2);
//P3=0xfb;
wx6=1;
wx7=0;
P0=0x8a;
delay1(2);
wx7=1;
//P3=0xff;
}
/****************************************************************************
函数功能:DS18B20初始化子程序
入口参数:
出口参数:
****************************************************************************/
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //延时
DQ=0; //发送复位脉冲
delay(90); //延时(>480ms)
DQ=1; //拉高数据线
delay(14); //等待(15~60ms)
}
/****************************************************************************
函数功能:向DS18B20读一字节数据
入口参数:
出口参数:dat
****************************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/****************************************************************************
函数功能:向DS18B20写一字节数据
入口参数:dat
出口参数:
****************************************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
/****************************************************************************
函数功能:向DS18B20读温度值
入口参数:
出口参数:temperature
****************************************************************************/
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(20); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
//温度转换,把高低位做相应的运算转化为实际温度
temperature=((tempH*256)+tempL)*0.0625;
delay(40);
return(temperature);
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/*************************主函数****************************/
////////////////////////////////////////////////////////////
void main()
{
hour=12;
init();
while(1)
{
if(!H_KEY) hou_tiao(); //如果时调整键按下(为0),调用时调整函数
if(!M_KEY) min_tiao(); //如果分调整键按下(为0),调用分调整函数
display(); //调用时间显示函数
i=ReadTemperature(); //调取当前温度函数
display1(i); //调用温度显示函数
}
}
/***************************************
program end 程序结束
***************************************/