基于proteus的51单片机仿真实例六十
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于proteus的51单片机仿真实例五十九、1位数码管显示实例
1、数码管实际上是由7个发光二极管组成一个8字形,另外一个发光二极管做成圆点型,这样就构成了一个数码管。所有的8个二级管的正极或者负极都连到一个公共端点上,对于公共端连在正极的数码管,称为共阳极数码管,反之称为共阴极数码管。
根据数码管的部结构原理,可以很清楚的知道数码管显示数字的原理。
2、由于单片机的IO口的驱动能力有限,而数码管点亮时需要较大的电流,所以在用单片成数码管显示系统时,需要增加驱动电路,最简单的驱动电路就是利用三极管的电流放大能力来输出较大的电流,
3、让数码管显示数字的步骤为:
1)使数码管的公共端连到电源(共阳极)或者地(共阴极)上。
2)向数码管的各个段输出不同的电平。
本例使用单个数码管循环显示0-9这10个数字。
4、在keil c51中新建工程ex47,编写如下程序代码,编译并生成ex47.hex文件
#include
//延时函数,延时约200ms
void delay(void)
{
unsigned char i,j;
for(i = 0; i < 255;i++)
{
for(j = 0;j < 255;j++);
}
}
//主函数
void main(void)
{
unsigned char i;
unsigned char code Tab[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90};
//定义数字0-9的段码表
P2 = 0xfe; //P2.0输出低电平,数码管电源导通
while(1)
{
for(i = 0;i < 10;i++) //循环10次。数码管循环显示数字0-9
{
P0 = Tab[i]; //P0口输出数字0-9对应的段码
delay(); //延时
}
}
}
5、在proteus中新建仿真文件ex47.dsn,电路原理图如下所示:
需要说明的是在proteus中,查找排阻(不带公共端)和数码管的方法。
查询数码管元件时,输入关键字“7seg-..”后,就可以看到各种数码管的电路符号。根据需要选择相应数码管即可。排阻的查找方法:查找带公共端的排阻时,输入关键字“respack”即可。
不带公共端的排阻,输入关键字“RX8”即可
6、将ex47.hex文件载入at89c51中,启动仿真,按动按键,观察程序运行结果,下图是某一时刻程序运行结果
基于proteus的51单片机仿真实例六十、8位数码管显示实例
1、本例实现在8位数码管上同时显示多个不同字符。
2、本例使用了8只集成式7段共阳数码管(pruteus中元件标识为7seg-mpx8-ca-blu,共阳为ca,共阴为cc),所有8个数码管的段码引脚a,b,c,d,e,f,g,dp都是分别并联在一起,任何时候发送的段码均会传送到所有数码管上,所有的数码管的共阳极是独立的,本例中个数码管的共阳极分别与8只NPN三极管射极相连,程序运行时,任意时刻仅允许一只数码管的共阳极连接+5V,当向连接段码的端口发送段码值时,相应数字只会显示在某一只数码管上。
3、为了使不同数码管显示不同字符,本例使用的是集成式多位数码管常用的动态扫描显示技术,他利用了人的视觉暂留特征,选通第一只数码管时,发送1的段码;选通第二只数码管时,发送2的段码,...每次仅选通一只数码管,发送相应的段码,每次切换选通下一数
码管并发送相应段码的时间间隔非常短,视觉惰性使人感觉不到字符是一个接一个显示在不同的数码管上的,而会觉得所有的字符很稳定的同时显示在不同数码管上。
在控制两位数码管选通的时间间隔时,要注意全屏的扫描频率要高于视觉暂留频率16-20Hz。对于程序中的点亮一位数码管的延时时间,我们可以尝试将延时时间改为其他数值,观察会出现什么样的效果。
4、在keil c51中新建工程ex48,编写如下程序代码,编译并生成ex48hex文件
/*****************************************************************************
* LED数码管显示演示程
序 *
* 在8个LED数码管上依次显示1,2,3,4,5,6,7,8 * *******************************************************************************/
#include
#include
//段码表
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
//毫秒级延时函数
void delay(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主函数
void main()
{
unsigned char k,m=0x80; //变量定义
P0 = 0xff; //先关闭数码管
P2 = 0x00; //
while(1)
{
for(k = 0;k < 8;k++) //循环8次
{
P2 = 0x00; //每显示一位都要关闭位选端口一次m=_crol_(m,1); //循环左移
P2=m; //每次选通一个位选端口
P0=dis_code[k+1]; //段码送P0口
delay(2);
}
}
}
5、在proteus中新建仿真文件ex48.dsn,电路原理图如下所示