89C52单片机怎么连接让P3口控制8个数码管?

如题所述

只想用P3口的话,必须另加控制元件。
1一种方法是用两个锁存器来锁存数码管的段码和位码,进行动态扫描显示。
2另一方法是,用P3口的4位接一个BCD译码器控制数码管的段码,再P3口的3位接一个3-8译码器来控制数码管的位进行动态扫描。
3再就是可以用P3口的两根串行线接串并转换IC,来驱动数码管。追问

不用P3怎么用其他的,我P0P1P2试了都不行,P0是控制8个二极管的

追答

数码管要共阳的

追问

P012用不了吗?

追答

都可以用,是你说要用P3口

追问

我P012用不了,不知道要怎么弄?P1好像就控制8个2级管,要怎么设置它能控制数码管?

追答

都可以用,是你说要用P3口

提供一个示例:

这个图是Proteus ISIS仿真上用的,位12345678因没有电流驱动,是不能实际使用的,仿真没问题。

程序如下:

#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LED_abc P0
#define LED_123 P2

sbit k3=P1^2;

//数码管显示(共阳): 0 1 2 3 4 5 6 7 8 9
uchar code dispArr[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
// 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
// 黑 全亮 点 -
0xFF,0x00, 0x7f, 0xbf};
uchar dispBuf[8]={0,1,2,3,4,5,6,7}; //显示缓冲区
//延时子程序
void delay(unsigned int a){
while(--a);
}

//显示子程序
void display(void)
{ uchar i;
uchar ik;
ik=0x01;
for(i=0;i<8;i++){
LED_abc=dispArr[dispBuf[i]];
LED_123=ik;
delay(200); //延时
LED_123=0x00; //关闭显示
ik<<=1;
}
}

//主函数
void main(void)
{
while(1){
display();
}
}

追问

怎么知道数码管要用某个口。我对P0进行操作为什么它就能改变那8个二极管的状态,前面也没申明P0口控制8个二极管,它怎么知道是哪个控制哪个的?

追答

P0=0xFF; 一个字节8个位,1111 1111 对应数码管dp,g,f,e,d,c,b,a笔画(段)。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-05

给你一个图

追问

看不懂,右边那个5V干嘛的

追答

右边+5V是数码管公共端(共阳极数码管)的电源。段码由P0口输出(低电平有效),位码由P3口输出(也是低电平有效,也可以用P1、P2口都可以)。

追问

电流不是要从上拉电阻那个5V流进二极管的吗,怎么是右边的

追答

使用的是共阳极的数码管,电流是从右边+5V经过PNP三极管流入数码管共阳极端,再流过a~g段LED,从a~g端口流出,再经过R2~R9(限流电阻)流入P0端口,在单片机内部流到地线。

追问

那个P3怎么控制它亮或不亮的?

追答

P3口为高电平时,PNP三极管截止,数码管公共端无电,就不亮了。
P3口为低电平时,PNP三极管导通,数码管公共端有电,就点亮显示,具体显示数字由P0口段码决定。

本回答被提问者和网友采纳
第2个回答  2013-05-06
用P3口的4位接一个BCD译码器控制数码管的段码,再P3口的3位接一个3-8译码器来控制数码管的位进行动态扫描。
第3个回答  2013-05-06
不妨到我们这个电子世家单片机群:255847245,里面的同行或许能帮得到你。
相似回答