
《项目7 模拟电子闹钟的设计》由会员分享,可在线阅读,更多相关《项目7 模拟电子闹钟的设计(58页珍藏版)》请在文档大全上搜索。
1、电子工业出版社单片机控制技术单片机控制技术 项目式教程项目式教程 (C C语言版)语言版)电子工业出版社项目项目7 7 模拟电子模拟电子 闹钟闹钟的设计的设计l 能了解常用键盘的分类;能了解常用键盘的分类; l 能掌握键盘的工作原理;能掌握键盘的工作原理; l 能理解矩阵键盘的识别和控制方法;能理解矩阵键盘的识别和控制方法;l 能掌握秒表的设计方法;能掌握秒表的设计方法;l 能掌握模拟闹钟的设计方法;能掌握模拟闹钟的设计方法;l 能熟练编写键盘识别程序。能熟练编写键盘识别程序。 学习目标学习目标 l 叙述键盘的类别和工作原理;叙述键盘的类别和工作原理;l 叙述矩阵键盘的识别方法;叙述矩阵键盘的
2、识别方法;l 设计秒表的硬件电路和控制程序;设计秒表的硬件电路和控制程序;l 设计模拟闹钟的硬件电路和控制程序。设计模拟闹钟的硬件电路和控制程序。 工作任务工作任务 任务任务7.1 7.1 键盘的应用键盘的应用 项目项目7 7 模拟电子闹钟的设计模拟电子闹钟的设计任务任务7.2 7.2 电子秒表的设计电子秒表的设计项目拓展项目拓展 实验板简易电子琴的设计实验板简易电子琴的设计 项目小结项目小结思考与训练思考与训练任务任务7.3 7.3 模拟电子闹钟的设计模拟电子闹钟的设计 单片机与键盘的接口及其软件的任务主要包括以下几个方面:单片机与键盘的接口及其软件的任务主要包括以下几个方面:键盘概述键盘概
3、述l是一种常见的输入设备,根据按键的识别方法分类,键盘有编码键盘和非编码键盘两种。l根据键盘的结构分类,键盘可分为独立式按键键盘和行列式按键键盘。 任务任务7.1 键盘的应用键盘的应用 ()检测并判断是否有键按下;()按键开关的延时去抖动功能;()计算并确定按键的键值;()程序根据计算出的键值进行一系列的动作处理和执行 7.1.1独立键盘控制独立键盘控制LED的点亮的点亮7.1.1.1 独立键盘的工作原理独立键盘的工作原理XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5
4、/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51C122pFC222pFC310uFX112MR110kD1R2220D2R3220D3R4220D4R5220K1K2K3K4K1,K2
5、按下时按下时LED亮亮,松开时灭松开时灭K3,K4按下时按下时LED亮亮,再次按下时灭再次按下时灭 独立式按键键盘的每个按键都单独接到单片机的一个I/O口上,通过判断按键端口的电位即可识别按键操作。例如:K1键的一端接地,另一端接P1.0,当K1键按下,P1.0端口就会检测到低电平“0”信号,否则检测到的应该是高电平“1”信号。所以一旦查询到P1.0口为“0”就说明K1键按下了,也就是识别了按键。7.1.1独立键盘控制独立键盘控制LED的点亮的点亮7.1.1.1 独立键盘的工作原理独立键盘的工作原理 在按键被按下或释放时按键会出现抖动现象,这种现象会干扰按键的识别。因此需要对按键进行消抖动处理
6、,也称为去抖动。按键去抖动一般有硬件和软件两种方法。 7.1.1独立键盘控制独立键盘控制LED的点亮的点亮7.1.1.1 独立键盘的工作原理独立键盘的工作原理硬件去抖通常采用R-S触发器或单稳电路构成去抖电路。每一个按键都要连接一个硬件去抖动的电路,所以当电路中按键较多时电路就显得十分复杂。硬件去抖硬件去抖 7.1.1独立键盘控制独立键盘控制LED的点亮的点亮7.1.1.1 独立键盘的工作原理独立键盘的工作原理 判断按键被按下后,加一个10ms的延时程序,待按键稳定后,再次检测按键,按键仍处于被按下状态,就可以确认确实有按键被按下。软件去抖软件去抖 7.1.1.2 独立键盘控制独立键盘控制LE
7、D的点亮的点亮应用实例1: 要求K1或K2按下时D1或D2点亮,松开时对应LED熄灭;K3或K4按下并释放时D3或D4点亮,再次按下并释放时对应LED熄灭。操作实例操作实例 源程序编写如下:源程序编写如下:/宏定义宏定义#include #define uchar unsigned char#define uint unsigned int/端口位定义sbit D1=P0_0;sbit D2=P0_1;sbit D3=P0_2;sbit D4=P0_3;sbit K1=P1_0;sbit K2=P1_1;sbit K3=P1_2;sbit K4=P1_3;/延时延时1ms子程序子程序void
8、DelayMS(uint x) uchar i; while(x-) for(i=0; i120; i+);/按键控制按键控制LED灯主程序灯主程序void main() P1=0 xFF; /让P1口处于高电平状态 P0=0 xFF; /让P0口处于高电平状态 while(1) D1=K1; /将K1按下后P1.0的值直接送给P0.0去点亮D1 D2=K2; /将K2按下后P1.1的值直接送给P0.1去点亮D2 if(K3=0) /判断K3是否按下 while(K3=0); /等待K3释放 D3=D3; if(K4=0) /判断K4是否按下 while(K4=0); /等待K3释放 D4=D
9、4; DelayMS(10); 7.1.2 矩阵键盘控制数码管显示矩阵键盘控制数码管显示7.1.2.1 矩阵键盘的工作原理矩阵键盘的工作原理 矩阵键盘由行线和列线组成,按键位于行、列的交叉点上。 如图所示,1个44的行、列结构可以构成1个含有16个按键的键盘。在按键数量较多的场合,矩阵键盘与独立键盘相比要节省很多I/O口线。 7.1.2 矩阵键盘控制数码管显示矩阵键盘控制数码管显示7.1.2.1 矩阵键盘的工作原理矩阵键盘的工作原理矩阵键盘的按键识别方法: 扫描法和线反转法扫描法第一步:识别键盘是否有键闭合第二步:识别具体闭合的按键7.1.2 矩阵键盘控制数码管显示矩阵键盘控制数码管显示7.1
10、.2.1 矩阵键盘的工作原理矩阵键盘的工作原理扫描法图7.7按键扫描流程图7.1.2.1 矩阵键盘的工作原理矩阵键盘的工作原理线反转法第一步:将行线编程为输入线,列线编程为输出线,并使输出线输出为全零电平,则行线中电平由高到低所在行为按键所在行。 第二步:将行线编程为输出线,列线编 程为输入线,并使输出线为全零电平,则列线中电平由高到低所在列为按键所在列。 综合一二步的结果可确定按键所在行和列,从而识别出所按的键。 7.1.2 矩阵键盘控制数码管显示矩阵键盘控制数码管显示7.1.2.1 矩阵键盘的工作原理矩阵键盘的工作原理矩阵按键键盘常用的有2种编码方式:(1) 对于矩阵式键盘,按键的位置由行
11、号和列号确定,分别对行号和列号进行二进制编码,然后将两值合成1个字节,高4位表示行号,低4位表示列号。如12H表示第1行第2列的按键。(2)采用依次排列键号的方式对按键进行编码。以44键盘为例,可以将键号编码为:0 x00、0 x01、0 x02、0 x0D、0 x0E、0 x0F共16个。7.1.2 矩阵键盘控制数码管显示矩阵键盘控制数码管显示7.1.2.1 矩阵键盘的工作原理矩阵键盘的工作原理对键盘的控制方式主要有:定时扫描 中断扫描 定时扫描就是每隔一定的时间读取一次键盘I/O 口状态。中断方式下,当有键按下时,就会有一根行线被拉为低电平,经过与门之后就会触发一次外中断,这种方式避免了对
12、键盘的空扫描,可以提高CPU 的效率。 任务操作任务操作1任务要求任务要求 设计一个电路,AT89C51单片机的P1口连接一个44矩阵键盘,其中P1.0P1.3为行线,P1.4P1.7为列线,P0端口连接一只共阴极的一位数码管,要求按下一只按键时在数码管上显示器对应的键号,如按下K1则显示“1”,按下K2则显示“2”, 按下KF则显示“F”。 2任务分析任务分析键号2进制键值取反的2进制键值取反的16进制键值K011101110000100010 x11K111101101000100100 x12K211101011000101000 x14K311100111000110000 x18K4
13、11011110001000010 x21K511011101001000100 x22K611011011001001000 x24K711010111001010000 x28K810111110010000010 x41K910111101010000100 x42KA10111011010001000 x44KB10110111010010000 x48KC01111110100000010 x81KD01111101100000100 x82KE01111011100001000 x84KF01110111100010000 x88矩阵键盘按键特征码值表3任务设计任务设计(1)器件的
14、选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110k电阻11kX8排阻1轻触按键16一位共阴极数码管1矩阵键盘设计器件列表(2)硬件原理图设计 (3)软件程序设计 源程序编写如下:源程序编写如下:/宏定义#include #include #define uchar unsigned char/0F的数码管共阴极段码表uchar code DSY_CODE=0 x3F, 0 x06, 0 x5B, 0 x4F, 0 x66, 0 x6D, 0 x7D, 0 x07,0 x7F, 0 x6F, 0 x77 , 0 x7C , 0 x 39, 0 x5E
15、 , 0 x79 , 0 x71 ;/矩阵键盘按键特征码表uchar code KeyCodeTable=0 x11,0 x12,0 x14,0 x18,0 x21,0 x22,0 x24, 0 x28, 0 x41,0 x42,0 x44,0 x48,0 x81,0 x82,0 x84,0 x88;/延时子函数void Delay( ) uchar i ; for(i = 0; i200;i+);/矩阵键盘扫描子函数uchar Keys_Scan( ) uchar sCode, kCode, i, k; P1=0 xF0; /低4位置0,放入四行 if (P1 & 0 xF0) !=
16、 0 xF0) Delay( ); if (P1 & 0 xF0) != 0 xF0) sCode = 0 xFE; /行扫描码初值 for(k = 0;k4; k+) /对 4行分别扫描 P1= sCode; if (P1 & 0 xF0) != 0 xF0) kCode = P1; for(i=0; i16; i+) /查表得到按键序号并返回 if (kCode = = KeyCodeTablei) return i; else sCode = _crol_(sCode,1); return -1; /主函数void main ( ) uchar KeyNo = 1; /按
17、键序号,表示无按键 while (1) KeyNo = Keys_Scan( ); /扫描键盘获取按键序号KeyNo if (KeyNo != 1) P2 = code DSY_CODEKeyNo; /数码管显示按键序号 任务任务7.2 电子秒表的设计电子秒表的设计1任务要求任务要求 设计一只电子秒表,从0秒计到59秒,并用两只一位的共阴极数码管实时显示当前的秒数,按键控制秒表的启动和清零。2任务分析任务分析 采用T0的定时工作方式1,则TMOD=0 x01,由于晶体振荡频率为12MHz,机器周期就为1us,设置定时时间为 50000us(50ms),反复计数20次就为1s。 把计数的实时数值
18、用两只一位的共阴极数码管显示,采用静态的显示方式,计数值的十位和个位分别显示在不同的数码管上即可。 在任意的两根口线上分别连接一只轻触按键,分别控制秒表的启动和数码管清零。 3任务设计(1)器件的选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110k电阻11kX8排阻1轻触按键1一位共阴极数码管2电子秒表设计器件列表(2)硬件原理图设计 (3)软件程序设计 源程序编写如下:源程序编写如下:/宏定义#include#define uchar unsigned char#define uint unsigned intsbit K1=P32;sbit K2
19、=P33;/09的数码管共阴极段码表uchar code DSY_CODE=0 x3F, 0 x06, 0 x5B, 0 x4F, 0 x66, 0 x6D, 0 x7D, 0 x07,0 x7F, 0 x6F;/延时1ms子程序void DelayMS(uint x) uchar i; While(x-) for(i=0; i120; i+);/定时1s子程序void sTime ( ) uint i; TMOD=0 x01; /设定时器1为方式0 TH0=(65536-50000)/256; /置定时器初值 TL0=(65536-50000)%256; TR0=1; /启动T1 for(i
20、=0; i=20 ; ) if ( TF0 = 1) /查询计数溢出 i+; TF0=0; TH0=(65536-50000)/256; /重新置定时器初值 TL0=(65536-50000)%256; return ;/秒表主程序void main() uchar s; P0= DSY_CODE0; P2= DSY_CODE0; K1=1; K2=1; while(1) if(K1=0) /K1键按下 DelayMS(10); /按键去抖动 if(K1=0) /再次检查按键 for (s=1;s=60;s+) /从0到59显示秒数 P0= DSY_CODEs/10; /显示秒的十位 P2=
21、DSY_CODEs%10; /显示秒的个位 sTime (); /调用1s定时 if(K2=0) DelayMS(10); /按键去抖动 if(K2=0) /再次检查按键 P0= DSY_CODE0; /十位清零 P2=DSY_CODE0; /个位清零 任务任务7.3 模拟电子闹钟的设计模拟电子闹钟的设计 1任务要求 设计一只模拟电子闹钟,要求用矩阵键盘输入设置,用4位共阳极的数码管显示模拟时间,用蜂鸣器提醒设置的时间已到。 具体要求如下: (1)用按键K0、K1、K2、K3、K4、K5、K6、K7、K8、K9输入00009999中的任意一个数值作为设定时间,数值的1表示1s,比如输入0060
22、就表示60s即1分钟,输入0600就表示600s即10分钟。 (2)数值由四位共阳极的数码管动态显示,实时显示当前的数值(时间); (3)K10键作为开始键,按下后设置的数值以1s的时间间隔减1倒数; (4)K11键作为取消键,按下后取消前面的输入重新设置; (5)当设置的数值减到0时蜂鸣器报警。2任务分析 采用矩阵键盘:用AT89C51的P1.0P1.3作为矩阵键盘的行线,P1.4P1.7作为列线。 采用一只4位的共阳极数码管,动态地显示模拟的时间,由于4位最大只能显示9999,所以显示的时间范围是09999秒。用AT89C51的P0口连接数码管的段线,用P2.0P2.3连接位线。 由定时/
23、计数器的中断来实现1s定时。可以采用T1的8位自动重装载初值方式2,TMOD为0 x20,采用12MHz晶体,设置定时时间为250us中断,中断4000次就为1s。 键盘一位一位地输入需要设置的时间数值,按下开始键后,定时器开始计数,每过1s数值减1,直到数值减为0则启动蜂鸣器报警。3任务设计(1)器件的选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110k电阻1510电阻1轻触按键164位共阳极数码管1BC850B三极管4BC858B三极管1有源蜂鸣器1模拟电子闹钟设计器件列表(2)硬件原理图设计 p1.0p1.1p1.2p1.3p1.4p1.5p1
24、.6p1.7P1.4P1.5P1.6P1.7P1.0P1.3P1.2P1.1XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.
25、2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51C122PFC222PFC310uFX112MR110kK0K1K2K3K4K5K6K7K8K9K10K11K12K13K14K15LS1BEEPQ1BC850BQ2BC850BQ3BC850BQ4BC850BQ5BC858BR2510主函数main():T1初始化子函数init_time1():初始化定时器1T1的1s定时减1中断函数 timer1():定时250us 减1子函数plus():动态显示子函数display():显示键盘扫描子函数keyscan():矩阵键盘扫描延时1
26、ms子程序 DelayMS():延时1ms。(3)软件程序设计:模块程序设计模块程序设计源程序编写如下:源程序编写如下:/宏定义#include#include#define uchar unsigned char#define uint unsigned intsbit BEEP=P27;/矩阵键盘键值表uchar code KeyCodeTable=0 x11,0 x21,0 x41,0 x81,0 x12,0 x22,0 x42,0 x82, 0 x14,0 x24,0 x44,0 x84,0 x18,0 x28,0 x48,0 x88;/共阳极数码管段码表uchar code Disp
27、layTable=0 xc0,0 xF9,0 xA4,0 xB0,0 x99, 0 x92,0 x82,0 xF8,0 x80,0 x90;/定义全局变量uchar digbit;/ 字位uchar wordbuf4;/ 字型码缓冲区uchar count;/ 字型码缓冲区计数int t1count;/ 定时器1计数/延时1ms子程序void DelayMS(uint x) uchar i; While(x-) for(i=0; i120; i+);/ 键盘扫描子函数 uchar keyscan() uchar sCode, kCode, i, k; P1=0 xF0; /低位行线置 if (
28、P1&0 xF0)!=0 xF0) DelayMS (10); if (P1&0 xF0)!=0 xF0) sCode = 0 xFE; /设置行扫描码初值 for (k=0;k4;k+) /对4行分别扫描 P1= sCode; if (P1&0 xF0)!=0 xF0) kCode =P1; doP1=0 xF0; /等待按键弹起 while(P1&0 xF0)!=0 xF0); for (i=0;i16;i+) /查表得到按键序号并返回 if (kCode=KeyCodeTablei) return i ; else sCode = _crol_(sCode
29、,1); return -1; /减1子函数void plus() int i; i=wordbuf0*1000+wordbuf1*100+wordbuf2*10+wordbuf3; /将千百十个位合成一整数 i-; if(i=0) /数值减为0时使蜂鸣器响 BEEP=0; wordbuf0=i/1000; /减1后的数值再分为一位一位的放入数组去显示 wordbuf1=i%1000/100; wordbuf2=i%100/10; wordbuf3=i%10;/初始化定时器1函数(定时器1,8位自动重装载初值模式2,250次计数)void init_time1() TMOD=0 x20; TH
30、1=0 x06; TL1=0 x06; EA=1; ET1=1; TR1=1; /定时器1,1s定时减1中断函数 timer1() interrupt 3 t1count+; if(t1count=4000) /进入中断4000次为1s t1count=0;plus(); /调用减1函数 / 数码管动态显示子函数 void display() uchar i; switch (digbit) case 1:i=0;break; case 2:i=1;break; case 4:i=2;break; case 8:i=3;break; default: break; P2= 0 x00; / 关
31、闭显示 P0 = DisplayTablewordbufi; / 送字型码 P2= digbit; / 送字位码 DelayMS (2); if (digbit0 x08) / 共4位 digbit = digbit*2;/ 左移一位 else digbit = 0 x01;/ 主函数 void main() int m, j,key; count = 0; / 初始没有输入,计数器设为0 for (j=0;j4;j+) / 刚加电时,初始0000 wordbufj =0; while(count=0&key10) m=1; / 输入09 else if(key=10) m=2; /
32、开始倒计时键 else if(key=11) m=3; / 取消键 else m=4; / 其他按键switch(m) case 1: if (count4) wordbufcount=key;/ 将按键序号即数字存入数组 P0=DisplayTablekey; / 每次输入一个数字时4位都显示该数 count+; break; case 2: count=5; / 按下开始键就跳出此循环 break; case 3: count = 0; / 计数清零 for (j=0;j4;j+) wordbufj = 0; / 数码管显示0000 P0=DisplayTable0; break;defa
33、ult: break; digbit = 0 x01;init_time1(); /打开T1的1s计时while(1) display(); /调用动态显示项目项目拓展拓展 简易电子琴的设计简易电子琴的设计 在实验板上设计一个简易的电子琴,具体要求:按K1键发1音,按K2键发2音按K8键发高音1 。由蜂鸣器来发出相应的音调。1任务要求2任务分析 音乐主要是由音符和节拍决定的,“哆、唻、咪、法、嗦、啦、唏”音符对应于不同的声波频率,而节拍则表达的是声音持续的时间。通过控制单片机定时器的定时时间可以产生不同频率的方波,用于驱动无源蜂鸣器就能发出不同的音符,然后利用延时子程序来控制发音时间的长短,即
34、可控制节拍。把乐谱中的音符和相应的节拍变换成定时常数和延时常数,做成数据表格存放在存储器中。由程序查表得到定时常数和延时常数,用1个定时器控制产生方波的频率,用延时程序控制发出该频率方波的持续时间。当延时时间到后再查询下1个音符的定时常数和延迟常数,依次进行下去即可。 发音原理: 在方式在方式1 1的定时状态下,改变定时器的计数初值来产的定时状态下,改变定时器的计数初值来产生不同的频率。生不同的频率。音符(低音)频率Hz简谱码(T值)音符(中音)频率Hz简谱码(T值)音符(高音)频率Hz简谱码(T值)低126263628152364580高1104765058低2294638352587646
35、84高2117565110低333064021365964777高3131965157低434964103469964820高4139765178低539264260578464898高5156965127低644064400688064968高6176065252低749464524798865030高7197665283C调音符、频率、定时常数关系表 用杜邦线将单片机外围用杜邦线将单片机外围的的J22J22的的3 3脚与脚与J42J42的的7 7脚连接,脚连接,就用就用P1.2P1.2控制喇叭的发声了;控制喇叭的发声了;J26J26连接连接8 8只独立按键只独立按键K1K8K1K8,见见“
36、独立按键独立按键”电路,用杜电路,用杜邦线将邦线将J22J22的的10171017脚与脚与J26J26连连接上,这样就用接上,这样就用P3P3口控制口控制8 8只只独立按键。独立按键。 3任务设计简易电子琴源简易电子琴源程序如下程序如下:/宏定义 #include#define KeyPort P3/定义全局变量unsigned char High,Low; /定时器预装值的高8位和低8位sbit SPK=P12; /定义喇叭接口unsigned char code freq2= 0 x44,0 xFC, / 523Hz “1” 0 xAC,0 xFC, / 587 Hz “2” 0 x09,
37、0 xFD, / 659 Hz “3” 0 x34,0 xFD, / 699 Hz “4” 0 x82,0 xFD, / 784 Hz “5” 0 xC8,0 xFD, / 880 Hz “6” 0 x06,0 xFE, / 988 Hz “7” 0 x22,0 xFE, / 1047 Hz “高1”/ 函数声明void Init_Timer0(void); /初始化定时器/主函数void main (void) unsigned char num; Init_Timer0(); /初始化定时器0 SPK=0; /在未按键时,喇叭低电平,防止长期高电平损坏喇叭while (1) /主循环 sw
38、itch(KeyPort) case 0 xfe: num= 1; break; case 0 xfd: num= 2; break; case 0 xfb: num= 3; break; case 0 xf7: num= 4; break; case 0 xef: num= 5; break; case 0 xdf: num= 6; break; case 0 xbf: num= 7; break; case 0 x7f: num= 8; break; default: num= 0; break; if(num=0) TR0=0; SPK=0; /在未按键时,喇叭低电平,防止长期高电平损坏
39、喇叭 else High=freqnum-11; Low =freqnum-10; TR0=1; /定时器0初始化子程序void Init_Timer0(void) TMOD = 0 x01; /使用模式1,16位定时器 EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开/定时器中断子程序void Timer0_isr(void) interrupt 1 TH0=High; TL0=Low; SPK=!SPK;项目小结项目小结l 键盘有编码键盘和非编码键盘两种。 非编码键盘又分为独立键盘和矩阵(行列式)键盘。 独立键盘的识别比较简单,通过判断按键端口的电位
40、即可识别按键操作,但独立键盘比较浪费端口线。矩阵键盘节约了端口线,比如8根端口线就可以控制16个按键,但是它的识别方法相对复杂一些。l 对按键的识别 矩阵键盘的按键识别方法有扫描法和线反转法。l 按键应用时一定要去抖动 一般有硬件去抖和软件去抖两种方法。我们一般采用软件去抖动的方法,在识别按键后延时10ms后再次进行识别。 l 应用键盘、数码管和单片机的定时/计数器、中断等知识 我们在本项目中主要学习了电子秒表和电子闹钟的设计方法。在项目拓展中学习了运用单片机的定时/计数器和蜂鸣器实现乐音的方法。思考与训练思考与训练(一)知识思考:1. 简述键盘的分类。2. 独立键盘是怎样识别的?3. 简述矩
41、阵(行列式)键盘的工作原理。4. 矩阵(行列式)键盘有几种识别方法?它们各是怎样识别按键的?5. 按键的去抖动有哪几种方式?单片机通常采用哪种方式?6. 软件是怎样去抖动的?7. 蜂鸣器的分类有哪些?8. 简述有源蜂鸣器和无源蜂鸣器的控制方法。思考与训练思考与训练(二)项目训练:1. 如图7.5电路,用K1K4键分组控制八只LED灯,按K1键轮流点亮D1D8;按K2点亮D1、D3、D5、D7;按K3点亮D2、D4、D6、D8;按K4熄灭D1D8。2. 2采用AT89C51单片机设计一只电子秒表,可以正计时,也可以倒计时。要求用一只两位的共阳极的数码管动态显示秒数,定时采用T1的工作方式2,并且用中断实现。在Proteus环境下绘制原理图,编程调试实现功能。3. 3如图7.13电路设计的模拟闹钟,请将设计稍作修改:用4位共阳极的数码管显示时间,从左到右第1、2位显示小时,第3、4位显示分钟,中间用小数点隔开。比如设置“01.30”,表示闹钟定时1小时30分钟,开始计时后以倒数的方式显示“01.29”、“01.28”直到“00.00”蜂鸣器发声。请编写程序并调试。