数码管消隐单片机课程设计报告文档格式.docx
- 文档编号:17614911
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:43
- 大小:433.23KB
数码管消隐单片机课程设计报告文档格式.docx
《数码管消隐单片机课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《数码管消隐单片机课程设计报告文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
LED显示器有共阳极和共阴极两种,共阴极LED显示器是发光二极管的阴极连在一起,通常此公共阴极接地;
共阳极LED显示器是发光二极管的阳极连在一起,公共阳极接正电压。
通过LED显示器中二极管的亮灭,则显示不同的字符或数字。
数码管外形图如下,共阴极显示如“HELLO”的数据代码如下。
D7
D6
D5
D4
D3
D2
D1
D0
显示
数值代码
h
g
f
e
d
c
b
a
1
H
76H
E
79H
L
38H
O
3FH
-
40H
共阴极发光二极管内部结构图
多位数码管的动态显示
在多位8段数码管显示时,为了简化硬件电路,通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O口控制,形成段选线的多路复用。
而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”。
在这种方式中,虽然每一时刻只选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多位数码管同时被点亮了。
多位8段LED动态显示器电路,其中段选线占用一个8位I/O口,位选线占用一个8位I/O口,由于各位的段选线并联,段线码的输出对各位来说都是相同的。
因此,同一时刻,如果各位位选线都处于选通状态的话,8位LED将显示相同的字符。
若要各位LED能够显示出与本位相应的显示字符,就必须采用扫描显示方式,即在某一位的位选线处于选通状态时,其它各位的位选线处于关闭状态,这样,8位LED中只有选通的那一位显示出字符,而其它位则是熄灭的。
同样,在下一时刻,只让下一位的位选线处于选通状态,而其他的位选线处于关闭状态。
如此循环下去,就可以使各位“同时”显示出将要显示的字符。
由于人眼有视觉暂留现象,只要每位显示间隔足够短,则可造成多位同时亮的假象,达到显示的目的。
多位数码管分别显示不同数字,这种扫描显示方式成为动态扫描,并不停变化赋值当高位值为0是不显示该位,即消隐。
如数字0010,实际显示为10,前2位0不显示。
如果不消隐,一位显示完后,显示下一位时,下一位的字形码也会加到这位,造成乱码。
原因:
CPU的执行速度很快,当送入位选和段选数据后,接着又送入位选数据,但该位的段选数据还没有送入,所以该位还保持着上次的段选数据,接着该位的段选数据送入,由于视觉残留,两个段选数据的显示效果重合,形成了混乱。
1.2电路原理图
1.3参考程序
/*-----------------------------------------------
名称:
多位数码管动态扫描显示变化数据数码管消隐
内容:
多位数码管分别显示不同数字,这种扫描显示方式成为动态扫描,并不停变化赋值
当高位值为0是不显示该位,即消隐,如数字0010,实际显示为10,前2位0不显示
------------------------------------------------*/
#include<
reg52.h>
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
sbitLATCH1=P2^2;
//定义锁存使能端口段锁存
sbitLATCH2=P2^3;
//位锁存
unsignedcharcodedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//显示段码值0~9
unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];
//存储显示值的全局变量
voidDelay(unsignedintt);
//函数声明
voidDisplay(unsignedcharFirstBit,unsignedcharNum);
/*------------------------------------------------
主函数
main()
{
unsignedintnum;
unsignedintj;
while
(1)
{
j++;
if(j==10)//检测当前数值显示了一小段时间后,需要显示的数值加1,实现数据显示的变化
{
j=0;
num++;
if(num==10000)//用于显示0~9999
num=0;
}
if(num<
1000)//如果小于1000则千位不显示
TempData[0]=0;
else
TempData[0]=dofly_DuanMa[num/1000];
//分解显示信息,如要显示68,则68/10=668%10=8
if(num<
100)//如果小于100则千位和百位都不显示
TempData[1]=0;
TempData[1]=dofly_DuanMa[(num%1000)/100];
10)//如果小于10,则千位、百位和十位都不显示
TempData[2]=0;
TempData[2]=dofly_DuanMa[((num%1000)%100)/10];
TempData[3]=dofly_DuanMa[((num%1000)%100)%10];
Display(2,4);
}
}
延时函数,含有输入参数unsignedintt,无返回值
unsignedint是定义无符号整形变量,其值的范围是
0~65535
voidDelay(unsignedintt)
while(--t);
显示函数,用于动态扫描数码管
输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
voidDisplay(unsignedcharFirstBit,unsignedcharNum)
unsignedchari;
for(i=0;
i<
Num;
i++)
{
DataPort=0;
//清空数据,防止有交替重影
LATCH1=1;
//段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit];
//取位码
LATCH2=1;
//位锁存
LATCH2=0;
DataPort=TempData[i];
//取显示数据,段码
Delay(200);
//扫描间隙延时,时间太长会闪烁,太短会造成重影
按键从右至左输入
2.1项目简介
按键作为一种简单实用的输入设备已经应用于各种单片机应用系统中,可谓是无处不在。
但在不同的实用场合下所使用的按键也不尽相同。
这里就对几种经常用到的按键及其使用方法进行介绍。
1、传统按键:
传统按键是现在在各种电子设备中应用最为广泛的按键,可能它们的形状各有不同,但其控制方法却大同小异,利用按键是否按下的IO电平状态变化来对其进行识别。
2、直接按键:
最简单的键盘就是把电平信号直接接到IO上。
在程序里面读取IO电平状态,如果读到相应的电平,则说明此IO上所接的按键被按下。
这种方法原理与控制方法都非常简单,但造成了IO
资源的浪费。
这种按键方式的示意图如下:
3、扫描按键矩阵:
这种按键输入方式很巧妙地利用了IO资源,使得8个IO可以实现16键键盘。
它的示意图如下:
这种按键输入方式比上面的直接按键方式从原理与控制上都比上面的直接按键要复杂。
它通过IO的扫描来获取键值,其实扫描过程非常简单,过程如下:
KEY1~KEY4对应于IO0~IO3,KEY5~KEY8对应于IO4~IO7。
1.将IO0~IO3置高,将IO4置低,IO5、IO6、IO7置高,读取IO0~IO3。
第一列的某个按钮按下后,使相应的两个触点接通,相应行上的IO可以读到低电平。
2.将IO0~IO3置高,将IO5置低,IO4、IO6、IO7置高,读取IO0~IO3。
3.将IO0~IO3置高,将IO6置低,IO4、IO5、IO7置高,读取IO0~IO3。
4.将IO0~IO3置高,将IO7置低,IO4、IO5、IO6置高,读取IO0~IO3。
循环此过程可以不断读取按键键值。
在实际的应用中,这个扫描过程通常是放在定时器的中断服务程序中去完成的,通过全局变量将键值返回到其它函数中去。
当然,作为学习其扫描过程,也可以将扫描放在主函数中直接来完成。
在上面介绍的按键输入方式中,读者可以看到,IO都是以低电平作为检测电平,那这是为什么呢?
这是因为单片机IO读取电平状态的时候,读取低电平比高电平要稳定。
也下是因为这一原因外部中断以低电平或下降沿来作为其中断触发条件,以保证中断的可靠性。
识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:
首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;
假如此时没有人按键,从P1口读出的值应仍为0xF0;
假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;
为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;
这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
本项目要求单个独立按键依次输入控制,按键从右至左输入,如计算器输入数据形式相同从右至左。
2.2电路原理图
键盘连接成4×
4的矩阵形式,占用单片机P1口的8根线,行信号是P1.0-1.3,列信号是P1.4-1.7。
2.3参考程序
单个独立按键依次输入控制
如计算器输入数据形式相同从右至左
sbitKEY1=P3^0;
//定义按键输入端口
sbitKEY2=P3^1;
sbitKEY3=P3^2;
sbitKEY4=P3^3;
sbitKEY5=P3^4;
sbitKEY6=P3^5;
sbitKEY7=P3^6;
sbitKEY8=P3^7;
voidDelayUs2x(unsignedchart);
//us级延时函数声明
voidDelayMs(unsignedchart);
//ms级延时
//数码管显示函数
unsignedcharKeyScan(void);
//键盘扫描
voidInit_Timer0(void);
//定时器初始化
voidmain(void)
unsignedcharnum,i,j;
unsignedchartemp[8];
Init_Timer0();
while
(1)//主循环
num=KeyScan();
if(num)
if(i<
8)
temp[i]=dofly_DuanMa[num];
for(j=0;
j<
=i;
j++)
TempData[7-i+j]=temp[j];
i++;
if(i==9)//多出一个按键输入为了清屏原本应该为8
i=0;
8;
j++)//清屏
TempData[j]=0;
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
voidDelayUs2x(unsignedchart)
{
mS延时函数,含有输入参数unsignedchart,无返回值
0~255这里使用晶振12M,精确延时请使用汇编
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs2x(245);
staticunsignedchari=0;
if(i==Num)
定时器初始化子程序
voidInit_Timer0(void)
TMOD|=0x01;
//使用模式1,16位定时器,使用"
|"
符号可以在使用多个定时器时不受影响
//TH0=0x00;
//给定初值
//TL0=0x00;
EA=1;
//总中断打开
ET0=1;
//定时器中断打开
TR0=1;
//定时器开关打开
定时器中断子程序
voidTimer0_isr(void)interrupt1
TH0=(65536-2000)/256;
//重新赋值2ms
TL0=(65536-2000)%256;
Display(0,8);
//调用数码管扫描
按键扫描函数,返回扫描键值
unsignedcharKeyScan(void)
/********************************************************/
if(!
KEY1)//如果检测到低电平,说明按键按下
DelayMs(10);
//延时去抖,一般10-20ms
if(!
KEY1)//再次确认按键是否按下,没有按下则退出
while(!
KEY1);
//如果确认按下按键等待按键释放,没有则退出
return1;
}
elseif(!
KEY2)//如果检测到低电平,说明按键按下
KEY2)//再次确认按键是否按下,没有按下则退出
KEY2);
return2;
KEY3)//如果检测到低电平,说明按键按下
KEY3)//再次确认按键是否按下,没有按下则退出
KEY3);
return3;
/*****
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码管 单片机 课程设计 报告