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