数码管动态显示模块设计
实验三 数码管动态显示模块设计
09电信一班叶晓伟 07号 实验目的
1、理解数码管动态显示原理
2、理解数码管动态显示电路的设计方法
3、掌握数码管动态显示程序的设计方法
4、掌握单片机定时器与中断系统的使用方法
实验仪器
单片机开发板、万利仿真机、稳压电源、计算机
实验原理
1、 数码管动态显示原理
几乎所有的单片机应用系统都要用到数码显示。数码显示是一个占用IO资源较多、程序设计较复杂的模块。在设计时,应从IO占用与软件复杂程度两方面考虑。这里以8位数码管动态显示电路以例说明工作原理。电路如图4-4所示。
图4-4 8位数据码动态显示电路
数码管显示器的8个笔划段a-hp同名端连在一起,而每一位数码管显示器的公共端(1,2,3,4)各自独立地受三极管控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于数码管的公共端,而这一端是由74LS164控制的,所以我们只要控制164的输出数据就可以决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的公共端,使各个显示器轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的
视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。图中100欧电阻起限流作用,保护发光二极管。电阻值越小,发光二极管越亮。2K电阻是位选端限流电阻,保护位选三极管。
由上图可知,这里的数码管是共阳极型。数码管上显示一些符号,必须给数码管的笔形口接低电平信号,给要显示的位公共端送高电平,相应位的数码管就可以显示所要的符号。
2、 数码管动态显示程序设计
数码管动态显示程序包含显示数字、部分字母符号、小数点、数码管闪烁、数码管消隐等。其它程序输出到显示程序的数据既可以是BCD码、二进制码、ASCII码、自定义显示码等。假设显示的符号与数据的对应关系如下:
显示符号 0 1 2 3 4 5 6 7 8 9 数据 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 显示符号 A B C D E F H 全亮 全暗 - 数据 0AH 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H
由硬件电路工作原理可知,为了显示稳定的数据,每秒必须显示数据50次以上,才能达到预期目的。
首先设计一个能显示一位数的程序,然后重复执行这段程序,并改变所显示的内容。由上一实验内容可知,可把位选数据的输出用两输出位选数据-1 种方法实现:位选数据每显示一位送一字节;
位选数据每显示一位送一位二进制数。程序流
程图如4-5所示。 第一位显示数据,
N Y 0写入74LS164 1写入74LS164 数码管动态显示
初始化显示缓冲区首地 返回 址,显示计数器
取缓冲区一字节数,并
输出位选数据-2 转换成显示码
DIN=0,CLK=0,位选数据设输出位选数据,并延时 定为左边第1位显示 1ms
位选数据左移一位,移出的位
显示指针指向下一字送到DIN,CLK产生正脉冲
节,计数器减1 CLK产生一个正脉冲 输出数据位数减1 N
显示计数为0
输出完成, Y
返回 返回
图4-5 数码管动态显示程序流程图
3、 小数点显示原理
在显示数据时,显示小数是一个必要功能。但在前面的分析中,并没有包含显示小数点的内容。小数点的显示方式有:
(1)固定式:小数点的显示位置不能改变,程序设计较简单。
(2)特征位式:每位二进制数控制一个小数点的亮暗情况,一个字节同时控制8个。
(3)计数式:用数字控制第N位的小数点亮。如:5
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示第5位小数点亮,其它暗。
(4)ASCII码式:送到显示缓冲区的数是ASCII码数据,在包含“.“时,相应位的小
数点亮。
这里以第(2)种为例说明,其它方式由读者自行设计。
假定小数点控制数据dispdot的各位情况如下所示。
D7 D6 D5 D4 D3 D2 D1 D0 第1位小第2位小第3位小第4位小第5位小第6位小第7位小第8位小数点开关 数点开关 数点开关 数点开关 数点开关 数点开关 数点开关 数点开关
当对应位为1时,小数点亮;当对应位为0时,小数点暗。小数点显示的信息可以在显示码输出之前,也可以在扫描一帧结束后单独显示小点数。原理说明:当显示第一位数据时,判断dispdot的D7是否为1,如果为1点亮第一位小数点,为0熄灭第一位小数点。流程图如图4-6所示。
转成显示码
当前小数点位
0 1
小数点亮,并与显示小数点暗,并与显示
码合并输出 码合并输出
输出位选数据
图4-6 小数点控制程序流程图
4、 单片机定时器的工原理
MCS-51 单片机内部有两个16 位可编程的定时器/计数器T0 和T1。它们即可用作定时器方式,又可用作计数器方式。其中T0 由TH0 和TL0 计数器构成;T1 由TH1 和TL1 计数器构成。
工作于定时器方式时,通过对机器周期(新型51单片机可以对振荡周期计数)的计数,即每一个机器周期定时器加1,来实现定时。故系统晶振频率直接影响定时时间。如果晶振频率为12MHZ,则定时器每隔(1/12MHZ)×12=1us 加1。
工作于计数器方式时,对P3.4 或P3.5 管脚的负跳变(1?0)计数。它在每个机器周期的S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,计数器加1。因此需要两个机器周期来识别一个有效跳变,故最高计数频率为晶振频率的1/24。
特殊功能寄存器TMOD 用于定时器/计数器的方式控制。高4 位用于设置T1,低4 位用
所示。 于设置T0。如图4-7
图4-7 定时器模式控制字格式
TCON 寄存器用于定时器的计数控制和中断标志。如图4-8所示。
图4-8 定时控制寄存器数据格式
编写程序控制这两个寄存器就可以控制定时器的运行方式。
单片机内部定时器/计数器的使用,简而概之:(1)如需用中断,则将EA和相关中断控制位置1;(2)根据需要设置工作方式,即对TMOD设置;(3)然后启动计数,即对TR0或TR1置1。(4)如使用中断,则计数溢出后硬件会自动转入中断入口地址;如使用查询,则必须对溢出中断标志位TF0或TF1进行判断。
5、 用定时器编写一个秒计时器
假设系统使用的晶振频率为12MH,即每个机器周期为1us。如使用方式1,则定时时间Z16最长是2×1us=65536us=65.536ms,小于1s。故必须设置一个软件计数单元,即假设定时器定时中断时间为50ms,则必须定时中断20次才达到1s并对秒计时单元加1,20即为软件计数次数。最后再把秒计时单元的值转成显示数码送显示缓冲区。
定时器中断服务程序
保护现场
N 软件计数-1=0,
Y
秒计时器加1,转成显
示数据并送显示
恢复现场
中断返回
图4-9 定时器应用程序流程图
6、 单片机中断系统结构及工作原理
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
51单片机的中断系统有五个中断源。分别为:
中断源 入口地址 优先级别(同级)
外部中断0 0003H 最高
定时器0 溢出 000BH
外部中断1 0013H
定时器1 溢出 001BH
串行口中断 0023H 最低
使用中断之前,必须对中断允许寄存器IE 进行设置,将中断允许标志EA 和对应中断位置1,以将中断打开。中断控制结构如图4-10所示。
图4-10 MSC51中断结构图
CPU中断的过程为:当有中断源发生中断信号时,首先对IE中对应的中断位判断;如打开,则进行EA判断;如EA=1,将根据中断优先级IP的设置情况进行优先级判别;如该中断优先级较高,在硬件控制下,先将程序计数器PC的内容压入堆栈,同时把被响应的中断服务程序的入口地址装入PC中,以执行中断服务程序。中断服务程序的最后一条指令必须是中断返回指令RETI。CPU执行完这条指令后,将从堆栈中弹出两个字节内容(断点地址)装入PC中,从而执行被中断的程序。
实验内容
1、在数码管上显示学号的后8位
答:#include
#define uint unsigned int
#define uchar unsigned char
sbit CLK=P3^4;
sbit DIN=P2^3;
bit flag;
uchar shi,ge;
uchar num,num1;
uchar code
table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x7
1,0xFD };//0到F的代码
uchar code table1[]={0x09,0x99,0x03,0x01,0x9f,0x03,0x9f,0x9F}; // 学号的代码94081007
void init(); //初始化函数声明
void delay(uint t) //延时函数
{
uint i,j;
for(i=t;i>0;i--)
for(j=125;j>0;j--);
}
void wei(uint x) //数码管第X位显示
{
uchar y,z;
for(y=8;y>9-x;y--)
{
DIN=1;
CLK=0;
CLK=1;
}
DIN=0;
CLK=0;
CLK=1;
for(z=8;z>x;z--)
{
DIN=1;
CLK=0;
CLK=1;
}
}
void main()
{
init(); //初始化
while(1)
{
uchar i;
if(flag==0)
{
shi=num/10; //取倒计时的十位
wei(7); //取数码管第7位
P0=table[shi]; //送数据显示
delay(1); //延时
P0=0xff; //消隐
ge=num%10; //取倒计时的个位
wei(8); //取数码管第8位
P0=table[ge];
delay(1);
P0=0xff;
}
if(flag==1)
{
for(i=0;i<8;i++) //循环扫描学号
{
wei(i+1);
P0=table1[i];
delay(1);
P0=0xff;
}
}
}
}
void time0() interrupt 1 //时间为1S的定时器中断函数
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num1++;
if(num1==20)
{
num1=0;
num--;
if(num<0)
{
TR0=0; //定时器0停止工作
flag=1; //置标志位为1
}
}
}
void init() //初始化函数 {
TMOD=0x11; //定时器0工作方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器中断
TR0=1; //定时器0开始工作
num=21; //赋倒计时初值
}
2、设计一个以学号后两位加10秒的倒计时程序 答:#include
#define uint unsigned int #define uchar unsigned char sbit CLK=P3^4;
sbit DIN=P2^3;
sbit key=P1^0;
char num,numsave,shu,wei;
char wei2,xwei;//位数以及 小数点移动
uchar code table[]={0x03, 0x9F,0x25,0x0D,0x99,0x49, 0x41,0x1F,0x01,0x09,0x11, 0xC1,0x63,0x85,0x61,0x71,0xFE };//0到F以及小数点。的代码
void delay(int t) //延时函数
{
int i,j;
for(i=t;i>0;i--)
for(j=125;j>0;j--); }
void clear164()//将164输出所以清零
{
char k;
for(k=0;k<8;k++)
{
DIN=1;
CLK=0;
CLK=1;
}
}
void display(char,char); uchar keyscan(); //键盘扫描
void weic(); //改变按键让显示不同
void main()
{
clear164();
shu=2; //初始化显示的数为2,位数为第四位
wei=3;
while(1)
{
num=keyscan();
weic();
}
}
void display(char wei1,char shu1)
{
uchar m,n;
clear164();
DIN=0;
for(n=wei1;n>0;n--)//去掉没有显示的位数
{
CLK=0;
CLK=1;
DIN=1;
}
CLK=0;
CLK=1;
P0=table[shu1]; //显示号码的位数
delay(5);
for(m=8-wei;m>0;m--)//去掉剩下的位数
{
DIN=1;
CLK=0;
CLK=1;
}
}
uchar keyscan() {
char i,j;
j=0;
clear164();
P0=0xff; //清除没有用到的位显示
DIN=0;
for(i=0;i<8;i++)
{
CLK=0;
CLK=1;
DIN=1;
if(key==0) //判断检测端口是否为0,若是就为按键值
{
delay(10);
if(key==0)
{
while(!key); //松手检测
j=i+1;
}
}
}
return j;
}
void weic()
{
if(num==4) //按键++
{
shu++;
if(shu>9)
{
shu=0;
}
}
if(num==5) //按键--
{
shu--;
if(shu<0)
{
shu=9;
}
}
if(num==1) //按键左移
{
++wei;
if(wei>7)
wei=0;
}
if(num==7) //按键右移
{
wei--;
if(wei<0)
wei=7;
}
if(num==8) //按键小数点左移
{
xwei++;
if(xwei>7)
xwei=0;
}
display(xwei,16);//显示小数点
display(wei,shu);
delay(2); }
思考
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
1、运行上面的程序,计算显示程序每秒运行的次数, 2、请说明数码管的消隐(数据不显示,内容保持不变)如何实现。 3、在实验程序基础上编写一个24小时计时时钟。 4、说说把显示程序放在主程序和定时中断程序的优缺点。 5、如何提高单片机定时器的定时精度。