模块五单片机接口电路及应用Word格式.docx
《模块五单片机接口电路及应用Word格式.docx》由会员分享,可在线阅读,更多相关《模块五单片机接口电路及应用Word格式.docx(60页珍藏版)》请在冰豆网上搜索。
键盘控制程序需完成的任务有:
监测是否有键按下,有键按下时,在无硬件去抖动电路时,应用软件延时方法消除按键抖动影响;
当有多个按键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。
1、行列式键盘的结构及工作原理
行列式键盘电路如图5-2所示。
图5-2行列式键盘电路
在图5-2中,P1口的6位P1.0~P1.5为键盘口线,组成2行4列共8个按键的行列式键盘矩阵,其中行线P1.0和P1.1为键盘扫描输出线,列线P1.2~P1.5为键盘扫描输入线,通过4个上拉电阻接到电源。
在行列线的交叉点上为按键,行线和列线分别接到按键开关的两端。
当键盘上没有键闭合时,行线和列线之间是断开的,所有列线输入全部为高电平。
当键盘上某个按键按下时,则对应的行线和列线短接,行线输出即为列线输入。
当键盘初始化时所有行线输出低电平,则通过读取的列线值状态是否全为1,即可判断有无键按下。
究竟是哪个键按下的,此时并判断不出来,还必须通过键盘扫描才能判断。
在键盘扫描时,先让第一行P1.0输出低电平0,其余行(即P1.1行)输出高电平1,检查各列(P1.2~P1.5列)的输入状态值,如某列的输入电平为0,则第一行线和对应列线相交的键按下,否则可判断在P1.0行的键没有被按下。
如P1.0行无键按下,则继续扫描下一行(P1.1行),让P1.1行输出低电平0,其余行(即P1.0行)输出高电平1,同样检查各列(P1.2~P1.5列)的输入状态值,如某列的输入电平为0,则第二行和对应列线相交的键按下,否则P1.1行无键按下。
当两行均扫描完后,仍未检查到列线输入值有0的情况,则表示此次并无键按下。
这种工作方式称为键盘扫描。
2、行列式键盘控制程序需完成的任务
(1)判断键盘有无按键按下
(2)按键去抖动处理
(3)键盘扫描
(4)计算按键值
3、行列式键盘编程
按以上分析可得行列式键盘程序的流程如图5-3所示,按键功能子程序流程图如图5-4所示。
图5-3键盘子程序流程图
按以上流程图编写的键盘子程序如下:
ORG0100H
KEYSCAN:
MOVP1,#3CH;
两条键盘输出线(行线P1.0和P1.1)均输出为0
MOVA,P1;
读取键盘口P1的值
ANLA,#3CH;
取出输入线(列线P1.2~P1.5)状态值
CJNEA,#3CH,KEY1;
判断输入线状态是否全为1(即有无键按下)
LJMPKEYEND;
无键按下返回
KEY1:
LCALLDEL12;
有键按下调用12ms延时子程序,以消除按键抖动
MOVA,#3EH;
扫描第一行,即P1.0输出为0
KEY2:
MOVR2,A;
将扫描码暂存于R2中
MOVP1,A;
扫描码输出给键盘口P1
读取键盘口的状态
取出输入线(列线)的状态
CJNEA,#3CH,KEY3;
判断列线是否全为1,即第一行是否有键按下,有键按下转计算键值
MOVA,#3DH;
第一行没有键按下,接着扫描第二行
MOVR2,A;
将第二行扫描码输出给P1
读取P1口的状态
取出列线的状态
判断列线是否全为1,即第二行是否有键按下,有键按下转计算键值
返回
KEY3:
MOVB,#0FBH;
键值寄存器B赋初值FBH
RLA;
因P1.7和P1.6没接按键,所以应将其移出
RLA
KEY4:
RLCA;
判断是哪列按键按下的
INCB;
第一列键值加1、第二列键值加2、第三列键值加3、第四列键值加4
JCKEY4
MOVA,R2;
将扫描码送A
KEY5:
RRCA;
判断是哪行按键按下的
第一行键值加4
第二行键值加8
INCB
JCKEY5
KEY6:
MOVA,P1;
取出键盘列线状态
CJNEA,#3CH,KEY6;
判断按键是否释放,没释放等待按键释放
LCALLDEL12;
调用12ms延时子程序,以消除按键抖动
LCALLOPREAT;
调用按键功能子程序
KEYEND:
RET;
根据任务要求,编写的按键功能子程序流程图如图5-4所示。
图5-4按键功能子程序流程图
根据流程图及设计任务要求编写的按键功能子程序如下所示:
ORG0200H
OPREAT:
MOVA,B;
从B中取出键值送入A
A的值左移一位,即A的值乘2
MOVDPTR,#TABLE1;
将按键功能入口地址表表首地址送DPTR
JMP@A+DPTR;
根据A的值(即键值)跳转至相应的按键功能入口地址处
TABLE1:
AJMPK0;
0号键功能入口地址
AJMPK1;
1号键功能入口地址
AJMPK2;
2号键功能入口地址
AJMPK3;
3号键功能入口地址
AJMPK4;
4号键功能入口地址
AJMPK5;
5号键功能入口地址
AJMPK6;
6号键功能入口地址
AJMPK7;
7号键功能入口地址
K0:
MOVR3,#00H;
0号键按下时将灯光模式寄存器R3置0(模式1)
LJMPOPR
K1:
MOVR3,#01H;
1号键按下时将灯光模式寄存器R3置1(模式2)
LJMPOPR
K2:
MOVR3,#02H;
2号键按下时将灯光模式寄存器R3置2(模式3)
K3:
MOVR3,#03H;
3号键按下时将灯光模式寄存器R3置3(模式4)
K4:
MOVR4,#00H;
4号键按下时将灯光路数寄存器R4置0(4路)
K5:
MOVR4,#04H;
5号键按下时将灯光路数寄存器R4置4(8路)
K6:
MOV30H,#04H;
6号键按下时将30H单元(灯光速度存储单元)置4(慢速)
K7:
MOV30H,#02H;
7号键按下时将30H单元(灯光速度存储单元)置2(快速)
OPR:
MOVA,R3;
R3与R4相加形成灯光数据表入口地址
ADDA,R4
MOVDPTR,#TABLE2;
将灯光数据入口地址表表首地址送DPTR
根据A的值(灯光路数和模式)跳转至相应的灯光数据入口地址处
TABLE2:
AJMPKK0;
4路模式1时灯光数据入口地址
AJMPKK1;
4路模式2时灯光数据入口地址
AJMPKK2;
4路模式3时灯光数据入口地址
AJMPKK3;
4路模式4时灯光数据入口地址
AJMPKK4;
8路模式1时灯光数据入口地址
AJMPKK5;
8路模式2时灯光数据入口地址
AJMPKK6;
8路模式3时灯光数据入口地址
AJMPKK7;
8路模式4时灯光数据入口地址
KK0:
MOVDPTR,#TAB41;
将4路模式1灯光数据表表首地址送DPTR
SJMPOPREND
KK1:
MOVDPTR,#TAB42;
将4路模式2灯光数据表表首地址送DPTR
KK2:
MOVDPTR,#TAB43;
将4路模式3灯光数据表表首地址送DPTR
KK3:
MOVDPTR,#TAB44;
将4路模式4灯光数据表表首地址送DPTR
KK4:
MOVDPTR,#TAB81;
将8路模式1灯光数据表表首地址送DPTR
KK5:
MOVDPTR,#TAB82;
将8路模式2灯光数据表表首地址送DPTR
KK6:
MOVDPTR,#TAB83;
将8路模式3灯光数据表表首地址送DPTR
KK7:
MOVDPTR,#TAB84;
将8路模式4灯光数据表表首地址送DPTR
OPREND:
MOVR1,#00H;
将灯光数据表索引值寄存器清0
RET
四、任务实施
1、灯光控制器硬件电路设计
根据以上任务分析及相关知识设计出的灯光控制器电路原理图如图5-5所示。
图5-5灯光控制器电路原理图
2、灯光控制器程序设计
根据以上任务分析及相关知识编写的灯光控制器程序如下:
ORG0000H;
主程序
MOVP0,#0FFH;
将P0口置为FFH,所有灯全灭
MOVR1,#00H;
MOVR3,#00H;
将灯光模式寄存器R3置0(模式1)
MOVR4,#04H;
将灯光路数寄存器R4置4(8路)
MOVSP,#20H;
将栈指针置20H
MOV30H,#04H;
将灯光速度存储单元置4(慢速)
MOVDPTR,#TAB81;
将8路模式1灯光数据表首地址送DPTR
START:
MOVA,R1;
将索引值送A
MOVCA,@A+DPTR;
查表得灯光数据
CJNEA,#0D3H,DISP;
判断灯光数据是否为结束码D3H
为结束码,则将索引值清0
SJMPSTART;
跳转至START处,重新进行下一次灯光循环
DISP:
MOVP0,A;
不为结束码,将灯光数据输出给P0口
INCR1;
索引值加1
LCALLKEYSCAN;
调键盘扫描及处理子程序
LCALLDISPDEL;
调显示延时子程序
跳转至START处
ORG0100H;
键盘扫描及处理子程序
KEYSCAN:
MOVP1,#3CH
MOVA,P1
ANLA,#3CH
CJNEA,#3CH,KEY1
LJMPKEYEND
LCALLDEL12
MOVA,#3EH
MOVR2,A
MOVP1,A
CJNEA,#3CH,KEY3
MOVA,#3DH
MOVR2,A
MOVB,#0FBH
RLCA
JCKEY4
MOVA,R2
RRCA
MOVA,P1
CJNEA,#3CH,KEY6
LCALLDEL12
LCALLOPREAT
KEYEND:
RET
ORG0200H;
按键功能子程序
MOVA,B
MOVDPTR,#TABLE1
JMP@A+DPTR
AJMPK0
AJMPK1
AJMPK2
AJMPK3
AJMPK4
AJMPK5
AJMPK6
AJMPK7
MOVR3,#00H
MOVR3,#01H
MOVR3,#02H
MOVR3,#03H
MOVR4,#00H
MOVR4,#04H
MOV30H,#04H
MOV30H,#02H
MOVA,R3
MOVDPTR,#TABLE2
AJMPKK0
AJMPKK1
AJMPKK2
AJMPKK3
AJMPKK4
AJMPKK5
AJMPKK6
AJMPKK7
MOVDPTR,#TAB41
MOVDPTR,#TAB42
MOVDPTR,#TAB43
MOVDPTR,#TAB44
MOVDPTR,#TAB81
MOVDPTR,#TAB82
MOVDPTR,#TAB83
MOVDPTR,#TAB84
MOVR1,#00H
ORG0300H;
显示延时子程序
DISPDEL:
MOVR5,30H
DISPDEL1:
MOVR6,#0FAH
DISPDEL2:
MOVR7,#0FAH
DISPDEL3:
DJNZR7,DISPDEL3
DJNZR6,DISPDEL2
DJNZR5,DISPDEL1
ORG0350H;
按键去抖动延时子程序
DEL12:
MOVR6,#1EH
DEL2:
MOVR7,#64H
DEL1:
DJNZR7,DEL1
DJNZR6,DEL2
TAB41:
DB0DFH,0EFH,0F7H,0FBH,0F7H,0EFH,0DFH,0FFH;
4路模式1灯光数据表
DB0DFH,0CFH,0C7H,0C3H,0FBH,0F3H,0E3H,0C3H,0FFH
DB0D7H,0EBH,0D7H,0EBH,0FFH,0C3H,0FFH,0C3H,0FFH,0D3H
TAB42:
DB0DFH,0EFH,0F7H,0FBH,0F7H,0EFH,0D3H;
4路模式2灯光数据表
TAB43:
DB0DFH,0CFH,0C7H,0C3H,0FFH;
4路模式3灯光数据表
DB0FBH,0F3H,0E3H,0C3H,0FFH,0D3H
TAB44:
DB0D7H,0EBH,0D3H;
4路模式4灯光数据表
TAB81:
DB0E7H,0DBH,0BDH,7EH,0BDH,0DBH,0E7H,0FFH;
8路模式1灯光数据表
DB0E7H,0C3H,81H,00H,00H,81H,0C3H,0E7H,0FFH,0D3H
TAB82:
DB7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH;
8路模式2灯光数据表
DB7EH,0BEH,0DEH,0EEH,0F6H,0FAH,0FCH
DB7CH,0BCH,0DCH,0ECH,0F4H,0F8H
DB78H,0B8H,0D8H,0E8H,0F0H
DB70H,0B0H,0D0H,0E0H,60H,0A0H,0C0H,40H,80H,00H,00H,0D3H
TAB83:
DB7FH,3FH,1FH,0FH,07H,03H,01H,00H;
8路模式3灯光数据表
DB01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0D3H
TAB84:
DB0AAH,55H,0D3H;
8路模式4灯光数据表
小结
1、行列式键盘接口电路及编程方法。
2、灯光控制器电路设计方法。
3、灯光控制器程序设计方法。
课后作业
1、用Protel软件绘制出本设计任务的电路原理图,并设计印制电路板图及制作印制电路板。
2、连接仿真器,将本设计任务的程序输入计算机,并进行仿真调试及运行。
3、连接编程器,将仿真通过的程序代码下载到单片机中,脱机运行并观察电路运行情况。
4、分析本任务中的键盘扫描及处理程序,并分析键值的计算方法,是否还能用其它方法来编写键盘扫描程序。
5、自行设计几组亮灯数据,上机调试运行,观察电路运行情况。
6、在本任务的键盘扫描程序中,将按键去抖动和等待按键释放程序段删除,程序修改后上机调试运行,观察电路运行情况,并分析原因。
密码锁控制器
1、掌握密码锁控制器电路设计方法。
2、掌握密码锁控制器程序设计方法。
密码锁控制器电路设计方法,密码锁控制器程序设计方法。
密码锁控制器程序设计方法。
任务二智能密码锁控制器
本任务主要讲解用单片机设计的密码锁控制器,要求工作稳定可靠,保密性高,实用性强,并具有报警控制功能。
1、密码锁控制器硬件电路设计
89C51单片机的P2口作键盘口,其中P2.4~P2.7为键盘扫描输出线,P2.0~P2.3为键盘扫描输入线。
P1口为信号输出口,其中P1.0输出开锁控制信号驱动电磁锁,P1.1输出密码错信号,P1.2输出报警控制信号驱动报警器。
键盘由4×
4共16个按键组成,15个数字或字母键,1个输入键。
本任务程序所设密码由8位字符组成(用户对程序稍加修改,便可设置为任意位数的密码),每位字符可为0~9及A~E的15个数字或字母中的任意一个,确保密码的保密性。
通电复位,电路进入就绪状态,等待用户输入密码。
当用户输入密码并按下输入键后,由程序判断输入的密码是否正确。
如输入密码正确,则由P1.0输出开锁控制信号,同时点亮绿灯;
如输入密码错误,则由P1.1输出密码错误指示信号,点亮红灯,用户可再次输入密码;
如连续3次输入密码错误,则由P1.2输出报警控制信号,同时点亮黄灯。
一旦输出报警信号,就必须等待解除报警后方可重新输入密码开锁。
2、密码锁控制器程序设计
程序开始向P1口输出FFH,使密码正确指示信号灯(P1.0)、密码错误指示信号灯(P1.1)和报警指示信号灯(P1.2)灭。
然后进行初始化,将密码输入错误次数寄存器R4清0,输入密码存储指针寄存器R0置为1FH(即输入密码存储于片内RAM20H单元开始的若干个单元中),输入密码位数计数寄存器R3清0。
然后进行键盘扫描及计算键号并存于B中,再调用按键操作子程序。
在按键操作子程序中,先将输入按键号(即输入的密码字符)存于片内RAM的20H单元开始的密码暂存区中,再判断是不是输入键,如不是输入键,则密码位数计数器R3加1,如是输入按键,则表示密码输入结束。
接着进行输入密码与存储于程序存储器中的设定密码比较,首先判断输入密码位数是否为程序设定的8位(用户可修改),如不是8位,则不比较,密码错误指示灯点亮,将输入密码错误次数计数器R4加1;
判断密码输入错误次数是否为3次,如达到3次输入错误,则输出报警信号,同时点亮报警指示灯,程序动态停机;
如输入密码错误次数不到3次,则可再次重新输入密码。
如输入密码位数为8位,则将暂存于片内RAM中的输入密码与设定密码逐位比较,如比较结果为输入密码与设定密码相同,则输出开锁信号,同时点亮密码正确指示灯,延时3S后重新锁定。
如任何一位密码不相等,则进行如前所述的密码错误处理操作。
图5-6密码锁控制器主程序流程图
图5-7按键操作子程序流程图
键盘的相关知识在本课题的任务一中已详细讲解过,此处不再赘述。
1、密码锁控制器电路设计
根据以上任务分析设计出的密码锁控制器电路原理图如图5-8所示。
图5-8密码锁控制器电路原理图
根据前面的任务分析,编写的原程序如下:
MOVP1,#0FFH;
P1口输出FFH
MOVR4,#00H;
输入密码错误次数寄存器R4清0
MOVR0,#1FH;
输入密码暂存区指针R0赋初值1FH
MOVR3