
/* MCU: AT89S52
/* MCU-crystal: 12M
/* Version: 01
/* Last Updata: 2009-2-21
/* Author:
/* Description:
/* 使用定时器0,定时中断2ms一次对数码管显示扫描;
/* 三个位管要以扫描方式显示,使用共阳管,计灶首春数速度为1S;
/* 段A-H接到P0.1....7,位选为 P1.0,1,2;
/* 流水也以计数方式从200到250在P2口显示,低电平有效;
/****************************************************/
#include <reg52.h>
unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}//共阳数字字形芹凯0到9
unsigned char code bit_sel[]={0xfb,0xfd,0xfe}//低电平有效数字个十百位选择
unsigned char buf[3]={0,0,2}//计算中的个十百位暂时存放处
unsigned char one,ten,second//个十位变量和流水灯显示3秒的时间变量
unsigned char rate//扫描速度,调整以适应显示效果
unsigned char stop=0, flag=1,flag1=0//隐耐闪烁3秒的标志位,用于主函数对中断的关断参数传递
unsigned int t,tt//2ms变量
unsigned char rate//与变量t同步,辅助赋值变
/**********主函数**********/
main(void)
{
TMOD=0X01
TH0=0xf8//定时2ms
TL0=0x30
ET0=1
EA=1
TR0=1
while(1)
{ if(stop==1)//判断stop信号,为1后便关闭定时器
{ TR0=0
ET0=0
EA=0
}
}
}
/*******************中断*******************/
void timer0() interrupt 1
{
TH0=0xf8//重新赋值定时2ms
TL0=0x30
if(flag==0)//定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务
{
t++
if(t==500)
{ t=0
one++
P2=200+ten*10+one//在P2口的流水等,也是从200开始计数。
if(one==10)
{ one=0
ten++
if(ten==5)
{ flag=1//转向执行闪烁任务
}
}
}
}
else//flag已经==1;转向else执行流水灯闪烁任务
{ tt++
if(tt==500)
{ tt=0
second++
P2=~P2//流水灯全部以1S速度闪烁
if(second==3)stop=1//判断3秒时间到,关闭中断,停止闪烁,数码管熄灭
}
}
rate++
P0=0XFF//消隐
if(rate==3)rate=0
P0=num_disp[buf[rate]]
P1=bit_sel[rate]
buf[0]=one
buf[1]=ten
//因为百位没有变,所以不用赋值
}
我看了一些你的程序,没看到什么问题。显示不正常可能是因为:
1、硬件问题,ds18b20出现故障,可激辩余能性不大!
2、软件问题。18b20对时序要求非常严格,我要求学生练习时序的时候,就拿18b20作为实例
18b20对时序要求非常严格,我想问几个问题。你选用的晶振是多少?你严格按照说明书说的时序了吗?
我没有测试你的程序,只是结合我以前的程序给你一些建议
///////DS18B20初始化子程序////////
void DS18B20_rst(void)
{
DQ = 1
Delay(2)
DQ = 0
Delay(30)//精确延时 480~960us
DQ = 1
Delay(8)
}
unsigned int DS18B20_Read(void)
{
int i=0
unsigned int u=0
for (i=0i<16i++)
{
DQ=0
u>>=1
DQ=1
if(DQ) u|=0x8000
Delay(4)
}
return (u)
}
void DS18B20_Write(unsigned char ku)
{
int i=0
for (i=0i<8i++)
{
DQ=0
DQ =ku&0x01
Delay(3)
DQ=1
ku>>=1
}
}
void Display(void)
{
unsigned int tp
DS18B20_rst()
DS18B20_Write(0xCC)
DS18B20_Write(0x44)
DS18B20_rst()
DS18B20_Write(0xCC)
DS18B20_Write(0xBE)
tp=DS18B20_Read() //取得DS18B20读的温度值
tp=(unsigned int)(tp*6.25)
}
我的晶振是明滚11.0592,单片机用的是普灶扮通12分频的STC89C51
你对照改一下
OK希望对你能有帮助
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)