闫丽娟
(山西水利职业技术学院信息工程系,山西 运城 044004)
自1970年单片机出现后,直到现在已经在工业、仪器仪表、机电一体化、家用电器及国防等领域普遍使用[1],其中,很多数据都需要直观地显示出来,而通过单片机与数码管相结合,再加上程序很容易实现。
单片机最小系统是单片机达到可以工作的程度所必须搭配的元器件再加上单片机本身所构成的系统。对于MCS-51系列单片机,以AT89S51为例,其最小系统主要包括:电源、晶振、复位,必要时还需要给P0口配上上拉电阻,本文中用电阻排来实现。
接下来依次对这几个要素来分析。
电源:所有的电子元器件都是需要供电才能工作的,单片机也不例外。现选用的AT89S51需要配以5 V的电源。第40个引脚Vcc接+5 V,第20个引脚Vss接地。
晶振:单片机及其外围基准部件要有一个时间基准,才能确保有序工作。这个时间基准可以通过内部和外部两种时钟方式来获取,外部时钟方式是使用现有的外部振荡器产生的时钟信号,内部时钟方式通常是用两个30pF电容和一个12 MHz或11.059 2 MHz石英晶体构成的电路组成。
复位:可以分为上电复位、手动复位和程序自动复位三种。程序自动复位是用软件实现,上电复位是单片机通电后本身内部的初始化过程,手动复位是按图1中的按钮即可实现复位。
图1 单片机的最小系统
要实现数字0-99的循环显示,只需要在上述单片机最小系统的基础上,将两个数码管接到单片机的I/O口上即可。
图2 硬件电路图
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelayms(uint);
void main (void)//主程序
{
uchar hum;//定义一个要显示的数字
while(1)
{
P0=seg[hum/10];//分离出要显示数字的十位
P3=seg[hum%10];//分离出要显示数字的个位
delayms(100);
hum++;
if(hum==100)hum=0;//清零
}
}
void delayms(uint j)//延时子程序
{
uchari;
for(;j>0;j--)
{
i=250;
while(--i);
i=249;
while(--i);
}
}
将上面的程序在Keil中编译运行可得到一个hex文件,然后在proteus中将它加载到单片机上进行仿真,能够很直观的看到数字0-99循环显示[2]。
这是一种静态显示的方法,用这样的方式比较简单,但是每个数码管都要占用一个I/O口,使得I/O口的利用率大幅降低[1]。但是对于单片机的学习来说,这种方法有助于理解。在实际应用中,一般会采用动态显示的方式,节约I/O口资源。
[1] 张毅刚.单片机原理与应用设计(C51编程+Proteus仿真)[M].北京:电子工业出版社,2016.
[2] 胡鹏.王飞.基于AT89C52的数字电压表仿真设计[J].数字技术与应用,2012(2):22-24.