89c51单片机两个数码管同时工作怎么弄

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-29
单片机89c52如何控制多个数码管?

1.用两个锁存器来锁存数码管的段码和位码,进行动态扫描显示。2.用P3口的4位接一个BCD译码器控制数码管的段码,再P3口的3位接一个3-8译码器来控制数码管的位进行动态扫描。3.用P3口的两根串行线接串并转换IC,来驱动数码管。

display(second)子函数与两个数码管的连接方式有关
void main(void )//主程序
{
TMOD=0x01;// 定时器1工作方式一
ET0=1;
EA=1;
TH0=(65536-10000)/256;//定时10ms
TL0=(65536-10000)%256;
TR0=0;//上电先不启动
while(1)
{
if(key1==0)//判断按键是否按下
{
Delay1ms(10);//延时消抖
if(key1==0)
{
while(key1==0);//等待按键抬起
TR0=!TR0;//启动或停止
}
}
if(key2==0&&TR0==0)//判断按键是否按下及是否在走时
{
Delay1ms(10);//延时消抖
if(key2==0)
{
while(key2==0);//等待按键抬起
a=0; second=0;
}
}
display(second);
}

}
//中断子程序
void Timer0(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a++;
if(a==100 ) second++;
if(second==60) second=0;
}

89c51单片机两个以上数码管同时工作,一般采用扫描显示方式,如果加上按键(矩阵扫描按键)就是如下面的仿真图,可以作为参考,有参考代码如下。

#include<reg51.h>

#define uchar unsigned char

uchar temp;

int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f

unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned char ledx[8];

bit  s0,s1;

void delay(uchar z)

{

uchar i,j;

for(i=0;i<120;i++)

for(j=0;j<z;j++);

}

void scan()   //要是按键了,扫描键盘编码值

{

P1=0xF0;

delay(1);

temp=P1;

switch(temp)

{

case 0xe0: key1=0;

break;

case 0xd0: key1=1;

break;

case 0xb0: key1=2;

break;

case 0x70: key1=3;

break;

}

P1=0x0f;

delay(1);

temp=P1;

switch(temp)

{

case 0x0E: key=key1+0;

break;

case 0x0D: key=key1+4;

break;

case 0x0B: key=key1+8;

break;

case 0x07: key=key1+12;

break;

default : key=-1; 

}

if((key1+1)&&(key+1)) disbuf=key;

}

void ejjc()  //判断是否按键

{

P1=0xF0;

if(P1!=0xF0) { scan();s0=1;}

else { s0=0; s1=1;}

}

void main()

{

uchar i;

while(1)

{

ejjc();

if(s0==1  && s1==1)

{

s0=0;s1=0;

for(i=0;i<8;i++)

{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }

}

P0=0xff;

P2=LED7Code[ledx[0]];

P0=0xfe;

delay(5);

P0=0xff;

P2=LED7Code[ledx[1]];

P0=0xfd;

delay(5);

P0=0xff;

P2=LED7Code[ledx[2]];

P0=0xfb;

delay(5);

P0=0xff;

P2=LED7Code[ledx[3]];

P0=0xf7;

delay(5);

P0=0xff;

P2=LED7Code[ledx[4]];

P0=0xef;

delay(5);

P0=0xff;

P2=LED7Code[ledx[5]];

P0=0xdf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[6]];

P0=0xbf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[7]];

P0=0x7f;

delay(5);

}



那就最小的改动用你现在的程序,把两段穿插就好了,也就是在每个延时前同时给两个数码管输出端口赋值。比如
P0=p0[1];
P2=p2[1];
delay1s;
P0=p0[2];
P2=p2[2];
delay1s;
……
但其实这样是不规范的,用到了太多输出接口,电路复杂,单片机整机电流大,并且如果数码管很多关键不够用。超过一位数码管时一般用动态扫描法,也就是每个数码管的8个数据口并联,公共端位选口再用另外的单片机管脚控制,同一时刻只让一个亮,快速切换 比如1秒切换50次。视觉上就都能看到了

循环中,P0口和P1口同时控制数码管即可。
提供参考

void load_smg() //将数码管显示缓冲区的数据,显示到数码管上
{
char i;
for(i=0;i<4;i++)
{
P0=0xFF; //消除上一个循环的影子,因为i每一次叠代时,数码管都会有上一次叠代的痕迹,0xFF则是使所有数码管灭掉。
P1=0xFF;
P0 = seg[smgbuf[i]];
P1 = seg[smgbuf[i]];
P2 = ~(1<<i);
delay(200);
}
}

只要在延时之前,P0口和P2口同时赋值就可以了。例如,程序前3行:
P0=P0【1】;
P2=P2【1】;
delays( );延时程序

两个数码管统一接段选和位选就OK了。

  • 89c51单片机两个数码管同时工作怎么弄
    答:89c51单片机两个以上数码管同时工作,一般采用扫描显示方式,如果加上按键(矩阵扫描按键)就是如下面的仿真图,可以作为参考,有参考代码如下。include<reg51.h> define uchar unsigned char uchar temp;int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f u...
  • 用89C51单片机设计一个可以让串口控制两个数码管正常工作,补充电路图...
    答:该题是用单片机的串口,传送数据送给2位数码管显示,串口要选择工作在方式0,即做同步移位寄存器使用,工作在发送状态,用RXD做数据线,TXD做同步时钟使用。然后可以编程,发送如上数据为11111110B,测试数码管a段是否正常能亮。程序就不帮你写了,做为学生要自己动手,考试题要自己答才行。有了上面的编...
  • Protues 任务:89c51单片机控制两个数码管显示0~99(延时不要太短)_百 ...
    答:② 共阴极管的控制端接电源和共阳极管的控制端接地。
  • 利用单片机89C51芯片,数码管LED显示“0——59”计数延迟1秒。利用两块...
    答:P2_5=1;if(second%2==0){
  • 2位数码管显示00-99的89s51单片机电子秒表设计 的程序和电路图_百度...
    答:/*应该是 2位数码管显示00-99的89c51单片机电子秒表设计 的程序和电路图*/ P0段选 ,P2.0个位位选,P2.1十位位选 。共阳数码管 16M晶振。STRT EQU P2.5 STP EQU P2.6 CLRR EQU P2.7 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN: MOV R0,#20 M...
  • 求单片机89c51两位静态数码管和动态数码管计数程序
    答:unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮 /// void delay(unsigned int cnt){ while(--cnt);} /// main(){ unsigned char i;while(1){ P0=dofly[i];//取显示数据 P2=seg[i]; //取段码 delay(30000); //扫描间隙延时,这个时间比较长,用...
  • ...通过软件延时方式实现秒计时通过两个数码管动态显示秒表时间,时间...
    答:这原本是数字钟的程序 要6位数码管显示的,给你改了一下。硬件上需要89c51最小系统+74Hc573两片+数码管两位#include<reg51.h> sbit dula = P2^6;sbit wela = P2^7;sbit led1 = P1^3;define uint unsigned int define uchar unsigned char uint a,c,g;uint b = 5;long int num;uchar ...
  • 请帮下忙!用单片机89C51设计秒表,用两个7段数码管,按钮一复位/开始...
    答:元件的话很简单啊,只要有单片机最小系统所用到的元件,在家一个阻排,还有两个数码管就好另外加个按键暂停的
  • DS18B20+89C51单片机进行温度控制和两位数码管显示时,用ISIS仿真为什么...
    答:第一次读过来的应该是50H。然后第二次读过来的才是真实的数据。你单步执行,看看第一次读过来的温度数据,是不是50H,就知道你的读写程序是不是对。如果读写对的情况下,你再检查显示是不是合适,或者你直接把读温度的程序先不要运行,先直接让显示99,看是不是正常,然后再验证读写程序。
  • 89C51单片机驱动数码管
    答:要加驱动芯片的。因为数码管是共阴的,而一般的8051单片机的I/O端口的高电平拉电流只有300微安左右,不能驱动数码管,必须加驱动芯片。而如果是共阳数码管就不需要了,因为一般的8051单片机的I/O端口的低电平灌电流可达20毫安,足够驱动数码管了。建议:使用驱动芯片或改用共阳数码管。注意:在使用驱动...