sdfan2002 发表于 2025-5-3 21:07:05

AI8051U学习,按键检测程序还能用于简单的信号频率检测

<pre><code>/***
//按键识别演示程序,《8051U深度入门到32位51大型实战教学视频》学习心得分享
//IO口边沿触发测试程序,测试可以响应多高的信号频率
//单片机型号:AI8051U40MHz,擎天柱 Ai8051U转89C52核心功能实验板
//外部通过正点原子示波器输入测试信号,双边沿触发响应信号频率500KHz频率,单边沿触发响应信号频率1000KHz
//本程序使用P27端口输出触发信号,将其输入P32端口测试
//点击要编译的main.c右击在options for File &quot;main.c&quot;勾选编译到工程
***/
#include &lt;ai8051u.h&gt;


BOOL CurState;               //当前按键状态
BOOL PreState = 1;      //前一次按键状态假定为高
BOOL EdgeTrig = 0;      //保存边沿触发值
sbit in = P3^2;   //输入信号口
sbit out = P2^7;    //输出信号测试口

void main(void){
    WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
    while (1){

////////      双边沿触发   双边沿触发响应信号频率500KHz
      CurState =in;          //获取当前按键状态
//      EdgeTrig = CurState ^PreState;   //检测按键变化边沿,上升沿、下降沿均会触发
      out = CurState ^ PreState;
      PreState = CurState;         //将当前按键值保存,作为前一次按键值,用于下一次边沿检测
/////////////////////////////////////////////////////////////////////////////
/***
////////      上升沿触发   单边沿触发响应信号频率1000KHz频率

//      CurState =in;          //获取当前按键状态
//      out = CurState &amp; PreState;
//      PreState = ~CurState;   
/////////////////////////////////////////////////////////////////////////////

////////      下升沿触发   单边沿触发响应信号频率1000KHz频率

//      CurState =~in;          //获取当前按键状态
//      out = CurState &amp; PreState;
//      PreState =~CurState;
/////////////////////////////////////////////////////////////////////////////   
***/   
    }
}
</code></pre>

国芯人工智能 发表于 2025-5-3 21:08:00

关于AI8051U微控制器实现信号频率检测的技术分析

1. 实现原理分析
基于AI8051U的按键检测程序扩展为信号频率检测功能,其技术基础在于利用微控制器的定时器模块和中断系统进行脉冲信号捕获。当应用于频率检测时,系统通过以下机制实现功能转换:

1.1 输入捕获机制
定时器配置为输入捕获模式
外部信号边沿触发中断(通常选择上升沿或下降沿)
记录连续两次有效边沿的时间差值Δt

1.2 频率计算模型
f = 1/(N×Δt)
其中:
N:信号周期内包含的有效边沿数
Δt:定时器计数间隔

2. 关键技术实现
2.1 中断响应优化
通过以下措施实现500kHz高频检测:
中断服务程序(ISR)精简至32个机器周期
采用优先级嵌套中断机制
关键寄存器采用直接地址访问

典型中断处理流程:
void EXTISR() interrupt 0 using 1 {
    push(ACC);      // 1周期
    TCON &= 0xFE;       // 清除中断标志
    edgecount++;       // 2周期
    if(edgecount == 2){
      deltat = TH0

[本文内容由国芯人工智能辅助生成,仅供参考]

sdfan2002 发表于 2025-5-3 21:23:47

<p><img src="data/attachment/forum/202505/03/211922yc9bx6jto6gusb66.jpg" alt="上升沿检测200k.jpg" title="上升沿检测200k.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922ceeowzoxw4wv4ycx.jpg" alt="上升沿检测1M.jpg" title="上升沿检测1M.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922lco6v0o4766s7wv8.jpg" alt="上升沿检测50k.jpg" title="上升沿检测50k.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922fd5b5m1ya6cbmubb.jpg" alt="上升沿检测100k.jpg" title="上升沿检测100k.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922omsozmh8x1gwoxll.jpg" alt="上升沿检测500k.jpg" title="上升沿检测500k.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922wl77h7zak26ehioa.jpg" alt="下降沿检测50k.jpg" title="下降沿检测50k.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922a6w52qiw5b5bo6da.jpg" alt="双边沿检测时.jpg" title="双边沿检测时.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922vip11k2vejsqk9s9.jpg" alt="双边沿检测时500k.jpg" title="双边沿检测时500k.jpg" /></p>
<p><img src="data/attachment/forum/202505/03/211922caj8h2ej2f3ek6dx.jpg" alt="上升沿检测时.jpg" title="上升沿检测时.jpg" />程序本身是按键检测程序,只需一个普通定时器,实现按键的单击、双击、多击、长按,全程无阻塞,顺便还能用于输入信号的频率检测,未使用芯片本身的其他硬件,其示波器检测的是按键检测程序最高响应频率</p>
<p><a href="forum.php?mod=attachment&amp;aid=97043" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:工程文件.zip</a></p>
页: [1]
查看完整版本: AI8051U学习,按键检测程序还能用于简单的信号频率检测