《单片机项目实践教程刘燎原项目四倒计时.pptx》由会员分享,可在线阅读,更多相关《单片机项目实践教程刘燎原项目四倒计时.pptx(76页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、回顾:(一)动态显示1.什么是动态显示2.动态显示步骤 1个数码管步骤:(1)送段值 (2)送位选(公共端)(3)延时 (4)关闭 3.加驱动方法 三极管 锁存器第1页/共76页实验总结:实验板数码管动态显示假设要求第一个数码管先显示百位(例如2),则:1.送段值:P0输出段值5BH,P2.6=1(数据进入),P2.6=0(数据锁存),段值送入数码管的段值端;2.送位选:P0输出位选值FEH,P2.7=1(数据进入),P2.7=0(数据锁存),位选值送入数码管的位选端;3.延时其他两个数码管类似这三个步骤。第2页/共76页回顾:(二)中断1.中断源 5个2.中断优先级 2个 3.外部中断 P3
2、.2,P3.3 4.外部中断寄存器 IE:EA,EX0,ET0,EX1,ET1,ES TCON:IE0,IT0,IE1,IT1 IP:PX0,PT0,PX1,PT1,PS 中断程序如何编写?第3页/共76页Void main 中断初始化;一边做平时的工作,一边等待中断来;Void 名字()interrupt 0/3 要求CPU做的事情;第4页/共76页 项目四 倒计时 -单片机定时计数器第5页/共76页上节课复习举出生活中中断的例子。中断过程包括哪几个步骤?中断请求、中断响应、中断处理、中断返回单片机内有哪个中断源。外部中断:2 内部中断:3 第6页/共76页 定时器/计数器导入:单片机应用系
3、统中定时计数的需求:如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对酒瓶的计数装置等。以实现定时控制;以实现对外界事件进行计数。用到定时/计数 实现定时/实现方式:1.软件定时;(延时程序)占用CPU2.不可编程硬件定时(555);3.可编程定时 (8253,单片机定时/计数器)AT89S51内部有两个定时/计数器 定时计数器到底是什么?第7页/共76页一、定时/计数器概述1.核心 定时/计数器的核心部件是16位二进制加1计数器(TH0、TL0或TH1、TL1)。特性:(1)每来一个计数脉冲信号,T0或T1会在原来计数值(或初值)的基础上加1.(2)直到计满,再来一脉冲,计数值清0,
4、会发生溢出。向CPU发出中断请求,告诉CPU这次计数结束。再开始下一轮计数。这就像闹钟定时的时间一到,闹钟就会响一样。2.计数和定时有什么不同 类比生活中计数,定时(定时1分钟)所以定时也是一种计数16位加位加1计数器计数器 00H 20H计数脉冲 21H FFH FFH计数脉冲 TF 1向CPU发出中断请求第8页/共76页3.单片机中的定时、计数器两个定时/计数器分别叫T0,T1计数脉冲从哪来?当需要计数时,计数脉冲来自于外部脉冲源(P3.4,P3.5)当需要定时时,计数脉冲来自于系统机器周期(时钟振荡器经12分频以后的脉冲信号)。(1)计数器l对外部信号计数,外部计数脉冲从T0(P3.4)
5、和T1(P3.5)输入,开关接在下面,来一个脉冲(下降沿),将加1计数。脉冲脉冲信号信号第9页/共76页(2).定时器定时器也是一种计数器。开关接在上面,计数脉冲信号是振荡器经过12分频后信号。这是什么信号?l振荡器(晶振)的12分频信号。l如果晶振为12MHZ,则计数脉冲信号T=12*1/12M =1uS(机器周期)l即定时就是每过一个机器周期(1uS),计数器加1,直至计满溢出,定时结束。l定时器的定时时间与晶振频率和计数次数、初值等有关有关。l若计数器对此信号计数100次,则定时时间=100 1s100s。脉冲脉冲信号信号第10页/共76页单片机如何定义定时或计数功能?单片机定时或计数的
6、初值怎么设置?编程设定-单片机定时中断相关的寄存器设置单片机处理定时中断的各种情况与定时计数有关的特殊功能寄存器,:定时器的高位,低位(存放计数值),:定时器的高位,低位(存放计数值):定时控制寄存器:定时方式寄存器二、定时计数器的相关寄存器(工作方式寄存器)定时器方式寄存器TMOD的作用是设置T0、T1的工作方式。TMOD的格式:各位的功能说明:(1)M1、M0位:工作方式选择位第11页/共76页(1)M1、M0位:工作方式选择位(2):计数/定时功能选择位。=0,设置为定时器方式,计数器的输入是内部时钟脉冲,其周期等于机器周期。实际上是对机器周期进行计数。从计数值可以求得计数的时间,所以称
7、为定时器模式 =1,设置为计数器方式,计数器的输入来自T0(P3.4)或 T1(P3.5)端 的 外 部 脉 冲,对 外 部 输 入 引 脚 T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数,允许的最高计数频率为晶振频率的1/24。M1 M0 方式方式说说 明明0 0013 位定时器(TH的 8 位和TL的低 5 位)0 1116 位定时器/计数器 1 02自动重装入初值的 8 位计数器 1 13 T0 分成两个独立的 8 位计数器,T1 在方式 3 时停止工作 第12页/共76页(3)GATE:门控位。用于控制定时器的启动是否受外部中断源信号的影响。GATE=0:定时的启动与外部中
8、断无关,把TCON寄存器中的TR1(TR0)置1即可启动定时器1(定时器0)。常用。GATE=1:由控制位TR1(TR0)和引脚INT0(INT1)共同控制启动,只有在没有外部中断请求信号的情况下即外部中断引脚 INT0(INT1)引脚=1时,把TR1(TR0)置1才能定时器启动。用于检测低电平时间。例如:要设定T0T0工作在定时方式2.2.TMOD=0X02;TMOD=0X02;不能位寻址00000010第13页/共76页定时器/计数器控制寄存器TCON TF0、TF1分别是定时器/计数器T0、T1 的溢出标志位,加法计数器计满溢出时硬件自动置1,申请中断。对该标志位有两种处理方法:一种是以
9、中断方式工作,即TF1置1并申请中断,响应中断后,执行中断服务程序,并由硬件自动使TF1清0;另一种以查询方式工作,即通过查询该位是否为1来判断是否溢出,TF1置1后必须用软件使TF1清0。TR1、TR0 分别是定时器/计数器T1、T0 的定时器1启停控制位。GATE=0时,用软件使TR1置1即启动定时器1,若用软件使TR1清0则停止定时器1。GATE=1时,用软件使TR1置1的同时外部中断INT1的引脚输入高电平才能启动定时器1。所以初始化时,只涉及到TR0/1 例:启动TR0.TCON属于特殊功能寄存器,地址能被8整除,所以可位操作.这里用位操作方便。TR0=1;TF1TF1TR1TR1T
10、F0TF0TR0TR0IE1IE1IT1IT1IE0IE0IT0IT0第14页/共76页寄存器总结:3个特殊功能寄存器 IE TMOD TCON导入:例如要求单片机检测计数200个脉冲信号?定时器计数器用于定时或计数时,必须按照需要给计数器设置初值。定时器计数器在计数初值的基础上以加1的方式进行计数,在计数器从全1变为全0时,将自动产生溢出中断请求,表示此次定时、计数结束。计数初值怎么设置?定时、计数器有四种工作方式,实际使用中应用选择哪种?第15页/共76页三、定时/计数器的计数容量及初值1最大计数容量(次数)最大计数容量与计数器的二进制位数有关,关系为2N举例,若为2位计数器,00,01,
11、10,11,最大计数值为2N=42.计数初值计数不一定是从0开始,这要根据需要来设定。这个预先设定的计数起点值称为计数初值。FFFFH 最大计数容量 初值 0000H计数值+初值=最大计数容量举例,一个杯子的总容量为最大计数容量,已经装了少量的水为初值,还能装多少水位计数值第16页/共76页四定时/计数器的工作方式 MCS-51单片机的T/C有4种工作方式,分别由TMOD寄存器中的M1、M0两位的二进制编码所决定。1.方式0 13位计数器 在方式0下,T0和T1工作在13位的定时/计数器方式,由TH的高 8 位和TL的低 5 位组成。当T1的低五位TL1计满时向它的高八位TH1进位,当T1的1
12、3位计数器加到全部为 1 以后,再加1就产生溢出,这时置TCON的TF1为 1,同时把计数器全部变 0。然后从 0 开始继续计数。计数值范围:0(8191)最大计数容量213=8192如计数值为N,则置入的初值X为:X+N=8192例如:若定时/计数器T0的计数值为1000,则初值为7192,把初值转换成二进制数为1110000011000B,则TH0=11100000B,TL0=00011000B。脉冲脉冲信号信号第17页/共76页2.方式1 16位计数器 在方式1下,T0和T1工作在16位的定时/计数器方式,由TH的高 8 位和TL的低 8 位组成。当T1的低8位TL1计满时向它的高八位T
13、H1进位,当T1的16位计数器加到全部为 1 以后,再加1就产生溢出,这时置TCON的TF1为 1,同时把计数器全部变 0。然后从 0 开始继续计数。最大计数次数216=65536如计数值为N,则置入的初值X为:X+N=65536如定时/计数器T0的计数值为1000,则初值为65536-1000=64536,把初值转换成二进制数为1111110000011000B,则TH0=11111100B,TL0=00011000B。脉冲脉冲信号信号第18页/共76页3方式2 8位自动重装初值计数器 在方式2下,TL0用作8位计数器,TH0用作初值寄存器。当T1的8位计数器加到全部为 1 以后,再加1就产
14、生溢出,这时置TCON的TF1为 1;同时,TH1中的初值装入TL1TL1又从初值开始计数。最大计数次数28=256如计数值为N,则置入的初值X为:X+N=256 如定时/计数器T0的计数值为100,则初值为256-100=156,把初值转换成二进制数为10011100B,则TH0=TL0=10011100B。脉冲脉冲信号信号特别适合于产生比较精确的连续脉冲信号。第19页/共76页4方式3 2个独立的8位计数器 方式3只适用于定时器T0,TL0既能作定时器也能作计数器使用,而TH0只能作定时器使用而不能作计数器使用。比较:(方式0,1,2)1.3种方式的最大区别是计数位数不同(13,16,8)
15、,所以最大计数值或定时时间也不同。2.工作方式0和工作方式1的特点就是计数溢出后,计数器变为全0,因而循环定时或循环计数应用时就存在反复设置初值。工作方式2具有自动重装载功能,即自动加载计数初值。第20页/共76页以方式1为例,16位,最大计数容量65536如果采用12的晶振,对应的脉冲周期是微秒,计满65536个脉冲所对应的时间就是65.536ms。计数,只要用预置数的方法先在计数容器内存入一个初值,如我们要计100次,那就存入65436初值,只要再来100个脉冲,就刚好会溢出,引发中断。那么,定时初值计算?第21页/共76页五.定时/计数初值计算由 计数值+计数初值=最大计数容量,得到:(
16、计数值+计数初值)机器周期=最大计数容量机器周期计数次数机器周期+计数初值机器周期=最大计数容量机器周期定时时间+计数初值机器周期=最大计数容量机器周期即 定时时间=(最大计数容量-初值)机器周期所以,定时初值=最大计数容量-定时时间/机器周期 =2N-定时时间/机器周期不同工作方式的定时初值或计数初值的计算方法如下表所示:工作方式工作方式计数位数计数位数 最大计数容量最大计数容量最大定时时最大定时时间间定时初值计算公定时初值计算公式式计数初值计算公式计数初值计算公式方式方式013213=8192213 T机机X=213-T/T机机X=213-计数值计数值方式方式116216=65536216
17、 T机机X=216-T/T机机X=216-计数值计数值方式方式2828=25628 T机机X=28-T/T机机X=28-计数值计数值第22页/共76页举例:定时1秒,晶振12MHZ,方式1,初值为多少?如何产生1秒定时信号?晶振12MHZ,机器周期1us4种工作方式中,最大计数容量是方式1,65536则65536us=65.536ms所以定1次不够那就定多次,累计在一起,构成1秒那选择T0,工作在方式0,一次定时50ms,循环20次初值多少?TH0=0 x3c;TL0=0 xb0;第23页/共76页 所以,在用到定时中断之前,要先用指令来设置相关寄存器的初始值,来设定定时中断的条件-定时中断的
18、初始化。五、定时程序的编写1、程序结构 几个程序?回忆中断定义 两个程序:主程序、定时中断服务子程序 void main()void 名字()interrupt 中断号 注意:名字,自己随意取;中断号,0-4 定时中断,中断号是1或3 2、这两个程序分别做什么 结合一个例子看一下 第24页/共76页例1:发光二极管每隔1秒闪烁1次。要求用中断方法设计实现1s的闪烁解:程序的结构(中断方式,查询方式)如何产生1秒定时信号?T0一次定时50ms,循环20次 确定工作方式,计算初值用到定时中断,需要定时中断初始化,设置寄存器的值 -放在主程序平时做的事情,等待1次50ms定时结束;-放在主程序定时时
19、间到,有中断请求时,灯闪烁,返回平时状态。-放在定时中断服务程序void main()定时中断初始化等待1次50ms定时结束 void 名字()interrupt 中断号 重新赋初值 灯闪烁 第25页/共76页#include sbit led=P10;unsigned char m=0;void main()P1=0 xff;EA=1;中断初始化ET0=1;TMOD=0 x01;TH0=0 x3c;TL0=0 xb0;TR0=1;while(1);等待中断(一次50ms)来void lsd()interrupt 1 TH0=0 x3c;重新赋初值 TL0=0 xb0;if(+m19)判断是否
20、1S到 led=led;m=0;看仿真第26页/共76页总结:这两个程序分别做什么1、主程序(1)在产生定时中断请求前,即主程序中完成定时中断初始化(设置3个寄存器)a.确定定时器/计数器的工作方式,确定方式控制字,并写入TMOD。b.预置定时初值或计数初值,根据定时时间或计数次数,计算定时初值或计数初值,并写入TH0、TL0或TH1、TL1。c.根据需要开放定时器/计数器的中断,给IE中的相关位赋值。d.启动定时器/计数器,给TCON中的TR1或TR0置1。(2)CPU平时做的事情2、定时中断服务程序 定时时间到时要做的事情第27页/共76页例2:设晶振频率fOSC=12MHz,使用定时器1
21、以方式1产生周期为400s的方波脉冲,并由P1.0 输出。试以中断方式实现。要产生400s 的方波脉冲,只需在P1.0端以200s为间隔,交替输出高低电平即可实现。为此,定时间应为200s,定时时间一到,对P1.0 端做取反操作即可。主程序:定时中断初始化定时中断服务子程序:P1.0 端做取反,初值重新赋值初值计算:初值=216-T/T机=65536-200 难点:把初值的十进制转化为4位十六进制,高8位放在TH0,低8位放在TL0简单表达式写法:TH0=(65536-200)/256;TL0=(65536-200)%256;第28页/共76页#include sbit led=P10;voi
22、d main()P1=0 xff;EA=1;ET0=1;TMOD=0 x01;T1为方式1TH0=(65536-200)/256;初值TL0=(65536-200)%256;TR0=1;启动定时while(1);等待中断void lsd()interrupt 1 TH0=(65536-200)/256;重新设置初值 TL0=(65536-200)%256;led=led;输出取反第29页/共76页例3:流水灯,每隔1秒循环左移点亮。用定时中断来实现。学生讨论,确定编程方案。主程序做什么?定时中断服务程序做什么?第30页/共76页#include#include sbit led=P10;uns
23、igned char m=0,n;void main()P1=0 xfe;n=0 xfe;EA=1;ET0=1;TMOD=0 x01;TH0=0 x3c;TL0=0 xb0;TR0=1;while(1);void lsd()interrupt 1TH0=0 x3c;TL0=0 xb0;if(+m19)n=_crol_(n,1);P1=n;m=0;第31页/共76页例:设计出能够显示时间的电子钟,六位数码管显示。电子钟两个关键:显示方式?-数码管显示-动态显示 (我们在前面讲过的显示按键次数的例子)秒脉冲如何产生?-单片机的T0来定时1S(前面的例子)我们需要对秒脉冲计数,记满60个,为1分钟;
24、再需要对分钟信号计数,记满60个,为1小时。主程序:定时中断初始化 显示小时、分钟、秒中断服务子程序:重新赋初值 判断1秒到了吗?判断1分钟到了吗?判断1小时到了吗?第32页/共76页#include unsigned char code sz1=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e;/数码管段值数组unsigned char sdat=0,0,0,0,0,0;/存放小时、分钟、秒的十位、个位的数组 unsigned char wx=0 x0
25、1,0 x02,0 x04,0 x08,0 x10,0 x20;/6个数码管位选信号数组 unsigned char m=0,sec=0,min=0,hou=0;/存放小时、分钟、秒个数的变量void delay(unsigned int a)unsigned char i;while(a-)for(i=0;i120;i+);第33页/共76页void disp()unsigned char i;sdat0=hou/10;/小时十位 sdat1=hou%10;/小时个位 sdat2=min/10;sdat3=min%10;sdat4=sec/10;sdat5=sec%10;for(i=0;i6
26、;i+)P2=sz1sdati;动态显示4步/送段值 P1=wxi;/相应的位选有效 delay(10);/延时 P1=0 x00;/关闭 void main()P1=0 x00;/关闭显示 EA=1;/定时中断初始化 ET0=1;TMOD=0 x01;TH0=0 x3c;TL0=0 xb0;TR0=1;while(1)disp();/一边显示,一边等待中断(一次50ms)来第34页/共76页void lsd()interrupt 1 TH0=0 x3c;/重新赋初值 TL0=0 xb0;m+;if(m=20)/判断是否1S到 sec+;m=0;if(sec=60)/判断是否1分钟到 min+
27、;sec=0;if(min=60)/判断是否1小时到 hou+;min=0;if(hou=24)/判断是否1天到 hou=0;第35页/共76页学生分组讨论以下问题,:(1)如何设计1S程序(2)把书上的静态改为动态,如何修改电路、程序教师提出问题:那么我们倒计时的硬件电路如何构建?构建好后,如何编写程序呢?总结布置作业 1书上习题 2书上的静态改为动态第36页/共76页实验:设计60秒的倒计时,两位数码管显示。倒计到0时,喇叭报警。(基于开发板)第37页/共76页 项目四 倒计时 键盘的设计与实现 -认识键盘 第38页/共76页知识目标:1.掌握键盘的扫描法2.掌握LCD的引脚技能目标:1.
28、掌握按键的检测2.掌握键盘的连接方法3.掌握LCD与单片机的接口第39页/共76页 第40页/共76页一、基础知识 键盘是单片机应用系统中人机交流不可缺少的输入设备。键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件。键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换为电气上的逻辑关系(1和0)。触点式按键开关,使用时轻轻点按开关按钮就可使开关接通,当松开手时开关既断开,恢复为原来的电平。1.键盘分类(1)独立式按键(2)矩阵按键 第41页/共76页二、单个按键1.结构如下图所示,其特点是每个按键单独占用一根I/O口线,每个按键工作不会影响其他I/O口线的状态。(1)按键未
29、按下,输入高电平 按键按下,输入低电平(2)上拉电阻保证了有确定的高电平,P0口。P1,P2,P3可不接上拉电阻)外接上拉电阻10K左右(3)使用时:先把对应的输入I/O口置1 再对该口做读操作,若为1,说明没按下;为0,2.键的可靠输入由于机械触点的弹性作用,在开关闭合及断开的瞬间均有抖动过程,出现一系列电脉冲,然后其触点才稳定下来。其抖动过程如右图所示,这种抖动会影响我们检测按键是否按下。抖动时间的长短与开关的机械特性有关,一般为5 10ms。第42页/共76页为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖;而当键数较
30、多时,采用软件去抖。在硬件上可采用在键输出端加 R-S触发器(双稳态触发器)或 单稳态触发器构成去抖动电路,如下图所示是一种由R-S触发器 构成的去抖动电路,当触发器翻转 时,触点抖动不会对其产生任何影响。键盘输出经双稳态电路之后变为规范的矩形方波。软件上采取的措施是在检测到有按键按下时,执行一个5ms左右(具体时间应视所使用的按键进行调整)的延时程序,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而消除抖动的影响。第43页/共76页3、应用(1)独立按键需检测先按下,再抬起:if(S1=0)/如果按
31、键按下 delay(5);/延时消抖 if(S1=0)/确定按键按下 while(S1=0);i+;./等待按键抬起再做相关操作 第44页/共76页例:设计的发声电路。不同频率的脉冲电信号送到扬声器上,会发出不同的声音即不同的音调“DO”,“RE”,“ME”等。音乐就是由不同的频率的脉冲信号组合来构成的,因此如果要播放一首歌曲,只需把一首歌曲的音调对应频率关系弄正确即可。我们可以利用单片机的定时器产生各种不同频率的方波脉冲信号。DO:523HZ RE:587HZ ME:659HZ本次设计中单片机晶振为12MHZ,那么定时器的计数周期为1MHZ,假如选择工作方式1,那T值便为T=65536-51
32、05/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示:第45页/共76页#include unsigned long code yy=64580,64684,64777,64820,64898,64968,65030;sbit K1=P10;sbit K2=P11;sbit K3=P12;sbit K4=P13;sbit K5=P14;sbit K6=P15;sbit K7=P16;sbit BEEP=P30;unsigned char i,j,m;void main()BEEP=0;P1=0XFF;EA=1;ET0=1;TMOD
33、=0 x01;TR0=0;while(1)if(K1=0)while(K1=0);m=0;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K2=0)while(K2=0);m=1;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K3=0)while(K3=0);m=2;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K4=0)while(K4=0);m=3;TH0=i=yym/256;TL0=j=yym%256;TR0=1;第46页/共76页if(K5=0)while(K5=0);m=4;TH0=i=yym/256;
34、TL0=j=yym%256;TR0=1;if(K6=0)while(K6=0);m=5;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K7=0)while(K7=0);m=6;TH0=i=yym/256;TL0=j=yym%256;TR0=1;void lsd()interrupt 1 TH0=i;TL0=j;BEEP=BEEP;第47页/共76页播放音乐实现方法一首歌的简谱,由很多音组成,每个音由音调和节拍组成,才能发出正确的音。(1)音频控制向蜂鸣器输出一定频率的脉冲方波信号就能发出某个音调。利用单片机的定时器实现例如:求出“1”音的定时时间建立简谱中每个音调对
35、应的频率数组f为了使用方便,利用宏定义,把每个音调的频率值定义一下。以下以好人一生平安为例。#define l_dao 262#define l_re 286#define l_mi 311#define l_fa 349#define l_sao 392#define l_la 440#define l_xi 494第48页/共76页#define dao 523#define re 587#define mi 659#define fa 698#define sao 784#define la 880#define xi 987#define h_dao 1046#define h_re
36、1174#define h_mi 1318#define h_fa 1396#define h_sao 1567#define h_la 1760#define h_xi 1975第49页/共76页unsigned int code f=re,mi,re,dao,l_la,dao,l_la,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,sao,la,mi,sao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,l_la,dao,l_la,l_sao,l_re,l_mi,l_sao,re,re,sao,la,sao,fa
37、,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,re,l_la,dao,re,l_la,dao,re,mi,re,0 xff;第50页/共76页(2)节拍控制本例简谱的节拍为每分钟72拍,则每拍所需时间:1/72=833ms根据乐谱知识,以第一行的第一小节为例,各个音调的节拍为:2:1拍,需延时833ms32:2个1/4拍,需分别延时208ms1:1拍,需延时833ms6:1/4拍,需延时208ms。根据以上分析,可以取1/4拍
38、(208ms)为1个延时单位。若某个音调为1/2拍,则延时2个单位,以此类推。利用软件延时程序实现。建立简谱中每个音调对应的节拍数组jp第51页/共76页 unsigned char code jp=4,1,1,4,1,1,2,2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4,2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10;第52页/共76页(3)音调和节拍的联合控制依次从f数组中读出音调的频
39、率,根据频率计算出定时时间初值,启动定时,发出该频率的音调;该音调的发声时间可由节拍控制,从jp数组中取出该音调的节拍数,通过调用延时程序控制。第53页/共76页3、应用(2)一键多功能例:一上电,全灭;按下按键K1,D1闪烁;再次按下按键K1,D2闪烁;再次按下按键K1,D3闪烁;再按下按键K1,D4闪烁。再次按下K1,灯全灭,如此循环。K1键对应五个功能,我们定义功能号ID为0,1,2,3,4ID=0,灯全灭;ID=1,D1闪烁;ID=2,D2闪烁;ID=3,D3闪烁;ID=4,D4闪烁;第54页/共76页#include /包含AT89X52.H头文件sbit k1=P30;sbit d
40、0=P10;sbit d1=P11;sbit d2=P12;sbit d3=P13;void delay(unsigned int a)unsigned char i;while(-a!=0)for(i=0;i125;i+);void main()unsigned char id=0;while(1)P1=0 xff;delay(200);if(k1=0)delay(10);if(k1=0)while(k1=0);id+;if(id=5)id=0;switch(id)case 0:P1=0 xff;break;case 1:d0=d0;delay(200);break;case 2:d1=d1
41、;delay(200);break;case 3:d2=d2;delay(200);break;case 4:d3=d3;delay(200);break;第55页/共76页(3)独立式键盘可以用case语句,也可以用if语句。if(k1=0)delay(5);if(k1=0)while(k1=0);i+;.if(k2=0)delay(5);if(k2=0)while(k2=0);i-;.省略了延时消抖,最好加上。第56页/共76页电子琴:7个按键,分别发DOU、RE、MI、FA、SOL、。第57页/共76页电子琴#include unsigned long code yy=64580,646
42、84,64777,64820,64898,64968,65030;sbit K1=P10;sbit K2=P11;sbit K3=P12;sbit K4=P13;sbit K5=P14;sbit K6=P15;sbit K7=P16;sbit BEEP=P30;unsigned char i,j,m;void main()BEEP=0;P1=0XFF;EA=1;ET0=1;TR0=0;TMOD=0 x01;while(1)if(K1=0)while(K1=0);m=0;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K2=0)while(K2=0);m=1;TH0=i
43、=yym/256;TL0=j=yym%256;TR0=1;if(K3=0)while(K3=0);m=2;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K4=0)while(K4=0);m=3;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K5=0)while(K5=0);m=4;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K6=0)while(K6=0);m=5;TH0=i=yym/256;TL0=j=yym%256;TR0=1;if(K7=0)while(K7=0);m=6;TH0=i=yym/256;T
44、L0=j=yym%256;TR0=1;void lsd()interrupt 1 TH0=i;TL0=j;BEEP=BEEP;第58页/共76页实验:在上次试验倒计时的基础上,增加三个按键(K1:初值加1。K2:初值减1。K3:开始。)第59页/共76页三、键盘键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件。1.键盘分类 编码键盘:电脑键盘,内部含编码芯片,每按一个键,由编码芯片产生键值,如ASCII码键盘、BCD码键盘 非编码键盘:靠软件编程来识别健值的键盘。在单片机的各种系统中,最常用的是非编码键盘。非编码键盘又分为独立式按键和矩阵式键盘(如电话,取款机键盘)。第60页/共76
45、页2.矩阵式键盘(1)结构 单片机系统中,若使用按键较多时,通常采用矩阵式键盘,其结构如下图所示,可以节省I/O口。采用行列式结构并按矩阵形式排列,如图所示。在行列的交点上都对应有一个单触点按键。一个44的行、列结构,可以构成一个含有16个按键的键盘,无键按下时,各行、列线彼此相交但不相连;当按键被按下时则其交点的行线和列线接通。第61页/共76页(2)按键原理控制方式:a.先判断是否有键按下:行线都输出低电平,然后读列线的值。若列线都为高电平,说明无键按下;否则,有键按下。b.如有,延时消抖,再判断,确定有键按下。c.再判断哪一键按下,并得到键号。d.等待按键释放,根据键号转向不同的功能程序
46、。(3)判断哪个键按下的方法(c步骤):扫描法第62页/共76页(一)扫描法(行扫描)(1)判别键盘上有无键闭合 其方法为:让P3.0P3.3(行线)全输出0,P3.4P3.7(列线)作输入口 然后读P3口(列线值)。若高4位P3.4P3.7(列线)全为1,则键盘上没有闭合键,若P3.4P3.7不全为1,则有键处于闭合状态。(2)去除键的机械抖动 其方法为:当判别到键盘上有键闭合后,延时一段时间再判别键盘的状态,若仍有键闭合,则认为键盘上有一个键处于稳定的闭合状态,否则认为键抖动。(3)判别闭合键的键号(逐行扫描)其方法为:对键盘的行线进行扫描,逐行进行扫描第63页/共76页(一)扫描法(行扫
47、描)(1)判别键盘上有无键闭合(2)去除键的机械抖动(3)判别闭合键的键号(逐行扫描)建立一个键值数组:把16个按键按下时读出的P3值按顺序写成一个数组。jp=0 xee,0 xde,0 xbe,0 x7e,0 xed,0 xdd,0 xbd,0 x7d,0 xeb,0 xdb,0 xbb,0 x7b,0 xe7,0 xd7,0 xb7,0 x77;扫描值 读过来P3口的值 P3.3P3.0 P3.7P3.0第一行 0111 0:ee 1:de 2:be 3:7e第二行 1011 4:ed 5:dd 6:bd 7:7d第三行 1101 8:eb 9:db A:bb B:7b第四行 1110 C
48、:e7 D:D7 E:b7 F:77逐行扫描:对键盘的每一行进行扫描,判断此行是否有键按下。对每一行扫描时,读P3口的值,把该值和数组中的值进行逐个比较,找到相等时数组的序号即为键号。第64页/共76页扫描法的每个按键的扫描值(编码)会随着按键连接的不同而不同 图1 图2 eehdehbeh7ehedhddhbdh7dhebhdbhbbh7bhe7hd7hb7h77h第65页/共76页(一)扫描法(行扫描)(1)判别键盘上有无键闭合(2)去除键的机械抖动(3)判别闭合键的键号(逐行扫描)(4)使CPU对键的一次闭合仅作一次处理 采用的方法是等待闭合键释放以后再作处理eehdehbeh7ehed
49、hddhbdh7dhebhdbhbbh7bhe7hd7hb7h77h第66页/共76页例:用1位数码管显示按键的键号。电路第67页/共76页程序#include#include unsigned char code sz1=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e;/数码管段值数组unsigned char code jp=0 xee,0 xde,0 xbe,0 x7e,0 xed,0 xdd,0 xbd,0 x7d,0 xeb,0 xdb,0
50、xbb,0 x7b,0 xe7,0 xd7,0 xb7,0 x77;/矩阵键盘的键值数组unsigned char c=0;/定义c变量,用来存放键号void delay(unsigned int t)unsigned char i;while(t-)for(i=0;i125;i+);第68页/共76页void sm()/键盘扫描子程序 unsigned char j,n,a,m=0 xfe;P2=0 xf0;/P2.0P2.3(行线)全输出0,P2.4P2.7(列线)作输入口 k=P2;/读P2口 k=k&0 xf0;/只要得到高4位(列线值)。if(k!=0 xf0)/如果列值全为1(11