永发信息网

编程大神帮忙看看这是51单片机89C52控制6位数码管的程序 帮忙修改呗

答案:3  悬赏:0  手机版
解决时间 2021-12-04 08:30
  • 提问者网友:温柔港
  • 2021-12-03 22:31
编程大神帮忙看看这是51单片机89C52控制6位数码管的程序 帮忙修改呗
最佳答案
  • 五星知识达人网友:拾荒鲤
  • 2021-12-03 23:15
这是根据你的程序修改成功后还原的仿真图:

修改后的程序如下:

//52头文件
#include //特殊寄存器定义


//变量类型宏
#define uint unsigned int //无符整型变量
#define uchr unsigned char //无符字符变量


//变量定义
uchr aa; //中断计次
uchr miao,fen,xiaoshi; //秒,分,时计数
uchr shiwan,wan,qian,bai,shi,ge; //显示位的值


//段、位锁存端
sbit dula=P2^6; //段码锁存控制
sbit wela=P2^7; //位码锁存控制


//共阴数码管显示编码
uchr code table[]= //指定存放到程序ROM区
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //0~7
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71, //8~F
};


//延时程序
void delay(uint z) //延时函数
{
uint x,y; //循环变量
for(x=z;x>0;x--) //嵌套循环
for(y=110;y>0;y--);
}


//显示程序
void display(uchr shiwan,uchr wan,uchr qian,uchr bai,uchr shi,uchr ge)
{
shiwan=xiaoshi/10;
wan=xiaoshi%10;
qian=fen/10;
bai=fen%10;
shi=miao/10;
ge=miao%10;


wela=1; //开位码锁存
P0=0xfe; //左起第1位数码管
wela=0; //关闭位码锁存
dula=1; //开段码锁存
P0=table[shiwan]; //显示十万位的值
dula=0; //关闭锁存
P0=0xff; //清总线

delay(5); //延时


wela=1;
P0=0xfd; //左起第2位数码管
wela=0;
dula=1;   
P0=table[wan]|0x80; //显示万位值(加上点)
dula=0;
P0=0xff;
delay(5);


wela=1;
P0=0xfb; //左起第3位数码管
wela=0;
dula=1;
P0=table[qian]; //显示千位值
dula=0;
P0=0xff;
delay(5);

wela=1;   
P0=0xf7; //左起第4位数码管
wela=0;
dula=1;   
P0=table[bai]|0x80; //显示百位值(加上点)
dula=0;   
P0=0xff;   
delay(5);   


wela=1;
P0=0xef; //左起第5位数码管
wela=0;
dula=1;
P0=table[shi]; //显示十位值
dula=0;
P0=0xff;
delay(5);


wela=1;
P0=0xdf; //左起第6位数码管
wela=0;
dula=1;
P0=table[ge]; //显示个位值
dula=0;
P0=0xff;
delay(5);  
}


//初始化程序
void init() //定时器T0初始设置
{
miao=0;
fen=0;
xiaoshi=0;

TMOD=0x01; //定时器T0工作方式1
TH0=(65536-50000)/256; //装定时50ms初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开T0中断
TR0=1; //启动T0 定时计时
}


//主程序
void main()
{
init(); //初始化
while(1) //循环
{ display(shi,ge,bai,qian,wan,shiwan); } //依次显示从个位到十万位
}


//中断服务程序
void timer0() interrupt 1 //T0中断服务程序
{
TH0=(65536-50000)/256; //重装定时初值
TL0=(65536-50000)%256;
aa++; //中断次数 +1


if(aa==20) //如果中断20次,即 1 秒钟
{
aa=0; //中断计次值清0,重新计数
miao++; //秒 +1
if(miao==60) //如果秒为60(即1分钟),
{
miao=0; //秒计数清0
fen++; //分 +1
if(fen==60) //分计数到60 (即1小时)
{
fen=0; //分计数清 0
xiaoshi++; //小时 +1
if(xiaoshi==24)xiaoshi=0; //如果小时计数到24,小时清0
}
}
}
}


这个不采纳,真的过不去了!!!
全部回答
  • 1楼网友:空山清雨
  • 2021-12-04 01:27
把硬件图发给我,我给你改下程序就是了。
  • 2楼网友:封刀令
  • 2021-12-03 23:49
我这个可以参考下,稍微改改就行了,我没有锁存器

#include
#define uchar unsigned char//char 256;
#define uint unsigned int
uint num;
uchar bai,shi,ge,qian,aa,a=0,c;
sbit Beep=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();

void dlay(z);
void main()
{
init();
while(1)
{
display(qian,bai,shi,ge);
if(num==5)
{
Beep=0;
c=1;

}

if(c==1)
{
a++;
}
if(a>=10000000)
{
Beep=0;
c=0;
a=0;
}

//if(num==5)
// {
// Beep=0;
//dlay(10);
//Beep=1;
//dlay(10);
//}

}

}
//
void init()
{
EA=1;//首先开启总中断允许 ;
TMOD=0x01;//设置定时器0方式1开启16位定时/计数器;
TH0=(65536-50000)/256;//65536为计数器存满最大值,50000为50微秒;装入初值
TL0=(65536-50000)%256;//装入初值
ET0=1;//TR0=1;开定时器0中断;
TR0=1;//定时器0开启
}
//
void timer0() interrupt 1 //定时器0工作方式1,网上也能看到using是汇编用的表示的是地几个寄存器,在using后面带数字
{
//
TH0=(65536-50000)/256;//65536为计数器存满最大值,50000为50微秒;装入初值
TL0=(65536-50000)%256;//装入初值
//
aa++;

if(aa==20)
{
aa=0;//计数个数清零
qian=num/10000;//千位分离
bai=num%1000/100;//将百位分离出来
shi=num%100/10;//将十位分离出来
ge=num%10;//将个位分离出来
num++;

if(num==1000)
{
num=0;
}

}

}

void display(uchar qian,uchar bai,uchar shi,uchar ge)
{

P0=table[qian];
P1=0xfe;//选择第一个数码管
dlay(1);
P0=table[bai];
P1=0xFD;//第二个数码管选择
dlay(1);
P0=table[shi];
P1=0xFB;
dlay(1);
P0=table[ge];
P1=0xF7;
dlay(1);
}

//
void dlay(z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯