麻烦大神帮我看下这个程序哪不对了
时间:10-02
整理:3721RD
点击:
#include <reg52.h>
#include <intrins.h>
unsigned char code DispLED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极
// 0 1 2 3 4 5 6 7 8 9
sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 74LS138译码器方式
sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制
sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制
sbit been=P1^5;
sbit led=P1^1;
void scan();
void delayus(unsigned char i); //微妙级别延时函数
void InitT();
unsigned char t=0;
unsigned int num=0;
void scan()
{
//显示时间
delayus(13000);
P0=DispLED[t]; //个位
LS138A=1; //选择到底用哪一个七段数码管来显示这位数据
LS138B=1;
LS138C=1;
}
void delayus(unsigned int i)
{
unsigned int x;
for(x=i;x!=0;x--)
{
_nop_;
}
}
void InitT()
{
TMOD=0x01; //定时器0,工作方式1:16位手动动灌装,定时器1,工作方式0:13位手动灌装
TH0=(65536-50000)/256; //装初值12Mhz晶振,定时50ms计数50000次
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void T0_time() interrupt 1 //T0中断服务函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20) // 1秒到
{
num=0;
if(t==9) //
{
t=0;
}
else
t++;
}
}
void main()
{
InitT(); //对定时器进行初始化
while(1)
{
switch(t)
{
case 0:
been=0; // 开启蜂鸣器
delayus(300);
been=1; //关闭蜂鸣器
delayus(300);
break;
case 9:
led=1; //把led灯点亮
delayus(300);
led=0; //把led灯关闭
delayus(300);
break;
default:
break;
}
scan(t);
}
}
做到的效果是到0响声,到9led亮,有什么地方不对麻烦了。
#include <intrins.h>
unsigned char code DispLED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极
// 0 1 2 3 4 5 6 7 8 9
sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 74LS138译码器方式
sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制
sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制
sbit been=P1^5;
sbit led=P1^1;
void scan();
void delayus(unsigned char i); //微妙级别延时函数
void InitT();
unsigned char t=0;
unsigned int num=0;
void scan()
{
//显示时间
delayus(13000);
P0=DispLED[t]; //个位
LS138A=1; //选择到底用哪一个七段数码管来显示这位数据
LS138B=1;
LS138C=1;
}
void delayus(unsigned int i)
{
unsigned int x;
for(x=i;x!=0;x--)
{
_nop_;
}
}
void InitT()
{
TMOD=0x01; //定时器0,工作方式1:16位手动动灌装,定时器1,工作方式0:13位手动灌装
TH0=(65536-50000)/256; //装初值12Mhz晶振,定时50ms计数50000次
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void T0_time() interrupt 1 //T0中断服务函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20) // 1秒到
{
num=0;
if(t==9) //
{
t=0;
}
else
t++;
}
}
void main()
{
InitT(); //对定时器进行初始化
while(1)
{
switch(t)
{
case 0:
been=0; // 开启蜂鸣器
delayus(300);
been=1; //关闭蜂鸣器
delayus(300);
break;
case 9:
led=1; //把led灯点亮
delayus(300);
led=0; //把led灯关闭
delayus(300);
break;
default:
break;
}
scan(t);
}
}
做到的效果是到0响声,到9led亮,有什么地方不对麻烦了。
延时函数问题。
void delayus(unsigned int i)
{
unsigned int x;
for(x=i;x!=0;x--)
{
_nop_();
}
}
//经过调试,在12M晶振条件下,
执行一次delayus(1);时间为19us,
执行一次delayus(2);时间为28us,
由此可以计算出调用delayus(n);
的时间为:(19-(28-19) ) +(28-19)*n=10+n*9;
在你的数码管程序中出现了delayus(13000);
可以计算出延时长为13000*9+10=117010us;
我们除去其他延时,可估计数码管扫描频率只有不到10hz,
蜂鸣器驱动驱动不到频率5hz。
所以最终导致数码管闪烁,或者根本不亮,蜂鸣器不发声。