89c51单片机两个数码管同时工作怎么弄
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单片机两个以上数码管同时工作,一般采用扫描显示方式,如果加上按键(矩阵扫描按键)就是如下面的仿真图,可以作为参考,有参考代码如下。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...
答:该题是用单片机的串口,传送数据送给2位数码管显示,串口要选择工作在方式0,即做同步移位寄存器使用,工作在发送状态,用RXD做数据线,TXD做同步时钟使用。然后可以编程,发送如上数据为11111110B,测试数码管a段是否正常能亮。程序就不帮你写了,做为学生要自己动手,考试题要自己答才行。有了上面的编...
答:② 共阴极管的控制端接电源和共阳极管的控制端接地。
答:P2_5=1;if(second%2==0){
答:/*应该是 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...
答: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 ...
答:元件的话很简单啊,只要有单片机最小系统所用到的元件,在家一个阻排,还有两个数码管就好另外加个按键暂停的
答:第一次读过来的应该是50H。然后第二次读过来的才是真实的数据。你单步执行,看看第一次读过来的温度数据,是不是50H,就知道你的读写程序是不是对。如果读写对的情况下,你再检查显示是不是合适,或者你直接把读温度的程序先不要运行,先直接让显示99,看是不是正常,然后再验证读写程序。
答:要加驱动芯片的。因为数码管是共阴的,而一般的8051单片机的I/O端口的高电平拉电流只有300微安左右,不能驱动数码管,必须加驱动芯片。而如果是共阳数码管就不需要了,因为一般的8051单片机的I/O端口的低电平灌电流可达20毫安,足够驱动数码管了。建议:使用驱动芯片或改用共阳数码管。注意:在使用驱动...