项目六_数码管显示原理
项目六 数码管显示原理
学习目的:
1. 介绍STC89C51的数码管显示的原理;
2. 掌握单个数码管静态显示的原理;
3. 熟悉四位一体数码管动态显示的原理;
4. 掌握单片机数码管显示的C51程序编程。
常用的LED显示器有LED状态显示器(俗称发光二极管)、LED七段显示器(俗称数码管)和LED十六段显示器。发光二极管可显示两种状态,用于系统状态显示;数码管用于数字显示;LED十六段显示器用于字符显示。
一、数码管简介
1(数码管的结构
数码管由8个发光二极管(以下简称字段)构成,通过不同的组合可用来显示数字0 ~9、字符A ~ F、H、L、P、R、U、Y、符号“-”及小数点“.”。数码管的外形结构如下图所示。数码管又分为共阴极和共阳极两种结构。常用的LED显示器为8段(或7段,8段比7段多了一个小数点“dp”段)。有共阳极和共阴极两种
其结构如下图所示:
图6-1 数码管结构图
2(数码管
工作原理
数字放映机工作原理变压器基本工作原理叉车的结构和工作原理袋收尘器工作原理主动脉球囊反搏护理
共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
3(数码管字形编码
要使数码管显示出相应的数字或字符,必须使段数据口输出相应的字形编码。字型码各位定义为:数据线D0与a字段对应,D1与b字段对应„„,依此类推。如使用共阳极数码
管,数据为0
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示对应字段亮,数据为1表示对应字段暗;如使用共阴极数码管,数据为0表示对应字段暗,数据为1表示对应字段亮。如要显示“0”,共阳极数码管的字型编码应为:11000000B(即C0H);共阴极数码管的字型编码应为:00111111B(即3FH)。依此类推。
下图为LED显示器的结构原理图。N个LED显示块有N位位选线和8×N根段码线。 段码线控制显示的字型,位选线控制该显示位的亮或暗。静态显示和动态显示两种显示方式。
图6-2 LED显示器的结构原理图
二、静态显示接口
静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止。这种显示方式的各位数码管相互独立,公共端恒定接地(共阴极)或接正电源(共阳极)。每个数码管的8个字段分别与一个8位I/O口地址相连,I/O口只要有段码输出,相应字符即显示出来,并保持不变,直到I/O口输出新的段码。采用静态显示方式,较小的电流即可获得较高的亮度,且占用CPU时间少,编程简单,显示便于监测和控制,但其占用的口线多,硬件电路复杂,成本高,只适合于显示位数较少的场合。
图6-3 4位静态数码显示电路
上图中各位的公共端连接在一起(接地或+5V)。 每位的段码线(a,dp)分别与一个8位的锁存器输出相连。显示字符一确定,相应锁存器的段码输出将维持不变,直到送入另一个段码为止。显示的亮度高。该电路各位可独立显示。
三、动态显示接口
动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示器的方式称为位扫描。
通常,各位数码管的段选线相应并联在一起,由一个8位的I/O口控制;各位的位选线(公共阴极或阳极)由另外的I/O口线控制。动态方式显示时,各数码管分时轮流选通,要使其稳定显示,必须采用扫描方式,即在某一时刻只选通一位数码管,并送出相应的段码,在另一时刻选通另一位数码管,并送出相应的段码。依此规律循环,即可使各位数码管显示将要显示的字符。虽然这些字符是在不同的时刻分别显示,但由于人眼存在视觉暂留效应,只要每位显示间隔足够短就可以给人以同时显示的感觉。
图6-4 4位动态数码显示电路
上图所有位的段码线相应段并在一起,由一个8位I/O 口控制,形成段码线的多路复用,各位的公共端分别由相应的I/O线控制,形成各位的分时选通。
图6-4为4位8段LED动态显示电路。其中段码线占用一个8位I/O口,而位选线占用一个4位I/O口。
采用动态显示方式比较节省I/O口,硬件电路也较静态显示方式简单,但其亮度不如静态显示方式,而且在显示位数较多时,CPU要依次扫描,占用CPU较多的时间。
四、定时/计数器应用程序举例
1.在四位一体数码管个位上上显示数字1。
(1)硬件原理图
本教材配套开发板中,数码管的段选控制信号由连接器J15分别接到单片机P0.0~P0.7,位选控制信号由连接器J16分别接到单片机P2.0~P2.3。四个三极管对位选信号进行驱动,位选控制信号为低电平时,相应的数码管被选中。具体的原理图如图6-5所示。
12e11d10dp
J159116P00P0.0c215P01P0.18145314P02P0.2g413P03P0.326512P04U8P0.4ab千百十611P05数码管P0.53710P06P0.6f89P07P0.7
个CON16
7J1618P2_0P2.027P2_1P2.1Q1Q2Q3Q436P2_2P2.245P2_3P2.3
CON8S9012S9012S9012S9012
P00P01R27R28R29R30P02+5V4.7k4.7k4.7k4.7kP03P04P05P06P07
P2_0P2_1P2_2P2_3
图6-5 四位一体数码管原理图 (2)程序流程图
具体程序流程图见图6-6所示。
(3)软件代码
#include
void main()
{
P2=0xfe; //选中个位
P0=0xf9; // 1
while(1);
}
2.在四位一体数码管各位依次显示0~F,间隔时间为1秒。 (1)硬件原理图
具体原理图参见图6-5。
(2)程序流程图
具体程序流程图见图6-7所示。
(3)软件代码
#include
#define uchar unsigned char
#define uint unsigned int
uchar data smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,
0xa1,0x86,0x8e};
void delay(uint t) //0.2ms * t 供参考 {
uchar time;
do
{
time=100;
while(--time);
}
while(--t);
}
void cycle()
{
uchar i;
P2=0xfe;
while(1)
{
for(i=0;i<16;i++)
{
P0=smg[i];
delay(5000);
}
}
}
void main()
{
cycle();
}
3.在四位一体数码管上动态显示8952。 (1)硬件原理图
具体原理图参见图6-5。
(2)程序流程图
具体程序流程图见图6-8所示。
(3)软件代码
#include
#define uchar unsigned char
uchar data smgd[]={0x80,0x90,0x92,0xa4}; //8952
uchar data smgw[]={0xf7,0xfb,0xfd,0xfe}; //位
void delay(uchar t) //0.2ms * t 供参考
{
uchar time;
do
{
time=100;
while(--time);
}
while(--t);
}
void show()
{
uchar i;
while(1)
{
for(i=0;i<4;i++)
{
P0=0xff; //消影
P2=smgw[i]; //位
P0=smgd[i]; //段
delay(21);
}
}
}
void main()
{
show();
}
五、实训
1.实训目的
进一步了解掌握四位一体数码管显示的静态显示方式,掌握编程方法,能够熟练编写相
关控制程序。
2.实训内容
(1)定时器报警器
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
(定时器T1定时,数码管显示20秒倒计时,时间为0时触发蜂鸣
器鸣叫)。
(2)四位一体数码管四个位同时显示0~F,时间间隔为1秒,利用定时器定时。
(3)四位显示(分+秒)的数字时钟。
3.实训步骤
1)用Keil51编写代码,调试、编译后生成.hex文件。 2)将开发板上连接器J3、J15、J16用跳线帽连接。 3)利用STC-ISP下载软件,将.hex文件下载到单片机ROM中。 4.软件代码
实训(1)软件代码:
#include
#define uchar unsigned char
sbit P21=P2^1;
sbit P20=P2^0;
sbit wave=P3^4;
#define thr {P0=0xff;P21=0;P20=1;} // 宏定义
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数 #define fou {P0=0xff;P21=1;P20=0;}
uchar x=20;
uchar t=0;
uchar data smg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uchar t) // t * 0.2 ms 参考 {
uchar time;
do
{
time=100;
while(--time);
}
while(--t);
}
void init() // 初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void show() // 显示 {
if(x/10) // 高位灭零
{
thr P0=smg[x/10];
delay(21);
}
fou P0=smg[x%10];
delay(21);
}
void fire() // 报警程序 {
wave=0;
while(1); // 程序终止 }
void cycle()
{
while(1)
{
if(t/20) // 1s
{
t=0;
x--;
if(x==0)
{
P0=0xc0; // 显示 0
fire(); // 20秒到了,调用报警程序
}
}
show();
}
}
void main()
{
init();
cycle();
}
void zd()interrupt 1 {
t++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; }
实训(2)软件代码:
#include
#define uchar unsigned char
uchar x=0;
uchar data smg[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void init()
{
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void wx() // 四位同时显示 {
P2=0xf0;
}
void cycle()
{
uchar i=0;
while(1)
{
if(x/20) // 定时达到1s
{
P0=smg[i];
x=0;
i++;
if(i==16)
i=0;
}
}
}
void main()
{
init();
wx();
cycle();
}
void zd()interrupt 3
{
x++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; }
实训(3)软件代码:
#include
#define uchar unsigned char
sbit P23=P2^3;
sbit P22=P2^2;
sbit P21=P2^1;
sbit P20=P2^0;
#define one {P0=0xff;P23=0;P22=1;P21=1;P20=1;} // 宏定义函数
#define two {P0=0xff;P23=1;P22=0;P21=1;P20=1;}
#define thr {P0=0xff;P23=1;P22=1;P21=0;P20=1;}
#define fou {P0=0xff;P23=1;P22=1;P21=1;P20=0;}
uchar m=0,s=0,x=0; // 初值为零 uchar data smg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uchar t) // 0.2ms * t 参考 {
uchar time;
do
{
time=100;
while(--time);
}
while(--t);
}
void init() // 初始化 {
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void show() // 显示 {
one P0=smg[m/10];
delay(21);
two P0=smg[m%10];
delay(21);
thr P0=smg[s/10];
delay(21);
fou P0=smg[s%10];
delay(21);
}
void deal() // 查询处理 {
if(x/20)
{
x=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
}
}
}
}
void cycle()
{
while(1)
{
deal();
show();
}
}
void main()
{
init();
cycle();
}
void zd()interrupt 1
{
x++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
思考与练习
1.数码管显示的原理及结构。 2.数码管显示的静态原理及编程。 3.数码管显示的动态原理及编程。