单片机:数码管显示实验

一、 实验目的

(一) 掌握单片机 I/O 口的输出控制;
(二) 熟悉开发板上单片机 I/O 口与数码管的电路连接;
(三) 掌握 keil C 软件的使用;
(四) 掌握数码管的静态显示、 动态显示。

二、 主要仪器设备及耗材

(一) 电脑一台;
(二) 单片机开发板一套。
三、 实验原理
(一) 数码管显示原理
数码管是一种半导体发光器件, 其基本单元是发光二极管。 也就是说
数码管是由发光二极管(LED) 来组成的, 这种显示器有共阴极与共阳极
两种, 使用 LED 显示器时, 要注意区分这两种不同的接法。 其外形结构如
图 2.1 所示,
其内部结构图如图 2.2 所示。
单片机:数码管显示实验_第1张图片
如图 2.2(a) 所示, 共阳极数码管的 8 个发光二极管的阳极(二极管
正端) 连接在一起。 通常, 公共阳极接高电平, 其它管脚接段驱动电路输
出端。 当某段驱动电路的输出端为低电平时, 则该端所连接的字段导通并
点亮。 根据发光字段的不同组合可显示出各种数字或字符。 此时, 要求段
驱动电路能吸收额定的段导通电流, 还需根据外接电源及额定段导通电流
来确定相应的限流电阻。
如图 2.2(b) 所示, 共阴极数码管的 8 个发光二极管的阴极(二极管
负端) 连接在一起。 通常, 公共阴极接低电平, 其它管脚接段驱动电路输
出端。 当某段驱动电路的输出端为高电平时, 则该端所连接的字段导通并
点亮, 根据发光字段的不同组合可显示出各种数字或字符。 此时, 要求段
驱动电路能提供额定的段导通电流, 还需根据外接电源及额定段导通电流
来确定相应的限流电阻。
1.数码管字形编码
要使数码管显示出相应的数字或字符, 必须使段数据口输出相应的字
形编码。 对照图 2.2(a) 和(b) , 字型码各位定义为: 数据线最低位与 a
字段对应, 次地位与 b 字段对应……, 依此类推。 如使用共阳极数码管,
数据为 0 表示对应字段亮, 数据为 1 表示对应字段暗; 如使用共阴极数码
管, 数据为 0 表示对应字段暗, 数据为 1 表示对应字段亮。 如要显示“0”,
共阳极数码管的字型编码应为: 11000000b(即 c0h) ; 共阴极数码管的字
型编码应为: 00111111b(即 3fh) , 依此类推。
2.静态显示
静态显示是指数码管显示某一字符时, 相应的发光二极管恒定导通或
恒定截止。 这种显示方式的各位数码管相互独立, 公共端恒定接地(共阴
极) 或接正电源(共阳极) 。 每个数码管的 8 个字段分别与一个 8 位 I/O 口
地址相连, I/O 口只要有段码输出, 相应字符即显示出来, 并保持不变, 直
到 I/O 口输出新的段码。 采用静态显示方式, 较小的电流即可获得较高的亮
度, 且占用 CPU 时间少, 编程简单, 显示便于监测和控制, 但其占用的口
线多, 硬件电路复杂, 成本高, 只适合于显示位数较少的场合。
3.动态显示
动态显示是一位一位地轮流点亮各位数码管, 这种逐位点亮显示器的
方式称为位扫描。 通常, 各位数码管的段选线相应并联在一起, 由一个 8
位的 I/O 口控制; 各位的位选线(公共阴极或阳极)由另外的 I/O 口线控制。
动态方式显示时, 各数码管分时轮流选通, 要使其稳定显示, 必须采用扫
描方式, 即在某一时刻只选通一位数码管, 并送出相应的段码, 在另一时
刻选通另一位数码管, 并送出相应的段码。 依此规律循环, 即可使各位数
码管显示将要显示的字符。 虽然这些字符是在不同的时刻分别显示, 但由
于人眼存在视觉暂留效应, 只要每位显示间隔足够短就可以给人以同时显
示的感觉。
采用动态显示方式比较节省 I/O 口, 硬件电路也较静态显示方式简单,
但其亮度不如静态显示方式, 而且在显示位数较多时要依次扫描, 占用 CPU
较多的时间。

(二) 电路原理图

8 位数码管与单片机 I/O 口电路连接原理图如图 2.3 所示。
单片机:数码管显示实验_第2张图片
单片机:数码管显示实验_第3张图片
如图 2.3(a) 所示, 8 位数码管的段选端接 74HC245 芯片的数据输出第 9 页 共 58 页
端, 74HC245 芯片的数据输入端接单片机 P0 口。
如图 2.3(b) 所示, 8 位数码管的位选端接 138 译码器的数据输出端,
138 译码器的数据输入端接单片机 P22~P24 口。
四、 实验内容及步骤
(一) 实验内容
在 8 位数码管上显示自己的生日, 要求数码管不闪烁。 显示格式为:
XX—XX—XX, 例如: 11—05—01
(二) 实验步骤
1.根据电路原理图编写 C 程序, 调试并烧写入单片机;

#include 

sbit a=P2^2;
sbit b=P2^3;
sbit c=P2^4;

//定义要选中的数码管
#define smg1 c=1;b=1;a=1
#define smg2 c=1;b=1;a=0
#define smg3 c=1;b=0;a=1
#define smg4 c=1;b=0;a=0
#define smg5 c=0;b=1;a=1
#define smg6 c=0;b=1;a=0
#define smg7 c=0;b=0;a=1
#define smg8 c=0;b=0;a=0

#define uint unsigned int

//显示数字0-9
code char number[] = {
     0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void delay(uint ms)
{
     
 	 char i;
	 while(ms--)
	 {
     
	  	for(i=0; i<110; i++);
	 }
}

void main()	   //11-50-01
{
     
 	while(1)
	{
     
		smg1;
	 	P0 = number[1];
		delay(10);
	
	  	smg2;
		P0 = number[1];
		delay(10);

	  	smg3;
		P0 = 0x40;
		delay(10);

	  	smg4;
	 	P0 = number[0];	 //11-05-01
	    delay(10);

	  	smg5;
	 	P0 = number[5];
		delay(10);

	  	smg6;
	 	P0 = 0x40;
		delay(10);
		
		smg7;
	 	P0 = number[0];
		delay(10);

	  	smg8;
	 	P0 = number[1];
		delay(10);
	}

}

你可能感兴趣的:(笔记,c,单片机,嵌入式)