任务四 键控流水灯和LED数码管显示
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
般10ms左右, 超过这一时间再去执行显示程序,它就会闪烁,所
以LED的位数不能太多。
动态扫描具体实现方法:
显示缓冲区
待显示信息数组
0 1 Dt[0]
0 2 Dt[1]
0 3 Dt[2]
0 4 Dt[3]
0 5 Dt[4]
0 6 Dt[5]
首先在内部数据存储器的若干连续单元中开辟一个显示缓冲区 数组,每个单元顺序对应一个数码管,在调用动态扫描子函数以 前,先在数组中写入各数码管要显示的数字和字符在字型表中离 开表头位置的值,这样当动态扫描显示程序要向字型口输出字型 时,只要读得该对应缓冲区内的值,通过查字型表获得输出字型。 注意不是把缓冲单元的值直接输出。
0 2 da[1]
0 3 da[2]
0 4 da[3]
0 5 da[4]
0 6 da[5]
取数地址指针修正 位选值修正
i←i+1 r ←r<<1
TAB[ ] ={0x3F ,0x06 ,0x5B,0x4F, 0x66, 0x6D, 0x7D,0x07,0x7F, 0x67。。。 0x71};
#include<reg51.h> unsigned char code dt[]={0x01,0x02,0x03,0x04,0x05,0x06}; //待显示的信息在显示缓冲区数组; unsigned char code
P2和P3分别为位选和字型口。编程调试。
练习2
将显示"年月日“(140416)、”班级学号”
(A3--05)、“P ”(P后面5个空格)和“H-----”
四种不同的显示方式,在同一程序中以2S轮流循环
显示。 练习3 编程将unsigned char a=567892的值在6位LED 中显示出来。
2S循环显示四种不同信息的程序结构
动态扫描子程序流程图:
开始
建立显示缓冲区取数首地址指针 预置位扫描初值
i←0 r←01
各管全显示 完? N
r=0x20? 或i=6
Y 子函数 返回
位扫描值送位选口, 选中某位数码管
P3←r
从显示缓冲区取数
a1←dt[i]
查字型表送字型输出口
P1←TAB[a1]
调用延时
延时1MS
1MS子函数
0 1 da[0]
0x07,0x7F,0x67,0x77,0x3D,0x39,0x5E,0x79,0X71,0X73,0X76,
0X00,0X6E,0x40}; void delay1 (unsigned int); display(); unsigned char i; //
unsigned char count=200;//
} display( ) // LED动态扫描显示子函数 { unsigned char r=0xfe; unsigned char a,j=0; r=0xfe; //1位选通,要根据数码管类型和硬件电路决定,若0选通应该为 r=0xfe; while (j<6) // 6个数码管没全扫完,继续扫描 { P3=r; //选通某位 a=dt[i+j]; //显示缓冲区去该位要显示的内容 P0=TAB_Font[a];//查字型表向字型口输出字型 delay1 (1); //延时1ms r<<=1; r|=1; //移位选中下一数码管,指针修正 j++; } P0=0x00; // 6个数码管没全完,输出熄灭字型。 }
位选口
动态显示的原理
某一时刻位选先选通其中一位,如对图中的共阳数码管,要 使最左边位能点亮,则令P2.0为0,其余位选位均为1;这时在字 型口输出该位要显示的数字(或字符)的字型,亮1ms左右;接 着位选选通另一位,其余位选关闭,字型口输出该位要显示的数 字(或字符)的字型,虽然这时前一位位选已关闭,但基于眼睛 的惰性,前一位显示的数字或字型还留在眼中,依次一位位循环 显示下去,直至最后一位显示完毕,一个动态扫描显示过程结束。 可见动态扫描显示是在执行动态扫描显示程序的。要连续显示 必须反复的去执行动态扫描显示程序。一般可把动态扫描显示编 成个子函数,主函数反复去调用它。人眼的惰性有一定时间,一
6
7
8
9
A
B
C
D
E
F
0X73, 0X76, 0X00,0X6E }; (显示: P H 熄灭 Y )
笔画0点亮的LED字型表
TAB[ ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x83, (显示: 0 1 2 3 4 5 6
0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
任务四 键控流水灯和 LED数码管显示
4.1 LED显示
LED显示的原理
数码管的每段笔画其实就是一个单独的发光二极管,内部有两 种不同的连接方式,若将各二极管的阳极都连在一起引出个公共 端——称共阳数码管,如图(a);若将各二极管的阴极都连在一 起引出个公共端——称共阴数码管如图(b);使用时将共阴数码 管公共端接低电平,若某笔画端接高电平则对应笔画点亮,共阳 反之。所以购买和使用时必须高清是共阳还是共阴的。
LED的显示可分静态和动态显示。静态显示是各只数码管单 独用一只显示译码器,单片机与显示器的连接如下图如示:
当某只数 码管要显示某 一数或字符时 单片机向该管 的锁存端发允 许写入电平, 并向P1口发出 显示的十六进 制数,其余管 不允许写入, 接着发锁存信 号。
共阳数码管组成的动态扫描电路
+5V VCC P0.7 k3 k2 k1 k0
main() { while (1) display( ); } display( ) // LED动态扫描显示子函数 { r=1; //1位选通,要根据数码管类型和硬件电路决 定,若0选通应该为r=0xfe; i=0; while (r!=0x40) // 6个数码管没全扫完,继续扫描 { P3=r; //选通某位 a=dt[i]; //显示缓冲区去该位要显示的内容 P0=TAB_Font[a];//查字型表向字型口输出字型 delay1 (1); //延时1ms r<<=1; i++; //移位选中下一数码管,指针修正 } P0=0xff; //字型口送熄灭符 }
TAB_Font[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x83,0xF8,0x8
0,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x8C,0xFF,0x89};//共 阳字型表数组 unsigned r=1; //位输出口初值,选中最左位LED void delay1 (unsigned int); //延时1ms子函数原型说明
7 8 9 A B C D E F
0x8C,0x89, 0xFF,0x91 }; (显示: P H 熄灭 Y )
Proteus演示——硬件图
练习:
1、画出单片机控制6共阳LED数码管显示的电
路图1,P0和P3口分别为字型口和位选口。
2、用主子函数结构调试6管LED动态扫描程序
3、在图1的基础上,将其改为6位共阴数码管,
r<<=1;
i++; if(r==0x40) { r=1; i=0; }
//扫描位左移(在实际图中即右移)
//指针加1 //6 位扫描结束判断 // 结束后指针复位
} }
// 延时程序1 void delay1 (unsigned int ms) { unsigned int i,j;
for(i=0;i<ms;i++)
main() { ET0=1; // T0允许中断 EA=1; //CPU允许中断 TMOD=0x11; //T0定时方式1 TH0=-10000>>8; //定时时间10ms TL0=-10000; TR0=1; //定时器启动开始定时 P0=0x00; //字型熄灭 P3=0xff; //位选关闭 i=0; //显示缓冲区取数指针复零 while (1) { if (count==0) //如果定时2S时间到 {count=200; //外部定时计数器置初值 i=i+6; //显示缓冲区调整到下一显示区
包含头文件
来自百度文库
数组和全局变量定义并赋值 1、显示四个不同信息的一维数组 2、显示字型表数组 3、2S定时的外部计数变量 4、显示缓冲区四个不同内容的取数指针
子函数原型说明 延时1MS子函数, 显示动态扫描子函数
主函数
子函数和定时计数器 中断服务函数
开始 初始化 定时计数器初始、中断初始、2S 外部计数器赋初值、取数指针 i=0,显示第一行内容
Proteus演示——硬件图
4位数码管动态显示实例
笔画1点亮的LED字型
TAB[ ]={0x3FH,0x06 ,0x5B ,0x4F, 0x66. 0x6D, (显示: 0 1 2 3 4 5
0x7D,0x07,0x7F, 0x67,0x77 ,0x7C ,0x39 ,0x5E, 0x79, 0X71,
P1.3 P1.2 P1.1 P1.0 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
a b c d e f g h
+5V
EA
RST
89C52
P2.0 P2.1 P2.2 P2.3 P2.4 P2.5
LED显示动态显示的原理
静态显示的优点显示稳定,不存在闪烁。与CPU并行工作。 但从静态显示的硬件可以看出,当选用的数码管越多,译码器的 数量也随之增多,这样会增加硬件的开销。为此人们采用动态显 示。如图所示 字型口
main()
{
//主函数
unsigned chaar i=0,a; //定义变量i —显示缓冲区数组元素
指针,a—某位待输出信息
while (1)
{ P2=r; a=dt[i]; P0=TAB_Font[a]; delay1 (1); // 选中某一位 //从显示缓冲区数组取出该位显示信息 // 查字型表,输出字型 //延时1ms
for(j=0;j<60;j++) ; }
动态显示作为子函数的程序设计
#include<reg51.h> unsigned char code dt[]={0x01,0x02,0x03,0x04,0x05,0x06}; unsigned char code TAB_Font[]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x83,0xF8,0x80,0x90,0x88,0x83,0x C6,0xA1,0x86,0x8E,0x8C,0xFF,0x89}; unsigned r=1; unsigned i=0,a; void delay1 (unsigned int); display();
if(i==24) //四种显示内容都显示完毕,指针重新调整到第 i=0;} //一显视区 display( ); //调用显示子函数 }
/*延时程序*/ void delay1 (unsigned int ms) { unsigned int i,j; for(i=0;i<ms;i++) for(j=0;j<114;j++) ; } /*定时计数器0中断服务程序* / void isr_t0(void) interrupt 1 { TH0=-10000>>8; TL0=-10000; count--; }
4.2
查键程序
键盘作为单片机应用系统最常见的输入设备,在一般 的应用系统中都是必须的。键个数比较少时,可采用独立式 键盘,即每个键单独与单片机的一个I/O口相连,如图所示
C2
30p
C1
30p
X1
19
U1
XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17
While(1){
if(count==0){
2S定时时间到?
Y
取数指针修正 i+6, 2S外部时间计数器赋初值。
N
显示到最后一行了?
N
Y
取数指针复位i=0.
}
调用显示子函数
}
主函数流程
unsigned char code dt[]={1,4,0,4,1,6, 10,3,0x14,0x14,0,2, 0x10,0x12,0x12,0x12,0x12,0x12, 0x11,0x14,0x14,0x14,0x14,0x14}; unsigned char code TAB_Font[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,