单片机键盘输入课程设计.docx
- 文档编号:9422383
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:15
- 大小:108.19KB
单片机键盘输入课程设计.docx
《单片机键盘输入课程设计.docx》由会员分享,可在线阅读,更多相关《单片机键盘输入课程设计.docx(15页珍藏版)》请在冰点文库上搜索。
单片机键盘输入课程设计
目 录
第1章课程设计任务书................................2
第2章设计目的......................................2
第3章设计原理与分析................................2
第4章所选元件清单..................................6
第5章课程设计心得..................................7
第6章参考文献......................................7
附录.................................................8
第一章、课程设计任务书
本设计以MCS-51系列单片机为核心,采用常用电子器件设计。
要求能显示出秒、分、时、天,可调整各个时间,采用LED八段数码管显示。
第二章、课程设计目的
1、掌握51系列单片机编程原理
(1)掌握单片机C51语言程序编程的思想及方法,加深对单片机的更深层次的理解,熟悉单片机的内部硬件资源。
(2)定时器中断服务子程序和外中断服务子程序各个程序段所实现的功能和编写。
(3)通过此次课程设计,学会怎么利用所学单片机知识独立设计系统,达到学于致用的目的,加深了解C51设计编程思想及开发系统的一般过程,并不断创新。
2、掌握矩阵式键盘电路的接法及工作原理
(1)掌握矩阵式键盘的接法及工作原理。
(2)掌握键盘消抖的工作原理。
3、掌握矩阵式键盘电路的接法及工作原理
(1)掌握矩阵式键盘键盘扫描程序的编写。
(2)掌握键盘消抖程序的编写。
4、掌握共阳八段码显示器连接,做成可调节的电子表,简单的了解单片机对显示器的控制过程;能在此基础上做成可调节的万年历。
第三章、设计原理与分析
1、实验硬件电路的原理与设计
A.
键盘扫描识别
1、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如所读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别键闭合时,要将行线接一并行口,先让它工作于输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么,在闭合键所在的行线上的值必定为0。
这样,当一个键被按下时,必定可以读得一对唯一的行线值和列线值。
2、程序设计时,要学会灵活地对STC89C52的各端口进行方式设置。
可将各键对应的键值(行线值、列线值)放在一个表中,将要显示的0~F字符放在另一个表中,通过查表来确定按下的是哪一个键并正确显示出来。
3、利用实验箱上的STC89C52可编程并行接口芯片和矩阵键盘,编写程序,做到在键盘上每按一个数字键(0~F),用发光二极管将该代码显示出来。
B.
显示器的显示原理:
数码管需要驱动电路来驱动数码管的各个段码才能显示我们需要的数字。
根据数码管的驱动方式不同,可以分为静态驱动和动态驱动两种方式。
①静态显示驱动:
静态驱动也称直流驱动。
是指每个数码管的第一个段码都是由同一个单片机的I/O端口进行驱动,或者使用如BCD码二─十进制译码器译码进行驱动。
②动态显示驱动:
动态驱动是数码管是单片机中应用最为广泛的一种驱动方式。
动态驱动是将所有数码管的八个显示笔划“a,b,c,d,e,f,g,dp”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,各选通由各自独立的I/O线控制,当单片机输出这形码时,所有数码管都接收到相同的字形码,哪个数码管会显示字形,取决于单片机对位选通COM端电路的控制,所以只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示的过程中,每位数码管的点亮时间为1~2ms。
动态显示的效果和静态显示是一样的,但能节省大量的I/O端口,而且功耗更低。
由于静态显示需要数据锁存器等硬件,接口复杂一些,考虑时钟显示只有八位,且系统没有其它复杂的处理任务,所以决定采用动态扫描实现LED的显示。
单片机采用易购的STC89C52系列,这种单片机具有足够的空余硬件资源,可以实现其他的扩展功能。
时钟计时器电路系统的总体设计框图如图1。
图1
2、实验步骤:
时钟计时器的硬件电路如图2所示。
该电路采用51单片机最小系统,采用共阳八段数码管LED显示器,P0口输出段码数据,P2.0~P2.5口作列扫描输出;P1口接矩阵键盘,实现时间的调整。
系统的功能由键盘上1、2、3键完成。
如图2
3、系统程序的设计
(1)主程序
本设计中计时采用定时器T0中断完成。
主程序循环调用显示子程序和查键子程序,当端口有开关按下时,转入相应功能程序。
其主程序流程如图3。
(2)显示子程序
时间显示子程序每次显示8个连续内存单元的十进制BCD码数据,首地址在调用显示程序时先指定。
显示时,先取出内存地址中的数据,然后查得对应的显示用段码从P0口输出,P2口将对应数码管选中供电,就能显示该地址单元的数据值。
(3)定时器T0中断服务程序
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断进入后先进行定时中断初值校正,当中断累计20次(即50ms×20=1s)时,对秒计数单元进行加1操作。
在计数单元中,采用十进制BCD码计数,满10进位。
T0中断计时程序流程图如图4所示。
图3
图2
(4)调时功能程序
调时功能程序的设计方法是:
按下1键,可以选择要修改的位,按下按2键和3键键,对选中的位进行加减操作,修改完成之后,再按下XW键对其它位进行修改。
具体如下:
第一次按下1键时,可以修改秒。
第二次按下1键时,可以修改分。
第三次按下1键时,可以修改时。
第四次按下1键时,退出子程序。
第四章、所选元件清单
1、元件清单
原件
数量
八段共阳数码管
2
S8550三极管
8
1K电阻
8
150Ω电阻
8
51最小系统
1
线
若干
2、程序实际接线
数码管的不同笔段的组合构成了不同字符的字形。
为了获得不同的字形,各笔段所加的电平也不同,因此各个字形所形成的编码是不一样的。
例如,对于共阳极数码管,如果要显示字符2,则笔段a、b、g、e、d发光,对应的引脚为低电平;其余各笔段不发光,对应的引脚为该电平。
所以字符2的字形编码gfedcba=10100100B=A4H。
阴极数码管的字形编码与用阳极数码管的字形编码是逻辑“非”的关系。
根据上述编码方法可以得出数码管显示的字符与对应的字形编码的关系,如下表所示
此次实验用的共阳数码管,所以按照阳极数码管的字形编码进行设计。
附录:
程序
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharmiao,fen,shi,m,f,s,num,num1,num2;
ucharcodetable1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidxiansi(ucharaa,ucharbb,ucharcc)
{
P2=0xdb;
P0=0xbf;
delay
(1);
P0=0xff;//num2++;
if(num1==1&num2==0|num1==1&num2==1)
{
P2=0xff;
P0=table1[aa%10];
delay
(1);
P0=0xff;
P2=0xff;
P0=table1[aa/10];
delay
(1);
P0=0xff;
}
else
{
P2=0x7f;
P0=table1[aa%10];
delay
(1);
P0=0xff;
P2=0xbf;
P0=table1[aa/10];
delay
(1);
P0=0xff;
}
if(num1==2&num2==0|num1==2&num2==1)
{
P2=0xff;
P0=table1[bb/10];
delay
(1);
P0=0xff;
P2=0xff;
P0=table1[bb%10];
delay
(1);
P0=0xff;
}
else
{
P2=0xf7;
P0=table1[bb/10];
delay
(1);
P0=0xff;
P2=0xef;
P0=table1[bb%10];
delay
(1);
P0=0xff;
}
if(num1==3&num2==0|num1==3&num2==1)
{
P2=0xff;
P0=table1[cc/10];
delay
(1);
P0=0xff;
P2=0xff;
P0=table1[cc%10];
delay
(1);
P0=0xff;
}
else
{P2=0xfe;
P0=table1[cc/10];
delay
(1);
P0=0xff;
P2=0xfd;
P0=table1[cc%10];
delay
(1);
P0=0xff;
}
//if(num2==256)num2=1;
}
voidjishi()
{
if(num==20)
{
num=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
if(miao==0&fen==0);
}
xiansi(miao,fen,shi);
}
voidinit(void)
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TH1=0x3c;
TL1=0xb0;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
}
voidkey()
{
P1=0xfe;
if(P1==0xee)
{delay(10);
if(P1==0xee)
{
while(P1==0xee)xiansi(miao,fen,shi);
num1++;
TR0=0;
if(num1==4)
{
num1=0;
TR0=1;
}
xiansi(miao,fen,shi);
}
}
if(num1!
=0)
{
if(P1==0xde)//时间加
{
delay(10);
if(P1==0xde)
{
while(P1==0xde)xiansi(miao,fen,shi);
switch(num1)
{
case1:
miao++;
if(miao==60)miao=0;
break;
case2:
fen++;
if(fen==60)fen=0;
break;
case3:
shi++;
if(shi==24)shi=0;
break;
}
}
}
if(P1==0xbe);//时间减
{
delay(10);
if(P1==0xbe)
{
while(P1==0xbe)
xiansi(miao,fen,shi);
switch(num1)
{
case1:
miao--;
if(miao==-1)
miao=59;
break;
case2:
fen--;
if(fen==-1)
fen=59;
break;
case3:
shi--;
if(shi==-1)
shi=23;
break;
}
}
}
}
}
voidmain()
{
init();
while
(1)
{
jishi();
key();
}
}
voidzhongduan()interrupt1
{
TH0=0x3c;
TL0=0xb0;
num++;
}
voidzhongduan1()interrupt3
{
TH1=0x3c;
TL1=0xb0;
num2++;
if(num2==3)
num2=0;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 键盘输入 课程设计