资源预览内容
第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
第9页 / 共76页
第10页 / 共76页
亲,该文档总共76页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
微控制器系统设计与应用微控制器系统设计与应用微控制器系统设计与应用微控制器系统设计与应用 刘燎原刘燎原 江苏建筑职业技术学院江苏建筑职业技术学院回顾:回顾:u(一)动态显示(一)动态显示u1.什么是动态显示什么是动态显示u2.动态显示步骤动态显示步骤 1个数码管步骤:个数码管步骤: (1)送段值)送段值 (2)送位选(公共端)送位选(公共端) (3)延时)延时 (4)关闭)关闭 3.加驱动方法加驱动方法 三极管三极管 锁存器锁存器实验总结:实验总结:u实验板数码管动态显示实验板数码管动态显示假设要求第一个数码管先显示百位(例如假设要求第一个数码管先显示百位(例如2),则:),则:1.送段值送段值:P0输出段值输出段值5BH,P2.6=1(数据进入)(数据进入), P2.6=0(数据锁存)(数据锁存),段值送段值送入数码管的段值端;入数码管的段值端;2.送位选送位选:P0输出位选值输出位选值FEH,P2.7=1 (数据进入)(数据进入), P2.7=0(数据锁存)(数据锁存),位选位选值送入数码管的位选端;值送入数码管的位选端;3.延时延时其他两个数码管类似这三个步骤。其他两个数码管类似这三个步骤。回顾:回顾:u(二)中断(二)中断u1.中断源中断源u 5个个u2.中断优先级中断优先级u 2个个 3.外部中断外部中断 P3.2,P3.3 4.外部中断寄存器外部中断寄存器 IE:EA,EX0,ET0,EX1,ET1,ES TCON:IE0,IT0,IE1,IT1 IP:PX0,PT0,PX1,PT1,PS 中断程序如何编写?中断程序如何编写?uVoid main uu 中断初始化;中断初始化;u 一边做平时的工作,一边等待中断来;一边做平时的工作,一边等待中断来;uuVoid 名字(名字( ) interrupt 0/3uu 要求要求CPU做的事情;做的事情;u 项目四 倒计时倒计时 -单片机定时计数器上节课复习上节课复习u举出生活中中断的例子。举出生活中中断的例子。u中断过程包括哪几个步骤?中断过程包括哪几个步骤? 中断请求、中断响应、中断处理、中断返回中断请求、中断响应、中断处理、中断返回u单片机内有哪个中断源。单片机内有哪个中断源。 外部中断:外部中断:2 内部中断:内部中断:3 定时器定时器/ /计数器计数器导入:单片机应用系统中定时计数的需求:导入:单片机应用系统中定时计数的需求:u 如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对酒瓶的计数装置等。酒瓶的计数装置等。 以实现定时控制以实现定时控制; ; 以实现对外界事件进行计数。以实现对外界事件进行计数。u 用到定时用到定时/ /计数计数u 实现定时实现定时/ /实现方式:实现方式:u1.1.软件定时;(延时程序)占用软件定时;(延时程序)占用CPUCPUu2.2.不可编程硬件定时(不可编程硬件定时(555555););u3.3.可编程定时可编程定时 (82538253,单片机定时,单片机定时/ /计数器)计数器) AT89S51AT89S51内部有两个定时内部有两个定时/ /计数器计数器 定时计数器到底是什么?定时计数器到底是什么? 一、定时一、定时/计数器概述计数器概述u1.核心核心 定时定时/计数器的核心部件是计数器的核心部件是16位二进制加位二进制加1计数器计数器(TH0、TL0或或TH1、TL1) 。 特性:特性:(1)每来一个计数脉冲信号,)每来一个计数脉冲信号,T0或或T1会在会在原来计数值原来计数值(或初值)的基(或初值)的基础上础上加加1.(2)直到直到计满计满,再来一脉冲,计数值清,再来一脉冲,计数值清0 0,会发生,会发生溢出。溢出。 向向CPUCPU发出中断请求,告诉发出中断请求,告诉CPUCPU这次计数结束。再开始这次计数结束。再开始下一轮下一轮计数。计数。 这就像闹钟定时的时间一到,闹钟就会响一样这就像闹钟定时的时间一到,闹钟就会响一样。2.2.计数和定时有什么不同计数和定时有什么不同 类比生活中计数,定时(定时类比生活中计数,定时(定时1 1分钟)分钟) 所以所以定时也是一种计数定时也是一种计数16位加位加1计数器计数器 00H 20H计数脉冲 21H FFH FFH计数脉冲 TF 1向向CPU发出中断请求发出中断请求3.3.单片机中的定时、计数器单片机中的定时、计数器两个定时两个定时/ /计数器分别叫计数器分别叫T0,T1T0,T1计数脉冲从哪来?计数脉冲从哪来?当需要计数时,计数脉冲来自于外部脉冲源(当需要计数时,计数脉冲来自于外部脉冲源(P3.4,P3.5)P3.4,P3.5)当需要定时时,计数脉冲来自于系统机器周期当需要定时时,计数脉冲来自于系统机器周期( (时钟振荡器经时钟振荡器经1212分频以后的脉冲信号分频以后的脉冲信号) )。 u(1)(1)计数器计数器l对外部信号对外部信号计数计数,外部计数脉冲从,外部计数脉冲从T0(P3.4)T0(P3.4)和和T1(P3.5)T1(P3.5)输入,开关接在下面,来输入,开关接在下面,来一个脉冲(下降沿),将加一个脉冲(下降沿),将加1 1计数。计数。脉冲脉冲信号信号u(2 2). .定时器定时器u定时器也是一种计数器。定时器也是一种计数器。u开关接在上面,计数脉冲信号是振荡器经过开关接在上面,计数脉冲信号是振荡器经过1212分频后信号。分频后信号。 这是什么信号?这是什么信号?l振荡器(晶振)的振荡器(晶振)的1212分频信号。分频信号。l如果晶振为如果晶振为12MHZ,12MHZ,则计数脉冲信号则计数脉冲信号T=12*1/12M =1uS T=12*1/12M =1uS (机器周期)(机器周期)l即定时就是即定时就是每过一个机器周期每过一个机器周期( (1uS1uS) ),计数器加,计数器加1 1,直至计满溢出,直至计满溢出,定时结束。定时结束。l定时器的定时时间与定时器的定时时间与晶振频率晶振频率和和计数次数计数次数、初值初值等有关有关。等有关有关。l若计数器对此信号计数若计数器对此信号计数100100次,则定时时间次,则定时时间=100=100 1 1 s s100100 s s。脉冲脉冲信号信号单片机如何定义定时或计数功能?单片机如何定义定时或计数功能?单片机定时或计数的初值怎么设置?单片机定时或计数的初值怎么设置?编程设定编程设定-单片机定时中断相关的寄存器单片机定时中断相关的寄存器设置单片机处理定时中断的各种情况设置单片机处理定时中断的各种情况u与定时计数有关的特殊功能寄存器与定时计数有关的特殊功能寄存器,:定时器的高位,低位(,:定时器的高位,低位(存放计数值存放计数值),:定时器的高位,低位(,:定时器的高位,低位(存放计数值存放计数值):定时控制寄存器:定时控制寄存器:定时方式寄存器:定时方式寄存器二、定时计数器的相关寄存器二、定时计数器的相关寄存器(工作方式寄存器)(工作方式寄存器)定时器方式寄存器定时器方式寄存器TMODTMOD的作用是设置的作用是设置T0T0、T1T1的工作方式。的工作方式。 TMODTMOD的格式:的格式:各位的功能说明:各位的功能说明:(1) M1(1) M1、M0M0位:工作方式选择位位:工作方式选择位 (1) M1(1) M1、M0M0位:工作方式选择位位:工作方式选择位(2 2):计数):计数/ /定时功能选择位。定时功能选择位。 =0=0,设设置置为为定定时时器器方方式式,计计数数器器的的输输入入是是内内部部时时钟钟脉脉冲冲,其其周周期期等等于于机机器器周周期期。实实际际上上是是对对机机器器周周期期进进行行计计数数。从从计计数数值值可可以以求求得得计数的时间,所以称为定时器模式计数的时间,所以称为定时器模式 =1=1,设设置置为为计计数数器器方方式式,计计数数器器的的输输入入来来自自T0T0(P3.4P3.4)或或T1T1(P3.5P3.5)端端的的外外部部脉脉冲冲,对对外外部部输输入入引引脚脚T0T0(P3.4P3.4)或或T1T1(P3.5P3.5)的外部脉冲(负跳变)计数,允许的最高计数频率为晶振频率的的外部脉冲(负跳变)计数,允许的最高计数频率为晶振频率的1/241/24。 M1 M0 方式方式说说 明明0 0013 位定时器(TH的 8 位和TL的低 5 位) 0 1116 位定时器/计数器 1 02自动重装入初值的 8 位计数器 1 13 T0 分成两个独立的 8 位计数器, T1 在方式 3 时停止工作 (3) (3) GATEGATE:门控位:门控位。用于控制定时器的启动是否受外部中断源信号的影响。用于控制定时器的启动是否受外部中断源信号的影响。GATE=0GATE=0:定时的启动与外部中断无关:定时的启动与外部中断无关, ,把把TCONTCON寄存器中的寄存器中的TR1(TR0)TR1(TR0)置置1 1即即可启动可启动定时器定时器1(1(定时器定时器0)0)。常用。常用。GATE=1GATE=1:由控制位:由控制位TR1(TR0)TR1(TR0)和引脚和引脚INT0(INT1)INT0(INT1)共同共同控制启动控制启动, ,只有在没只有在没有外部中断请求信号的情况下即外部中断引脚有外部中断请求信号的情况下即外部中断引脚 INT0(INT1)INT0(INT1)引脚引脚=1=1时时, ,把把TR1(TR0)TR1(TR0)置置1 1才能定时器启动。用于检测低电平时间。才能定时器启动。用于检测低电平时间。例如:要设定例如:要设定T0T0工作在定时方式工作在定时方式2.2.TMOD=0X02; TMOD=0X02; 不能位寻址不能位寻址00000010u定时器定时器/ /计数器控制寄存器计数器控制寄存器TCONTCONu uTF0TF0、TF1TF1分别是定时器分别是定时器/ /计数器计数器T0T0、T1 T1 的溢出标志位的溢出标志位, , 加法计数器计满溢出时硬件加法计数器计满溢出时硬件自动自动置置1, 1, 申请中断。申请中断。u对该标志位有两种处理方法:对该标志位有两种处理方法:一种是以中断方式工作,即一种是以中断方式工作,即TF1TF1置置1 1并申请中断,响应中断后,执行中断服务程序,并申请中断,响应中断后,执行中断服务程序,并由硬件自动使并由硬件自动使TF1TF1清清0 0;另一种以查询方式工作,即通过查询该位是否为另一种以查询方式工作,即通过查询该位是否为1 1来判断是否溢出,来判断是否溢出,TF1TF1置置1 1后必须后必须用软件使用软件使TF1TF1清清0 0。 uTR1TR1、TR0TR0 分别是定时器分别是定时器 / /计数器计数器T1T1、 T0 T0 的的定时器定时器1 1启停控制位启停控制位。 GATE=0GATE=0时,用软件使时,用软件使TR1TR1置置1 1即启动定时器即启动定时器1 1,若用软件使,若用软件使TR1TR1清清0 0则停止定时器则停止定时器1 1。 GATE=1GATE=1时,用软件使时,用软件使TR1TR1置置1 1的同时外部中断的同时外部中断INT1INT1的引脚输入高电平才能启动定的引脚输入高电平才能启动定时器时器1 1。 所以初始化时,只涉及到所以初始化时,只涉及到TR0/1TR0/1 例:启动例:启动TR0.TR0.uTCONTCON属于特殊功能寄存器,地址能被属于特殊功能寄存器,地址能被8 8整除,所以可位操作整除,所以可位操作. .这里用位操作方便。这里用位操作方便。uTR0=1;TR0=1; TF1TF1TR1TR1TF0TF0TR0TR0IE1IE1IT1IT1IE0IE0IT0IT0u寄存器总结:寄存器总结:3个特殊功能寄存器个特殊功能寄存器 IE TMOD TCON导入:例如要求单片机检测计数导入:例如要求单片机检测计数200个脉冲信号?个脉冲信号?u定时器计数器用于定时或计数时,必须按照需要给计数器设置初定时器计数器用于定时或计数时,必须按照需要给计数器设置初值。定时器计数器在计数初值的基础上以加值。定时器计数器在计数初值的基础上以加1的方式进行计数,在的方式进行计数,在计数器从全计数器从全1变为全变为全0时,将自动产生溢出中断请求,表示此次定时、时,将自动产生溢出中断请求,表示此次定时、计数结束。计数结束。 计数初值怎么设置?计数初值怎么设置? 定时、计数器有四种工作方式,实际使用中应用选择哪种?定时、计数器有四种工作方式,实际使用中应用选择哪种? u三、定时三、定时/ /计数器的计数容量及初值计数器的计数容量及初值u1 1最大计数容量最大计数容量(次数)(次数)u最大计数容量与计数器的二进制位数有关,关系为最大计数容量与计数器的二进制位数有关,关系为2 2N Nu举例,若为举例,若为2 2位计数器,位计数器,0000,0101,1010,1111,最大计数值为,最大计数值为2 2N N= 4= 4u2.2.计数初值计数初值u计数不一定是从计数不一定是从0 0开始,这要根据需要来设定。这个预先设定的开始,这要根据需要来设定。这个预先设定的计数起点值计数起点值称为称为计数初值。计数初值。u u FFFFHFFFFHu 最大计数容量最大计数容量u 初值初值u u 0000H0000Hu计数值计数值+ +初值初值= =最大计数容量最大计数容量u举例,一个杯子的总容量为最大计数容量,已经装了少量的水为初值,还能装多举例,一个杯子的总容量为最大计数容量,已经装了少量的水为初值,还能装多少水位计数值少水位计数值u四定时四定时/计数器的工作方式计数器的工作方式 MCS-51单单片片机机的的T/C有有4种种工工作作方方式式,分分别别由由TMOD寄寄存存器器中中的的M1、M0两两位位的的二二进进制制编编码所决定。码所决定。u1.方式方式0 13位计数器位计数器 在方式在方式0 0下,下,T0T0和和T1T1工作在工作在1313位的定时位的定时/ /计数器方式,由计数器方式,由THTH的高的高 8 8 位和位和TLTL的低的低 5 5 位位组成。组成。u u当当T1T1的低五位的低五位TL1TL1计满时向它的高八位计满时向它的高八位TH1TH1进位,当进位,当T1T1的的1313位计数器加到全部为位计数器加到全部为 1 1 以以后,再加后,再加1 1就产生溢出,这时置就产生溢出,这时置TCONTCON的的TF1TF1为为 1 1 ,同时把计数器全部变,同时把计数器全部变 0 0 。然后从。然后从 0 0 开始继续计数。开始继续计数。u计数值范围:计数值范围:0 01111111111111(8191)u最大计数容量最大计数容量213=8192u如计数值为如计数值为N,则置入的初值,则置入的初值X为:为:u X+N=8192u例如:若定时例如:若定时/计数器计数器T0的计数值为的计数值为1000,则初值为,则初值为7192, 把初值转换成二进制数为把初值转换成二进制数为1110000011000B, 则则TH0=11100000B,TL0=00011000B。脉冲脉冲信号信号u2.方式方式1 16位计数器位计数器 在方式在方式1 1下,下,T0T0和和T1T1工作在工作在1616位的定时位的定时/ /计数器方式,由计数器方式,由THTH的的高高 8 8 位和位和TLTL的低的低 8 8 位位组成。组成。u u当当T1T1的低的低8 8位位TL1TL1计满时向它的高八位计满时向它的高八位TH1TH1进位,当进位,当T1T1的的1616位计数器加到全位计数器加到全部为部为 1 1 以后,再加以后,再加1 1就产生溢出,这时置就产生溢出,这时置TCONTCON的的TF1TF1为为 1 1 ,同时把计数,同时把计数器全部变器全部变 0 0 。然后从。然后从 0 0 开始继续计数。开始继续计数。u最大计数次数最大计数次数2 21616=65536=65536u如计数值为如计数值为N N,则置入的初值,则置入的初值X X为:为:uX+N=65536X+N=65536u如定时如定时/ /计数器计数器T0T0的计数值为的计数值为10001000,则初值为,则初值为65536-1000=6453665536-1000=64536,u把初值转换成二进制数为把初值转换成二进制数为11111100111111000001100000011000B B,u则则TH0=TH0=1111110011111100B B,TL0=TL0=0001100000011000B B。脉冲脉冲信号信号u3 3方式方式2 2 8 8位自动重装初值计数器位自动重装初值计数器 在方式在方式2 2下,下,TL0TL0用作用作8 8位计数器,位计数器, TH0TH0用作初值寄存器。用作初值寄存器。u当当T1T1的的8 8位计数器加到全部为位计数器加到全部为 1 1 以后,再加以后,再加1 1就产生溢出,这时置就产生溢出,这时置TCONTCON的的TF1TF1为为 1 1 ;同时,;同时,TH1TH1中的初值装入中的初值装入TL1TL1TL1TL1又从初值开始计数。又从初值开始计数。u最大计数次数最大计数次数2 28 8=256=256u如计数值为如计数值为N N,则置入的初值,则置入的初值X X为:为:u X+N=256X+N=256u 如定时如定时/ /计数器计数器T0T0的计数值为的计数值为100100,则初值为,则初值为256-100=156256-100=156,u把初值转换成二进制数为把初值转换成二进制数为10011100B10011100B,u则则TH0= TL0=10011100BTH0= TL0=10011100B。脉冲脉冲信号信号特别适合于产生比较精确的连特别适合于产生比较精确的连续脉冲信号。续脉冲信号。u4 4方式方式3 3 2 2个独立的个独立的8 8位计数器位计数器 方式方式3 3只适用于定时器只适用于定时器T0T0, TL0TL0既能作定时器也能作计数器使用,而既能作定时器也能作计数器使用,而TH0TH0只能作定只能作定时器使用而不能作计数器使用。时器使用而不能作计数器使用。u比较比较:(方式0,1,2) 1.31.3种方式的最大区别是种方式的最大区别是计数位数不同计数位数不同(1313,1616,8 8),所以最大计),所以最大计数值或定时时间也不同。数值或定时时间也不同。 2.2.工作方式工作方式0 0和工作方式和工作方式1 1的特点就是计数溢出后,计数器变为全的特点就是计数溢出后,计数器变为全0 0,因而循环定时或循环计数应用时就存在反复设置初值。,因而循环定时或循环计数应用时就存在反复设置初值。 工作方式工作方式2 2具有自动重装载功能,即自动加载计数初值具有自动重装载功能,即自动加载计数初值。u以方式以方式1为例,为例,16位,最大计数容量位,最大计数容量65536如果采用如果采用12的晶振,对应的脉冲周期是微秒,计满的晶振,对应的脉冲周期是微秒,计满65536个脉冲所对应的时间就是个脉冲所对应的时间就是65.536ms。计数,只要用预置数的方法先在计数容器内存入一个初值计数,只要用预置数的方法先在计数容器内存入一个初值 ,如我们如我们要计要计100次,那就存入次,那就存入65436初值,只要再来初值,只要再来100个脉冲,就刚个脉冲,就刚好会溢出,引发中断。好会溢出,引发中断。那么,定时初值计算?那么,定时初值计算?u五五. .定时定时/ /计数初值计算计数初值计算u由由 计数值计数值+ +计数初值计数初值= =最大计数容量最大计数容量,得到:,得到:u(计数值(计数值+ +计数初值)计数初值)机器周期机器周期= =最大计数容量最大计数容量机器周期机器周期u计数次数计数次数机器周期机器周期+ +计数初值计数初值机器周期机器周期= =最大计数容量最大计数容量机器周期机器周期u定时时间定时时间+ +计数初值计数初值机器周期机器周期= =最大计数容量最大计数容量机器周期机器周期u即即 定时时间定时时间= =(最大计数容量(最大计数容量- -初值)初值)机器周期机器周期u所以,定时初值所以,定时初值= =最大计数容量最大计数容量- -定时时间定时时间/ /机器周期机器周期u = =2 2N N- -定时时间定时时间/ /机器周期机器周期不同工作方式的定时初值或计数初值的计算方法如下表所示:不同工作方式的定时初值或计数初值的计算方法如下表所示:工作方式工作方式计数位数计数位数 最大计数容量最大计数容量最大定时时最大定时时间间定时初值计算公定时初值计算公式式计数初值计算公式计数初值计算公式方式方式013213=8192213 T机机X=213- -T/T机机X=213- -计数值计数值方式方式116216=65536216 T机机X=216- -T/T机机X=216- -计数值计数值方式方式2828=25628 T机机X=28- -T/T机机X=28- -计数值计数值u举例:定时举例:定时1 1秒,晶振秒,晶振12MHZ12MHZ,方式,方式1 1,初值为多少?,初值为多少?u如何产生如何产生1 1秒定时信号秒定时信号? ?u晶振晶振12MHZ12MHZ,机器周期,机器周期1us1usu4 4种工作方式中,最大计数容量是方式种工作方式中,最大计数容量是方式1 1,6553665536u则则65536us=65.536ms65536us=65.536msu所以定所以定1 1次不够次不够u那就定多次,累计在一起,构成那就定多次,累计在一起,构成1 1秒秒u那选择那选择T0T0,工作在方式,工作在方式0 0,一次定时,一次定时50ms50ms,循环,循环2020次次u初值多少?初值多少?uTH0=0x3c;uTL0=0xb0; 所以,在用到定时中断之前,要先用指令来设置相关寄存器的初始值,来设所以,在用到定时中断之前,要先用指令来设置相关寄存器的初始值,来设定定时中断的条件定定时中断的条件-定时中断的初始化。定时中断的初始化。u五、定时程序的编写五、定时程序的编写u1 1、程序结构、程序结构 几个程序?几个程序? 回忆中断定义回忆中断定义 两个程序:主程序、定时中断服务子程序两个程序:主程序、定时中断服务子程序 void main()void main() void void 名字()名字() interrupt interrupt 中断号中断号 注意:名字,自己随意取;中断号,注意:名字,自己随意取;中断号,0-40-4 定时中断,中断号是定时中断,中断号是1 1或或3 3 2 2、这两个程序分别做什么、这两个程序分别做什么 结合一个例子看一下结合一个例子看一下 u例例1 1:发光二极管每隔:发光二极管每隔1 1秒闪烁秒闪烁1 1次。要求用中断方法设计实现次。要求用中断方法设计实现1s1s的闪烁的闪烁u解:程序的结构解:程序的结构( (中断方式,查询方式)中断方式,查询方式)u如何产生如何产生1 1秒定时信号秒定时信号? ? T0 T0一次定时一次定时50ms50ms,循环,循环2020次次 确定工作方式,计算初值确定工作方式,计算初值u用到定时中断,需要定时中断初始化,设置寄存器的值用到定时中断,需要定时中断初始化,设置寄存器的值 -放在主程序放在主程序u平时做的事情,等待平时做的事情,等待1 1次次50ms50ms定时结束;定时结束; -放在主程序放在主程序u定时时间到,有中断请求时,灯闪烁,返回平时状态。定时时间到,有中断请求时,灯闪烁,返回平时状态。 -放在定时中断服务程序放在定时中断服务程序void main()void main() 定时中断初始化定时中断初始化等待等待1 1次次50ms50ms定时结束定时结束 void void 名字()名字() interrupt interrupt 中断号中断号 重新赋初值重新赋初值 灯闪烁灯闪烁 u#include usbit led=P10;uunsigned char m=0;uvoid main() uuP1=0xff;uEA=1; 中断初始化中断初始化uET0=1;uTMOD=0x01;uTH0=0x3c;uTL0=0xb0;uTR0=1;uwhile(1); 等待中断(一次等待中断(一次50ms50ms)来)来uuvoid lsd() interrupt 1uu TH0=0x3c; 重新赋初值重新赋初值u TL0=0xb0;u if(+m19) 判断是否判断是否1S1S到到u led=led;u m=0;uu看仿真看仿真总结:总结:这两个程序分别做什么这两个程序分别做什么u1 1、主程序、主程序(1 1)在产生定时中断请求前,即主程序中完成定时中断初始化(设置)在产生定时中断请求前,即主程序中完成定时中断初始化(设置3 3个寄存器)个寄存器)a. a. 确定定时器确定定时器/ /计数器的计数器的工作方式工作方式,确定方式控制字,并写入,确定方式控制字,并写入TMODTMOD。b. b. 预置定时初值或计数预置定时初值或计数初值初值,根据定时时间或计数次数,计算定时初,根据定时时间或计数次数,计算定时初值或计数初值,并写入值或计数初值,并写入TH0TH0、TL0TL0或或TH1TH1、TL1TL1。c. c. 根据需要根据需要开放开放定时器定时器/ /计数器的计数器的中断中断,给,给IEIE中的相关位赋值。中的相关位赋值。d. d. 启动启动定时器定时器/ /计数器,给计数器,给TCONTCON中的中的TR1TR1或或TR0TR0置置1 1。 (2 2)CPUCPU平时做的事情平时做的事情u2 2、定时中断服务程序、定时中断服务程序 定时时间到时要做的事情定时时间到时要做的事情u例例2 2:设晶振频率设晶振频率f fOSCOSC=12MHz=12MHz,使用定时器,使用定时器1 1以方式以方式1 1产生周期为产生周期为400s400s的方的方波脉冲,并由波脉冲,并由P1.0P1.0 输出。试以中断方式实现。输出。试以中断方式实现。要产生要产生400s400s 的方波脉冲,只需在的方波脉冲,只需在P1.0P1.0端以端以200s200s为间隔,为间隔,交替交替输出输出高低电高低电平平即可实现。即可实现。为此,定时间应为为此,定时间应为200s200s,定时时间一到,对,定时时间一到,对P1.0 P1.0 端做取反操作即可。端做取反操作即可。主程序:定时中断初始化主程序:定时中断初始化定时中断服务子程序:定时中断服务子程序: P1.0 P1.0 端做取反,初值重新赋值端做取反,初值重新赋值u初值计算:初值计算:初值初值=216- -T/T机机=65536-200u 难点:难点:把初值的十进制转化为把初值的十进制转化为4位十六进制,高位十六进制,高8位放在位放在TH0,低低8位放在位放在TL0u简单表达式写法:简单表达式写法: TH0=(65536-200)/256; TL0=(65536-200)%256;#include usbit led=P10;uvoid main() uuP1=0xff;uEA=1;uET0=1;uTMOD=0x01; T1T1为方式为方式1 1uTH0=(65536-200)/256; 初值初值uTL0=(65536-200)%256;uTR0=1; 启动定时启动定时uwhile(1); 等待中断等待中断uuvoid lsd() interrupt 1uu TH0=(65536-200)/256; 重新设置初值重新设置初值u TL0=(65536-200)%256;u led=led; 输出取反输出取反uu例例3 3:流水灯,每隔:流水灯,每隔1 1秒循环左移点亮。秒循环左移点亮。 用定时中断来实现。用定时中断来实现。 学生讨论,确定编程方案。学生讨论,确定编程方案。 主程序做什么?主程序做什么? 定时中断服务程序做什么?定时中断服务程序做什么?u#include u#include usbit led=P10;uunsigned char m=0,n;uvoid main() uP1=0xfe;un=0xfe;uEA=1;uET0=1;uTMOD=0x01;uTH0=0x3c;uTL0=0xb0;uTR0=1;uwhile(1);uuvoid lsd() interrupt 1uTH0=0x3c;u TL0=0xb0;u if(+m19)u n=_crol_(n,1);u P1=n;u m=0;uu例:设计出能够显示时间的电子钟,六位数码管显示。例:设计出能够显示时间的电子钟,六位数码管显示。电子钟两个关键:电子钟两个关键:显示方式?显示方式? -数码管显示数码管显示-动态显示动态显示 (我们在前面讲过的显示按键次数的例子)(我们在前面讲过的显示按键次数的例子)秒脉冲如何产生?秒脉冲如何产生? -单片机的单片机的T0来定时来定时1S(前面的例子)(前面的例子) 我们需要对秒脉冲计数,记满我们需要对秒脉冲计数,记满60个,为个,为1分钟;再需要对分钟信号计数,记分钟;再需要对分钟信号计数,记满满60个,为个,为1小时。小时。主程序:主程序: 定时中断初始化定时中断初始化 显示小时、分钟、秒显示小时、分钟、秒中断服务子程序:中断服务子程序: 重新赋初值重新赋初值 判断判断1秒到了吗?秒到了吗? 判断判断1分钟到了吗?分钟到了吗? 判断判断1小时到了吗?小时到了吗? u#include uunsigned char code sz1=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/ 数码管段值数组数码管段值数组uunsigned char sdat=0,0,0,0,0,0; /存放小时、分钟、秒的十位、个位的数组存放小时、分钟、秒的十位、个位的数组 unsigned char wx=0x01,0x02,0x04,0x08,0x10,0x20; /6个数码管位选信号数组个数码管位选信号数组 unsigned char m=0,sec=0,min=0,hou=0; /存放小时、分钟、秒个数的变量存放小时、分钟、秒个数的变量uvoid delay(unsigned int a) unsigned char i;while(a-) for(i=0;i120;i+); uvoid disp()uunsigned char i;u sdat0=hou/10; /小时十位小时十位u sdat1=hou%10; /小时个位小时个位u sdat2=min/10;u sdat3=min%10;u sdat4=sec/10;u sdat5=sec%10;u for(i=0;i6;i+)u P2=sz1sdati; 动态显示动态显示4步步 /送段值送段值u P1=wxi; / 相应的位选有效相应的位选有效u delay(10); /延时延时u P1=0x00; /关闭关闭u uvoid main() u P1=0x00; /关闭显示关闭显示u EA=1; /定时中断初始化定时中断初始化u ET0=1;u TMOD=0x01;u TH0=0x3c;u TL0=0xb0;u TR0=1;u while(1)u disp(); /一边显示,一边等待中断(一次一边显示,一边等待中断(一次50ms)来)来uuvoid lsd() interrupt 1uu TH0=0x3c; /重新赋初值重新赋初值u TL0=0xb0;u m+;u if(m=20) /判断是否判断是否1S到到u sec+; m=0;u if(sec=60) /判断是否判断是否1分钟到分钟到u min+; sec=0;u if(min=60) /判断是否判断是否1小时到小时到u hou+; min=0;u if(hou=24) /判断是否判断是否1天到天到u hou=0;u u u u uu学生分组讨论以下问题,:学生分组讨论以下问题,:(1 1)如何设计)如何设计1S1S程序程序(2 2)把书上的静态改为动态,如何修改电路、程序)把书上的静态改为动态,如何修改电路、程序u教师提出问题:教师提出问题: 那么我们倒计时的硬件电路如何构建?构建好后,如何编那么我们倒计时的硬件电路如何构建?构建好后,如何编写程序呢?写程序呢?u总结总结u布置作业布置作业 1 1书上习题书上习题 2 2书上的静态改为动态书上的静态改为动态u实验:设计实验:设计60秒的倒计时,两位数码管显示。倒计到秒的倒计时,两位数码管显示。倒计到0时,喇叭报警。(基于开发板)时,喇叭报警。(基于开发板) 项目四 倒计时倒计时 键盘的设计与实现 -认识键盘 u知识目标:知识目标:1.掌握键盘的扫描法掌握键盘的扫描法2.掌握掌握LCD的引脚的引脚u技能目标:技能目标:1.掌握按键的检测掌握按键的检测2.掌握键盘的连接方法掌握键盘的连接方法3.掌握掌握LCD与单片机的接口与单片机的接口 u一、基础知识一、基础知识 键盘是单片机应用系统中人机交流不可缺少的输入设备。键盘是单片机应用系统中人机交流不可缺少的输入设备。u键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件。键键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件。键盘通常使用盘通常使用机械触点式按键开关机械触点式按键开关,其主要功能是把机械上的通断转换为,其主要功能是把机械上的通断转换为电气上的逻辑关系电气上的逻辑关系(1(1和和0)0)。u触点式按键开关,触点式按键开关,使用时轻轻点按开关按钮就可使开关接通,当松开手使用时轻轻点按开关按钮就可使开关接通,当松开手时开关既断开,恢复为原来的电平。时开关既断开,恢复为原来的电平。1.1.键盘分类键盘分类(1 1)独立式按键)独立式按键(2 2)矩阵按键)矩阵按键 二、单个按键二、单个按键1.结构结构如下图所示,其特点是每个按键单独占用一根如下图所示,其特点是每个按键单独占用一根I/O口线,口线,每个按键工作不会影响其他每个按键工作不会影响其他I/O口线的状态。口线的状态。(1)按键未按下,输入高电平)按键未按下,输入高电平 按键按下,输入低电平按键按下,输入低电平(2)上拉电阻保证了有确定的高电平,)上拉电阻保证了有确定的高电平,P0口。口。P1,P2,P3可不接上拉电阻)可不接上拉电阻) 外接上拉电阻外接上拉电阻10K左右左右(3)使用时:先把对应的输入)使用时:先把对应的输入I/O口置口置1 再对该口做读操作,若为再对该口做读操作,若为1,说明没按下;为,说明没按下;为0, 2.键的可靠输入键的可靠输入由于机械触点的弹性作用,在开关闭合及断开的瞬间由于机械触点的弹性作用,在开关闭合及断开的瞬间均有抖动过程,出现一系列电脉冲,然后其触点才稳均有抖动过程,出现一系列电脉冲,然后其触点才稳定下来。其抖动过程如右图所示,定下来。其抖动过程如右图所示,这种抖动会影响我们检测按键是否按下。这种抖动会影响我们检测按键是否按下。抖动时间的长短与开关的机械特性有关,抖动时间的长短与开关的机械特性有关,一般为一般为5 10ms。 u为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。在键数较少时,可采用从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖硬件去抖;而当;而当键数较多时,采用键数较多时,采用软件去抖软件去抖。u在硬件上可采用在键输出端加在硬件上可采用在键输出端加 R-SR-S触发器触发器( (双稳态触发器双稳态触发器) )或或 单稳态触发器构成单稳态触发器构成去抖动电路去抖动电路, 如下图所示是一种由如下图所示是一种由R-SR-S触发器触发器 构成的去抖动电路,当触发器翻转构成的去抖动电路,当触发器翻转 时,触点抖动不会对其产生任何影响。时,触点抖动不会对其产生任何影响。 键盘输出经双稳态电路之后变为规范的矩形方波。键盘输出经双稳态电路之后变为规范的矩形方波。u软件上采取的措施软件上采取的措施是在检测到有按键按下时,执行一个是在检测到有按键按下时,执行一个5ms5ms左右左右( (具体时具体时间应视所使用的按键进行调整间应视所使用的按键进行调整) )的延时程序,再确认该键电平是否仍保持的延时程序,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而消除抖理,在检测到该键释放后,也应采用相同的步骤进行确认,从而消除抖动的影响。动的影响。u3、应用、应用(1)独立按键)独立按键u需检测先按下,再抬起:需检测先按下,再抬起:u if(S1=0) /如果按键按下如果按键按下 u delay(5); /延时消抖延时消抖 u if(S1=0) /确定按键按下确定按键按下 u while(S1=0); i+;. /等待按键抬起再做相关操作等待按键抬起再做相关操作u u例:设计的发声电路。例:设计的发声电路。u不同频率的脉冲电信号送到扬声器上,会发出不同的声音即不同的音调不同频率的脉冲电信号送到扬声器上,会发出不同的声音即不同的音调“DO”, “RE”, “ME” DO”, “RE”, “ME” 等。音乐就是由不同的频率的脉冲信号组合来构等。音乐就是由不同的频率的脉冲信号组合来构成的,因此如果要播放一首歌曲,只需把一首歌曲的音调对应频率关系弄正成的,因此如果要播放一首歌曲,只需把一首歌曲的音调对应频率关系弄正确即可。确即可。u我们可以利用单片机的定时器产生各种不同频率的方波脉冲信号。我们可以利用单片机的定时器产生各种不同频率的方波脉冲信号。uDO:523HZ RE:587HZ ME:659HZDO:523HZ RE:587HZ ME:659HZu本次设计中单片机晶振为本次设计中单片机晶振为12MHZ12MHZ,那么定时器的计数周期为,那么定时器的计数周期为1MHZ1MHZ,假如选择,假如选择工作方式工作方式1 1,那,那T T值便为值便为T= 65536-510T= 65536-5105 5/ /相应的频率相应的频率 ,那么根据不同的频,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0T0相关的计相关的计数值如下表所示:数值如下表所示:u#include uunsigned long code yy=64580,64684,64777,64820,64898,64968,65030;usbit K1=P10;usbit K2=P11;usbit K3=P12;usbit K4=P13;usbit K5=P14;usbit K6=P15;usbit K7=P16;usbit BEEP=P30;uunsigned char i,j,m;uvoid main() uuBEEP=0;P1=0XFF;uEA=1;ET0=1; TMOD=0x01;TR0=0;uwhile(1)uif(K1=0) u while(K1=0);m=0;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K2=0) u while(K2=0); m=1;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K3=0) u while(K3=0); m=2;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K4=0) u while(K4=0); m=3;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u uif(K5=0) u while(K5=0); m=4;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K6=0) u while(K6=0); m=5;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K7=0) u while(K7=0); m=6;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u uuvoid lsd() interrupt 1uu TH0=i;TL0=j;u BEEP=BEEP;uu播放音乐实现方法播放音乐实现方法u一首歌的简谱,由很多音组成,每个音由音调和节拍组成,才能发一首歌的简谱,由很多音组成,每个音由音调和节拍组成,才能发出正确的音。出正确的音。(1 1)音频控制)音频控制向蜂鸣器输出一定频率的脉冲方波信号就能发出某个音调。向蜂鸣器输出一定频率的脉冲方波信号就能发出某个音调。利用单片机的定时器实现利用单片机的定时器实现例如:求出例如:求出“1”1”音的定时时间音的定时时间建立简谱中每个音调对应的频率数组建立简谱中每个音调对应的频率数组ff为了使用方便,利用宏定义,把每个音调的频率值定义一下。为了使用方便,利用宏定义,把每个音调的频率值定义一下。以下以好人一生平安为例。以下以好人一生平安为例。u#define l_dao 262u#define l_re 286u#define l_mi 311u#define l_fa 349u#define l_sao 392u#define l_la 440u#define l_xi 494u#define dao 523u#define re 587u#define mi 659u#define fa 698u#define sao 784u#define la 880u#define xi 987u#define h_dao 1046u#define h_re 1174u#define h_mi 1318u#define h_fa 1396u#define h_sao 1567u#define h_la 1760u#define h_xi 1975uunsigned int code f=ure,mi,re,dao,l_la,dao,l_la,u l_sao,l_mi,l_sao,l_la,dao,u l_la,dao,sao,la,mi,sao,u re,u mi,re,mi,sao,mi,u l_sao,l_mi,l_sao,l_la,dao, l_la,l_la,dao,l_la,l_sao,l_re,l_mi,u l_sao,u re,re,sao,la,sao,u fa,mi,sao,mi,u la,sao,mi,re,mi,l_la,dao,u re,u mi,re,mi,sao,mi,u l_sao,l_mi,l_sao,l_la,dao,u l_la,dao,re,l_la,dao,re,mi,u re,u l_la,dao,re,l_la,dao,re,mi,u re,u 0xff;(2 2)节拍控制)节拍控制本例简谱的节拍为每分钟本例简谱的节拍为每分钟7272拍,则每拍所需时间:拍,则每拍所需时间:1/72=833ms1/72=833ms根据乐谱知识,以第一行的第一小节为例,各个音调的节根据乐谱知识,以第一行的第一小节为例,各个音调的节拍为:拍为:2 2:1 1拍,需延时拍,需延时833ms833ms3232:2 2个个1/41/4拍,需分别延时拍,需分别延时208ms208ms1 1: 1 1拍,需延时拍,需延时833ms833ms6 6: 1/41/4拍,需延时拍,需延时208ms208ms。根据以上分析,可以取根据以上分析,可以取1/41/4拍(拍(208ms)208ms)为为1 1个延时单位。若个延时单位。若某个音调为某个音调为1/21/2拍,则延时拍,则延时2 2个单位,以此类推。个单位,以此类推。利用软件延时程序实现。利用软件延时程序实现。建立简谱中每个音调对应的节拍数组建立简谱中每个音调对应的节拍数组jpjpu unsigned char code jp=4,1,1,4,1,1,2,u 2,2,2,2,8,u 4,2,3,1,2,2,u 10,u 4,2,2,4,4,u 2,2,2,2,4,u 2,2,2,2,2,2,2,u 10,u 4,4,4,2,2,u 4,2,4,4,u 4,2,2,2,2,2,2,u 10,u 4,2,2,4,4,u 2,2,2,2,6,u 4,2,2,4,1,1,4,u 10,u 4,2,2,4,1,1,4,u 10;u(3)音调和节拍的联合控制)音调和节拍的联合控制u依次从依次从f数组中读出音调的频率,根据频率计数组中读出音调的频率,根据频率计算出定时时间初值,启动定时,发出该频率的音算出定时时间初值,启动定时,发出该频率的音调;该音调的发声时间可由节拍控制,从调;该音调的发声时间可由节拍控制,从jp数数组中取出该音调的节拍数,通过调用延时程序控组中取出该音调的节拍数,通过调用延时程序控制。制。u3、应用、应用u(2)一键多功能)一键多功能u例:一上电,全灭;按下按键例:一上电,全灭;按下按键K1,D1闪烁;再次按下按键闪烁;再次按下按键K1 ,D2闪烁;闪烁;再次按下按键再次按下按键K1 ,D3闪烁;再按下按键闪烁;再按下按键K1 ,D4闪烁。再次按下闪烁。再次按下K1,灯,灯全灭,如此循环。全灭,如此循环。uK1键对应五个功能,我们定义功能号键对应五个功能,我们定义功能号ID为为0,1,2,3,4uID=0,灯全灭;,灯全灭; ID=1,D1闪烁;闪烁;ID=2,D2闪烁;闪烁;ID=3,D3闪烁;闪烁;ID=4,D4闪烁;闪烁;u#include /包含包含AT89X52.H头文件头文件usbit k1=P30;usbit d0=P10;usbit d1=P11;usbit d2=P12;usbit d3=P13;uvoid delay(unsigned int a)uunsigned char i;uwhile(-a!= 0)u for(i=0;i125;i+); uuuvoid main ()uunsigned char id=0; uwhile(1)u P1=0xff;delay(200);u if(k1=0)u delay(10);u if(k1=0)u while(k1=0); id+; if(id=5) id=0; u switch(id)u case 0:P1=0xff;break; u case 1:d0=d0;delay(200);break; u case 2:d1=d1;delay(200);break; u case 3:d2=d2;delay(200);break;u case 4:d3=d3;delay(200);break; u u(3)独立式键盘)独立式键盘可以用可以用case语句,也可以用语句,也可以用if语句。语句。u if(k1=0) delay(5) ; if(k1=0) while(k1=0); i+;.u if(k2=0) delay(5) ; if(k2=0) while(k2=0); i-;. u省略了延时消抖,最好加上。省略了延时消抖,最好加上。 电子琴:电子琴:7个按键,分别发个按键,分别发DOU、RE、MI、FA、SOL、。、。u电子琴电子琴u#include uunsigned long code yy=64580,64684,64777,64820,64898,64968,65030;usbit K1=P10;usbit K2=P11;usbit K3=P12;usbit K4=P13;usbit K5=P14;usbit K6=P15;usbit K7=P16;usbit BEEP=P30;uunsigned char i,j,m;uvoid main() uBEEP=0;uP1=0XFF;uEA=1;ET0=1;TR0=0;TMOD=0x01;uwhile(1)uuif(K1=0) while(K1=0); m=0;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K2=0) while(K2=0); m=1;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K3=0) while(K3=0); m=2;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K4=0) while(K4=0); m=3;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K5=0) while(K5=0); m=4;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K6=0) while(K6=0); m=5;TH0=i=yym/256;TL0=j=yym%256;TR0=1;u if(K7=0) while(K7=0); m=6;TH0=i=yym/256;TL0=j=yym%256;TR0=1;uuvoid lsd() interrupt 1uu TH0=i;TL0=j;u BEEP=BEEP;uu实验:在上次试验倒计时的基础上,增加三个按实验:在上次试验倒计时的基础上,增加三个按键(键(K1:初值加:初值加1。K2:初值减:初值减1。 K3:开始。:开始。 )u三、键盘三、键盘u键盘由一组规则排列的按键组成,一个按键实际上是一个开关元键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件。件。1.1.键盘分类键盘分类u 编码键盘:电脑键盘,内部含编码芯片,每按一个键,由编码芯编码键盘:电脑键盘,内部含编码芯片,每按一个键,由编码芯片产生键值,如片产生键值,如ASCIIASCII码键盘、码键盘、BCDBCD码键盘码键盘u 非编码键盘:靠软件编程来识别健值的键盘。非编码键盘:靠软件编程来识别健值的键盘。 在单片机的各种系统中,最常用的是非编码键盘。非编码键盘又在单片机的各种系统中,最常用的是非编码键盘。非编码键盘又分为独立式按键和矩阵式键盘(如电话,取款机键盘)。分为独立式按键和矩阵式键盘(如电话,取款机键盘)。 2. 2. 矩阵式键盘矩阵式键盘(1 1)结构)结构u 单片机系统中,若使用按键较多时,通常采用矩阵式键盘,其结构如单片机系统中,若使用按键较多时,通常采用矩阵式键盘,其结构如下图所示,可以节省下图所示,可以节省I/OI/O口。口。u采采用用行行列列式式结结构构并并按按矩矩阵阵形形式式排排列列, ,如如图图所所示示。在在行行列列的的交交点点上上都都对对应应有有一一个个单单触触点点按按键键。一一个个4444的的行行、列列结结构构,可可以以构构成成一一个个含含有有1616个个按按键的键盘,键的键盘,u无无键键按按下下时时,各各行行、列列线线彼彼此此相相交交但但不不相相连连;当当按按键键被被按按下下时时则则其其交交点点的行线和列线接通。的行线和列线接通。(2 2)按键原理)按键原理u控制方式:控制方式:ua.a.先判断是否有键按下:行线都输出低电平,然后读列线的值。若列线先判断是否有键按下:行线都输出低电平,然后读列线的值。若列线都为高电平,说明无键按下;否则,有键按下。都为高电平,说明无键按下;否则,有键按下。ub.b.如有,延时消抖,再判断,确定有键按下。如有,延时消抖,再判断,确定有键按下。uc. c. 再判断哪一键按下,并得到键号。再判断哪一键按下,并得到键号。ud.d.等待按键释放,根据键号转向不同的功能程序。等待按键释放,根据键号转向不同的功能程序。(3 3)判断哪个键按下的方法()判断哪个键按下的方法(c c步骤):步骤): 扫描法扫描法(一)扫描法(行扫描)(一)扫描法(行扫描)(1) (1) 判别键盘上有无键闭合判别键盘上有无键闭合 其方法为:让其方法为:让P3.0P3.0P3.3P3.3(行线)全输出(行线)全输出0 0, P3.4P3.4P3.7P3.7(列线)作输入口(列线)作输入口 然后读然后读P3P3口(列线值)。口(列线值)。 若高若高4 4位位P3.4P3.4P3.7P3.7(列线)全为(列线)全为1 1,则键盘上没有闭合键,则键盘上没有闭合键, 若若P3.4P3.4P3.7P3.7不全为不全为1 1,则有键处于闭合状态。,则有键处于闭合状态。(2) (2) 去除键的机械抖动去除键的机械抖动 其方法为:当判别到键盘上有键闭合后,延时一段时间再判别键盘的状态,其方法为:当判别到键盘上有键闭合后,延时一段时间再判别键盘的状态,若仍有键闭合,则认为键盘上有一个键处于稳定的闭合状态,否则认为键抖若仍有键闭合,则认为键盘上有一个键处于稳定的闭合状态,否则认为键抖动。动。 (3) (3) 判别闭合键的键号(逐行扫描)判别闭合键的键号(逐行扫描) 其方法为:对键盘的行线进行扫描其方法为:对键盘的行线进行扫描, ,逐行进行扫描逐行进行扫描(一)扫描法(行扫描)(一)扫描法(行扫描)(1) (1) 判别键盘上有无键闭合判别键盘上有无键闭合(2) (2) 去除键的机械抖动去除键的机械抖动(3) (3) 判别闭合键的键号(逐行扫描)判别闭合键的键号(逐行扫描) 建立一个键值数组:建立一个键值数组:把把1616个按键按下时读出的个按键按下时读出的P3P3值按顺序写成一个数组。值按顺序写成一个数组。jp=0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77; 扫描值扫描值 读过来读过来P3P3口的值口的值 P3.3P3.3P3.0 P3.7P3.0 P3.7P3.0P3.0第一行第一行 0111 00111 0:ee 1: 1:de 2: 2:be 3: 3: 7e第二行第二行 1011 41011 4:ed 5:dd 6:bd 7:7d第三行第三行 1101 81101 8:eb 9:db A:bb B:7b第四行第四行 1110 C: 1110 C: e7 D:D7 E:b7 F:77逐行扫描逐行扫描:对键盘的每一行进行扫描,判断此行是否有键按下。:对键盘的每一行进行扫描,判断此行是否有键按下。对每一行扫描时,读对每一行扫描时,读P3P3口的值,把该值口的值,把该值和数组中的值进行逐个比较,和数组中的值进行逐个比较,找到相等时数组的序号即为键号。找到相等时数组的序号即为键号。u扫描法的每个按键的扫描法的每个按键的扫扫描值(编码)描值(编码)会随着按会随着按键连接的不同而不同键连接的不同而不同 图图1 图图2 eehdehbeh7ehedhddhbdh7dhebhdbhbbh7bhe7hd7hb7h77h(一)扫描法(行扫描)(一)扫描法(行扫描)(1) (1) 判别键盘上有无键闭合判别键盘上有无键闭合(2) (2) 去除键的机械抖动去除键的机械抖动(3) (3) 判别闭合键的键号(逐行扫描)判别闭合键的键号(逐行扫描)(4) (4) 使使CPUCPU对键的一次闭合仅作一次处理对键的一次闭合仅作一次处理 采用的方法是等待闭合键释放以后再作处理采用的方法是等待闭合键释放以后再作处理eehdehbeh7ehedhddhbdh7dhebhdbhbbh7bhe7hd7hb7h77hu例:用例:用1 1位数码管显示按键的键号。位数码管显示按键的键号。u电路电路u程序程序u#include u#include uunsigned char code sz1=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e; /数码管段值数组数码管段值数组uunsigned char code jp=0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77; /矩阵键盘的键值数组矩阵键盘的键值数组uunsigned char c=0;/定义定义c变量,用来存放键号变量,用来存放键号uuvoid delay(unsigned int t)uuunsigned char i;uwhile(t-)uufor(i=0;i125;i+); uuuvoid sm() /键盘扫描子程序键盘扫描子程序u unsigned char j,n,a,m=0xfe;u P2=0xf0; /P2.0P2.0P2.3P2.3(行线)全输出(行线)全输出0 0, P2.4P2.4P2.7P2.7(列线)(列线)作输入口作输入口u k=P2; /读读P2P2口口u k=k&0xf0; / 只要得到高只要得到高4位位(列线值)。(列线值)。 u if(k!=0xf0) / 如果列值全为如果列值全为1(1111即即F),有键按下,有键按下u delay(5); /延时消抖延时消抖u if(k!=0xf0) /再判断是否按下再判断是否按下u for(j=0;j4;j+) /4行扫描行扫描u P2=m; /扫描值给扫描值给P2u n=P2; /读读P2值(含有列值)给值(含有列值)给nu for(a=0;a16;a+) /与数组中的值逐个进行比较与数组中的值逐个进行比较u if(jpa=n) u c=a; while(P2=jpa); /如果找到相等的,则序号即为键号如果找到相等的,则序号即为键号,等待等待按键释放按键释放u m=_crol_(m,1); /左移一位得到下一行的扫描值左移一位得到下一行的扫描值u u u uvoid main() uwhile(1) u sm(); /扫描子程序扫描子程序u P1=sz1c; /显示键号显示键号u u 编程说明:编程说明:在单片机应用系统中,键盘扫描只是系统的部分程序。进行软件系统编程时,在单片机应用系统中,键盘扫描只是系统的部分程序。进行软件系统编程时,一般作为子程序调用或中断服务程序使用。一般作为子程序调用或中断服务程序使用。sm()sm()该子程序入口参数为无,出该子程序入口参数为无,出口参数为键号,存于口参数为键号,存于C C。因此,其调用十分简单。因此,其调用十分简单. .sm()扫描子程序可定义为带返回值的,返回键号扫描子程序可定义为带返回值的,返回键号C ,return(c);矩阵式键盘尽管比独立式键盘复杂。但有了上述子程序后,只要学会调用,矩阵式键盘尽管比独立式键盘复杂。但有了上述子程序后,只要学会调用,你甚至不需要知道键盘扫描程序是如何编写的,你甚至不需要知道键盘扫描程序是如何编写的,COPYCOPY即可,编程也就变得十即可,编程也就变得十分简单了。从这可以看出平时注意查阅资料,收集实用子程序,掌握子程序分简单了。从这可以看出平时注意查阅资料,收集实用子程序,掌握子程序的调用,对提高编程效率是多么重要。的调用,对提高编程效率是多么重要。另一种键盘扫描程序:另一种键盘扫描程序: u程序二、程序二、uuint keyscan()/键盘扫描函数键盘扫描函数uu P3=0xfe; /扫描第一行扫描第一行u temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u u delay(5);/键盘去抖键盘去抖,最好最好20ms以上以上,这里用了这里用了5msu temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u utemp=P3;uswitch(temp)u u case 0xee: num=0;.break;u case 0xde: num=1;.break;u case 0xbe: num=2;.break;u case 0x7e: .break;u u while(temp!=0xf0) /按键抬起检测按键抬起检测u u temp=P3;u temp=temp&0xf0;u uu u uP3=0xfd; /扫描第二行扫描第二行u temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u u delay(5);u temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u u temp=P3;u switch(temp)u u case 0xed: num=3;.break;u case 0xdd: num=4;.break;u case 0xbd: num=5;.break;u case 0x7d: .break;u u while(temp!=0xf0) /按键抬起检测按键抬起检测u u temp=P3;u temp=temp&0xf0;u u u u uP3=0xfb; /扫描第三行扫描第三行u temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u u delay(5);u temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u u temp=P3;u switch(temp)u u case 0xeb: num=6;.break;u case 0xdb: num=8;.break;u case 0xbb: num=9;.break;u case 0x7b: .break;u u while(temp!=0xf0) /按键抬起检测按键抬起检测u u temp=P3;u temp=temp&0xf0;u uu u uP3=0xf7; /扫描第四行扫描第四行u temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u u delay(5);u temp=P3;u temp=temp&0xf0;u if(temp!=0xf0)u u temp=P3;u switch(temp)u u case 0xe7: num=7;.break;u case 0xd7: num=8;.break;u case 0xb7: num=9;.break;u case 0x77: .break;u u while(temp!=0xf0) /按键抬起检测按键抬起检测u u temp=P3;u temp=temp&0xf0;u uu u return(num);uu实验实验1.倒计时,三个按键(倒计时,三个按键(K1:初值加:初值加1。K2:初值:初值减减1。 K3:开始。:开始。 )2.44的键盘,用数码管显示键值的键盘,用数码管显示键值
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号