项目7 模拟电子闹钟的设计.ppt_第1页
项目7 模拟电子闹钟的设计.ppt_第2页
项目7 模拟电子闹钟的设计.ppt_第3页
项目7 模拟电子闹钟的设计.ppt_第4页
项目7 模拟电子闹钟的设计.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子工业出版社,单片机控制技术 项目式教程 (C语言版),电子工业出版社,项目7 模拟电子 闹钟的设计,能了解常用键盘的分类; 能掌握键盘的工作原理; 能理解矩阵键盘的识别和控制方法; 能掌握秒表的设计方法; 能掌握模拟闹钟的设计方法; 能熟练编写键盘识别程序。,学习目标,叙述键盘的类别和工作原理; 叙述矩阵键盘的识别方法; 设计秒表的硬件电路和控制程序; 设计模拟闹钟的硬件电路和控制程序。,工作任务,任务7.1 键盘的应用,项目7 模拟电子闹钟的设计,任务7.2 电子秒表的设计,项目拓展 实验板简易电子琴的设计,项目小结,思考与训练,任务7.3 模拟电子闹钟的设计,单片机与键盘的接口及其软件

2、的任务主要包括以下几个方面:,键盘概述 是一种常见的输入设备,根据按键的识别方法分类,键盘有编码键盘和非编码键盘两种。 根据键盘的结构分类,键盘可分为独立式按键键盘和行列式按键键盘。,任务7.1 键盘的应用,()检测并判断是否有键按下; ()按键开关的延时去抖动功能; ()计算并确定按键的键值; ()程序根据计算出的键值进行一系列的动作处理和执行,7.1.1独立键盘控制LED的点亮,7.1.1.1 独立键盘的工作原理,独立式按键键盘的每个按键都单独接到单片机的一个I/O口上,通过判断按键端口的电位即可识别按键操作。 例如:K1键的一端接地,另一端接P1.0,当K1键按下,P1.0端口就会检测到

3、低电平“0”信号,否则检测到的应该是高电平“1”信号。所以一旦查询到P1.0口为“0”就说明K1键按下了,也就是识别了按键。,7.1.1独立键盘控制LED的点亮,7.1.1.1 独立键盘的工作原理,在按键被按下或释放时按键会出现抖动现象,这种现象会干扰按键的识别。因此需要对按键进行消抖动处理,也称为去抖动。按键去抖动一般有硬件和软件两种方法。,7.1.1独立键盘控制LED的点亮,7.1.1.1 独立键盘的工作原理,硬件去抖通常采用R-S触发器或单稳电路构成去抖电路。每一个按键都要连接一个硬件去抖动的电路,所以当电路中按键较多时电路就显得十分复杂。,硬件去抖,7.1.1独立键盘控制LED的点亮,

4、7.1.1.1 独立键盘的工作原理,判断按键被按下后,加一个10ms的延时程序,待按键稳定后,再次检测按键,按键仍处于被按下状态,就可以确认确实有按键被按下。,软件去抖,7.1.1.2 独立键盘控制LED的点亮,应用实例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

5、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 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

6、(K3=0) /判断K3是否按下 while(K3=0); /等待K3释放 D3=D3; if(K4=0) /判断K4是否按下 while(K4=0); /等待K3释放 D4=D4; DelayMS(10); ,7.1.2 矩阵键盘控制数码管显示,7.1.2.1 矩阵键盘的工作原理,矩阵键盘由行线和列线组成,按键位于行、列的交叉点上。 如图所示,1个44的行、列结构可以构成1个含有16个按键的键盘。在按键数量较多的场合,矩阵键盘与独立键盘相比要节省很多I/O口线。,7.1.2 矩阵键盘控制数码管显示,7.1.2.1 矩阵键盘的工作原理,矩阵键盘的按键识别方法: 扫描法和线反转法,扫描法,第一步

7、:识别键盘是否有键闭合,第二步:识别具体闭合的按键,7.1.2 矩阵键盘控制数码管显示,7.1.2.1 矩阵键盘的工作原理,扫 描 法,图7.7按键扫描流程图,7.1.2.1 矩阵键盘的工作原理,线反转法,第一步:将行线编程为输入线,列线编程为输出线,并使输出线输出为全零电平,则行线中电平由高到低所在行为按键所在行。,第二步:将行线编程为输出线,列线编 程为输入线,并使输出线为全零电平, 则列线中电平由高到低所在列为按键所 在列。,综合一二步的结果可确定按键所在行和列,从而识别出所按的键。,7.1.2 矩阵键盘控制数码管显示,7.1.2.1 矩阵键盘的工作原理,矩阵按键键盘常用的有2种编码方式

8、:,(1) 对于矩阵式键盘,按键的位置由行号和列号确定,分别对行号和列号进行二进制编码,然后将两值合成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 口状态。 中断方式下,当有键按下时,就会有一根行线被拉为低电平,经过与门之后就会触发一次外中断,这种

9、方式避免了对键盘的空扫描,可以提高CPU 的效率。,任务操作,1任务要求,设计一个电路,AT89C51单片机的P1口连接一个44矩阵键盘,其中P1.0P1.3为行线,P1.4P1.7为列线,P0端口连接一只共阴极的一位数码管,要求按下一只按键时在数码管上显示器对应的键号,如按下K1则显示“1”,按下K2则显示“2”, 按下KF则显示“F”。,2任务分析,矩阵键盘按键特征码值表,3任务设计,(1)器件的选择,矩阵键盘设计器件列表,(2)硬件原理图设计,(3)软件程序设计,源程序编写如下: /宏定义 #include #include #define uchar unsigned char /0F

10、的数码管共阴极段码表 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 , 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

11、( ) uchar i ; for(i = 0; i200;i+); ,/矩阵键盘扫描子函数 uchar Keys_Scan( ) uchar sCode, kCode, i, k; P1=0 xF0; /低4位置0,放入四行 if (P1 ,/主函数 void main ( ) uchar KeyNo = 1; /按键序号,表示无按键 while (1) KeyNo = Keys_Scan( ); /扫描键盘获取按键序号KeyNo if (KeyNo != 1) P2 = code DSY_CODEKeyNo; /数码管显示按键序号 ,任务7.2 电子秒表的设计,1任务要求,设计一只电子秒表

12、,从0秒计到59秒,并用两只一位的共阴极数码管实时显示当前的秒数,按键控制秒表的启动和清零。,2任务分析,采用T0的定时工作方式1,则TMOD=0 x01,由于晶体振荡频率为12MHz,机器周期就为1us,设置定时时间为 50000us(50ms),反复计数20次就为1s。 把计数的实时数值用两只一位的共阴极数码管显示,采用静态的显示方式,计数值的十位和个位分别显示在不同的数码管上即可。 在任意的两根口线上分别连接一只轻触按键,分别控制秒表的启动和数码管清零。,3任务设计,(1)器件的选择,电子秒表设计器件列表,(2)硬件原理图设计,(3)软件程序设计,源程序编写如下: /宏定义 #inclu

13、de #define uchar unsigned char #define uint unsigned int sbit K1=P32; sbit K2=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;

14、 /设定时器1为方式0 TH0=(65536-50000)/256; /置定时器初值 TL0=(65536-50000)%256; TR0=1; /启动T1 for(i=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(1

15、0); /按键去抖动 if(K1=0) /再次检查按键 for (s=1;s=60;s+) /从0到59显示秒数 P0= DSY_CODEs/10; /显示秒的十位 P2= DSY_CODEs%10; /显示秒的个位 sTime (); /调用1s定时 ,if(K2=0) DelayMS(10); /按键去抖动 if(K2=0) /再次检查按键 P0= DSY_CODE0; /十位清零 P2=DSY_CODE0; /个位清零 ,任务7.3 模拟电子闹钟的设计,1任务要求,设计一只模拟电子闹钟,要求用矩阵键盘输入设置,用4位共阳极的数码管显示模拟时间,用蜂鸣器提醒设置的时间已到。,具体要求如下:

16、 (1)用按键K0、K1、K2、K3、K4、K5、K6、K7、K8、K9输入00009999中的任意一个数值作为设定时间,数值的1表示1s,比如输入0060就表示60s即1分钟,输入0600就表示600s即10分钟。 (2)数值由四位共阳极的数码管动态显示,实时显示当前的数值(时间); (3)K10键作为开始键,按下后设置的数值以1s的时间间隔减1倒数; (4)K11键作为取消键,按下后取消前面的输入重新设置; (5)当设置的数值减到0时蜂鸣器报警。,2任务分析,采用矩阵键盘:用AT89C51的P1.0P1.3作为矩阵键盘的行线,P1.4P1.7作为列线。 采用一只4位的共阳极数码管,动态地显

17、示模拟的时间,由于4位最大只能显示9999,所以显示的时间范围是09999秒。用AT89C51的P0口连接数码管的段线,用P2.0P2.3连接位线。 由定时/计数器的中断来实现1s定时。可以采用T1的8位自动重装载初值方式2,TMOD为0 x20,采用12MHz晶体,设置定时时间为250us中断,中断4000次就为1s。 键盘一位一位地输入需要设置的时间数值,按下开始键后,定时器开始计数,每过1s数值减1,直到数值减为0则启动蜂鸣器报警。,3任务设计,(1)器件的选择,模拟电子闹钟设计器件列表,(2)硬件原理图设计,主函数main(): T1初始化子函数init_time1():初始化定时器1

18、 T1的1s定时减1中断函数 timer1():定时250us 减1子函数plus(): 动态显示子函数display():显示 键盘扫描子函数keyscan():矩阵键盘扫描 延时1ms子程序 DelayMS():延时1ms。,(3)软件程序设计:模块程序设计,源程序编写如下: /宏定义 #include #include #define uchar unsigned char #define uint unsigned int sbit BEEP=P27; /矩阵键盘键值表 uchar code KeyCodeTable=0 x11,0 x21,0 x41,0 x81,0 x12,0 x2

19、2,0 x42,0 x82, 0 x14,0 x24,0 x44,0 x84,0 x18,0 x28,0 x48,0 x88; /共阳极数码管段码表 uchar code DisplayTable=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

20、(x-) for(i=0; i120; i+); ,/ 键盘扫描子函数 uchar keyscan() uchar sCode, kCode, i, k; P1=0 xF0; /低位行线置 if (P1 ,/减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%10

21、0/10; wordbuf3=i%10; ,/初始化定时器1函数(定时器1,8位自动重装载初值模式2,250次计数) void init_time1() TMOD=0 x20; TH1=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=

22、0;break; case 2:i=1;break; case 4:i=2;break; case 8:i=3;break; default: break; P2= 0 x00; / 关闭显示 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

23、;j=0 / 其他按键,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; default: break; digbit = 0 x01; init_time

24、1(); /打开T1的1s计时 while(1) display(); /调用动态显示 ,项目拓展 简易电子琴的设计,在实验板上设计一个简易的电子琴,具体要求:按K1键发1音,按K2键发2音按K8键发高音1 。由蜂鸣器来发出相应的音调。,1任务要求,2任务分析,音乐主要是由音符和节拍决定的,“哆、唻、咪、法、嗦、啦、唏”音符对应于不同的声波频率,而节拍则表达的是声音持续的时间。通过控制单片机定时器的定时时间可以产生不同频率的方波,用于驱动无源蜂鸣器就能发出不同的音符,然后利用延时子程序来控制发音时间的长短,即可控制节拍。把乐谱中的音符和相应的节拍变换成定时常数和延时常数,做成数据表格存放在存储

25、器中。由程序查表得到定时常数和延时常数,用1个定时器控制产生方波的频率,用延时程序控制发出该频率方波的持续时间。当延时时间到后再查询下1个音符的定时常数和延迟常数,依次进行下去即可。,发音原理:,在方式1的定时状态下,改变定时器的计数初值来产生不同的频率。,C调音符、频率、定时常数关系表,用杜邦线将单片机外围的J22的3脚与J42的7脚连接,就用P1.2控制喇叭的发声了;J26连接8只独立按键K1K8,见“独立按键”电路,用杜邦线将J22的1017脚与J26连接上,这样就用P3口控制8只独立按键。,3任务设计,简易电子琴源程序如下:,/宏定义 #include #define KeyPort

26、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,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

27、Hz “高1” ,/ 函数声明 void Init_Timer0(void); /初始化定时器 /主函数 void main (void) unsigned char num; Init_Timer0(); /初始化定时器0 SPK=0; /在未按键时,喇叭低电平,防止长期高电平损坏喇叭 while (1) /主循环 switch(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; /在未按键时,喇叭低电平,防止长期高电平损坏喇叭 else High=freqnum-11; Low =freqnum-10; TR0=1; ,/定时器0初始化子程序 void Init_Timer0(void) TMOD = 0 x01; /使用模式1,16位定时器 EA=1; /总中断打开

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论