关于51单片机很小,键盘扫描问题

来源:百度知道 编辑:UC知道 时间:2024/05/09 07:02:42
大家好!,我在设计一个方波信号发生器 能实现键盘从0到400HZ的步进 增加和减小调节, 我遇到一个问题不知道你们设计的时候遇到过没有 ,在频率输出低的时候大概1-15HZ左右由于低频率的时候要延时很长的时间才能输出低频率的方波,这样CPU执行的时间大多都在延时程序里了?然而却不能扫描到键盘程序的动作来增加或减小频率这应该怎么解决。!在高频率的时候由于延时程序比较短CPU执行的时间就会很好的扫描到键盘程序,可是这样却导致按一次键盘频率增加很快50HZ左右!如何解决增加频率和减小频率时间上不能同步的问题?
我也想过用定时器来做!可51只有16位定时器只能定65MS的样子最低只能做到15HZ的方波输出 但也存在一个问题比如65MS 定时。也是需要软件查询 这样CPU又浪费资源!

解决这个问题,你的程序用延时来产生方波,这样就势必造成大量的CPU资源被浪费到延时程序上。建议改用定时器来产生方波。
这样,你的CPU可以全时地处理键盘扫描问题了,做一个软件消抖,就可以解决好这个问题。

最简单的办法,当你的计时器位数不够的时候,设一个全局变量。比如要实现1HZ,那么就用这个全局变量对计时器的溢出次数进行计数,溢出15次跳变一次,这样就可以实现了。

使用定时中断来做,将时间拆分成多段就行了
使用三个参数来做 对于定时器可以直接达到的那些定时时间(小于65ms)时,那第三个参数 直接设为1 ,前两个参数就是定时时间常数,时间超过65ms,就拆分为多个部分及第三个参数要大于1。在定时中断处理中,第三个参数应自减,当减为0时,就翻转输出。
还有你在键盘扫描的时候,注意要延时防抖动的设计。还有你在处理按键,对于同一次按键,可以处理成一次事件。不要重复扫描

还有就是使用两个定时器串联起来,或者采用外部定时器电路实现

还有键盘扫描时候可以处理成中断的模式,这样就可以使用软件延时了

按键要等到 松开后再执行频率增加的操作,这样就不会按一次 增加很快的现象了

可以用状态机做。
关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。
包含一组状态集(states)、一个起始状态(start state)、一组输入符号集(alphabet)、一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型。当输入符号串,模型随即进入起始状态。它要改变到新的状态,依赖于转换函数。在有限状态机中,会有有许多变量,例如,状态 机有很多与动作(actions)转换(Mealy机)或状态(摩尔机)关联的动作,多重起始状态,基于没有输入符号的转换,或者指定符号和状态(非定有 限状态机)的多个转换,指派给接收状态(识别者)的一个或多个状