我测AI8051的IO翻转速度4-6us
我测这个单片机的IO翻转速度间隔在4-6us正常吗您提到的AI8051单片机IO翻转速度在4-6微秒(μs)之间,这一数值是否正常,需结合具体型号、工作频率及实际应用场景综合判断。
首先,AI8051是基于8051架构的增强型单片机,其核心指令周期通常与标准8051相似,即每条指令执行时间为12个时钟周期。若该单片机运行于12MHz主频,则每个时钟周期为83.3ns,一条指令执行时间为1μs。因此,在标准情况下,IO口的翻转速度理论上至少应达到1μs以上,以满足指令执行时间的要求。
然而,实际IO翻转速度受多种因素影响:
1. 指令执行效率:若程序中频繁调用延时函数或使用复杂逻辑控制IO,可能导致翻转速度变慢。
2. 外设配置:部分单片机支持快速IO模式,但需通过寄存器配置启用。若未正确配置,可能限制IO响应速度。
3. 引脚负载:若IO连接的外部电路负载较大(如大电容、高阻抗设备),可能延长信号上升/下降时间。
4. 电源稳定性:电压波动或电源噪声也可能影响IO输出的稳定性与速度。
对于AI8051系列而言,若其主频为12MHz,4-6μs的IO翻转速度属于合理范围,尤其在未进行特殊优化的情况下。若您希望提升IO响应速度,可考虑以下优化措施:
使用更高速度的主频(如24MHz或更高);
简化控制逻辑,减少不必要的指令调用;
启用快速IO模式(如有);
优化外围电路设计,降低负载影响。
综上所述,4-6μs的IO翻转速度在AI8051单片机中属于正常范围,具体表现还需结合实际应用环境和配置进行评估。如需进一步优化性能,建议查阅官方技术文档并进行针对性调试。
[本文内容由国芯人工智能辅助生成,仅供参考] 20MHz 也要看代码怎么写的 我记得手册上面好像更快
我用24MHz。
#include "AI8051U.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
void main(void)
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
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; //设置为准双向口
P1M0 = 0x80; P1M1 = 0x00;
// P1SR = 0x7f;
while(1)
{
P16 = ~P16;
P17 = ~P17;
// P17 = 0;
// P17 = 1;
}
}
#include "../h/system.h"
unsigned int run_count = 0;
// 主函数
void main(void)
{
WTST = 0;// 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; // 扩展寄存器(XFR)访问使能
CKCON = 0; // 提高访问XRAM速度
// CLK_Init();
// LCD_Init();
// LCD_Clear(BLACK);
// key_Set_GPIO();
// Initial_DS1302();
// Uart2_Init();
// DIsplay_Init();
P1M0 |= 0x0c; P1M1 &= ~0x0c;
while (1)
{
P12 = !P12;
// Dispaly();
// key();
// run_count++;
// if (run_count >= 600)
// {
// run_count = 0;
// }
// if ((unsigned char)(run_count % 10) == 0)
// {
// SendData_UART2(curr_time.minute);
// // second = Read1302(READ_second);
// // // curr_time.minute = Read1302(READ_minute);
// // // curr_time.hour = Read1302(READ_hour);
// // if (hour > 23)
// // hour = 0;
// // if (minute > 59)
// // minute = 0;
// }
}
}
#define HIRC 40000000UL
#define FOSC 40000000UL
#define SYSCLK FOSC
#define MAIN_Fosc FOSC
40M内部,这个翻转速度,怎么做到的 unalsmcb 发表于 2025-7-10 13:54
#include "../h/system.h"
unsigned int run_count = 0;
不要用P12 = !P12;,要用这个P12 = ~P12;。
1 #include "AI8051U.h"
2 #include "stdio.h"
3 #include "intrins.h"
4
5 typedef unsigned char u8;
6 typedef unsigned intu16;
7 typedef unsigned long u32;
8
9 #define MAIN_Fosc 24000000UL
10
11 void main(void)
12 {
13 1 WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
14 1 EAXFR = 1; //扩展寄存器(XFR)访问使能
15 1 CKCON = 0; //提高访问XRAM速度
16 1
17 1 P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
18 1 P1M1 = 0x00; P1M0 = 0xff; //设置为推挽输出
19 1 P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
20 1 P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
21 1 P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
22 1 P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
23 1 P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
24 1 P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
25 1
26 1 P1M0 = 0x80; P1M1 = 0x00;
27 1 // P1SR = 0x7f;
28 1
29 1
30 1 while(1)
31 1 {
32 2 P16 = ~P16;
33 2 P17 = ~P17;
34 2 P15 = !P15;
35 2 // P17 = 0;
36 2 // P17 = 1;
37 2 }
38 1 }
39
40
41
42
; FUNCTION main (BEGIN)
; SOURCE LINE # 11
000000 120000 RLCALL _m
000003 6D33 XRL WR6,WR6
000005 7E240000 RMOV WR4,#WORD0 ?SC_0000
000009 020000 ELJMP sprintf
; FUNCTION main (END)
; FUNCTION _m (BEGIN)
; SOURCE LINE # 11
; SOURCE LINE # 13
000000 75E900 MOV WTST,#00H
; SOURCE LINE # 14
000003 A9D7BA SETB EAXFR
; SOURCE LINE # 15
000006 75EA00 MOV CKCON,#00H
; SOURCE LINE # 17
000009 759300 MOV P0M1,#00H
00000C 7594FF MOV P0M0,#0FFH
; SOURCE LINE # 18
00000F 759100 MOV P1M1,#00H
000012 7592FF MOV P1M0,#0FFH
; SOURCE LINE # 19
000015 759500 MOV P2M1,#00H
000018 759600 MOV P2M0,#00H
; SOURCE LINE # 20
00001B 75B100 MOV P3M1,#00H
00001E 75B200 MOV P3M0,#00H
; SOURCE LINE # 21
000021 75B300 MOV P4M1,#00H
000024 75B400 MOV P4M0,#00H
; SOURCE LINE # 22
000027 75C900 MOV P5M1,#00H
00002A 75CA00 MOV P5M0,#00H
; SOURCE LINE # 23
00002D 75CB00 MOV P6M1,#00H
000030 75CC00 MOV P6M0,#00H
; SOURCE LINE # 24
000033 75E100 MOV P7M1,#00H
000036 75E200 MOV P7M0,#00H
; SOURCE LINE # 26
000039 759280 MOV P1M0,#080H
00003C 759100 MOV P1M1,#00H
; SOURCE LINE # 30
?C0003:
; SOURCE LINE # 32
00003F B296 CPL P16; 用这个P16 = ~P16; 只有汇编的一行代码。
; SOURCE LINE # 33
000041 B297 CPL P17
; SOURCE LINE # 34
000043 209503 JB P15,?C0005 ;用P15 = !P15; 会有好多行的汇编代码。
000046 D3 SETB C
000047 8001 SJMP ?C0006
?C0005:
000049 C3 CLR C
?C0006:
00004A 9295 MOV P15,C
; SOURCE LINE # 37
00004C 80F1 SJMP ?C0003
; FUNCTION _m (END)
用 时钟输出功能,测 I/O 输出速度
频率输出有两个限制,极限值由系统电压决定,通常情况下,5V最大36Mhz,3.3V最大25Mhz。具体可以参考技术手册“电气特性”部分。
其次就是系统频率,硬件最快可以输出系统时钟的一分频,也就是最大系统时钟频率。具体请参考技术手册“时钟管理”部分
端口输出速度最快7.6MHz系统频率40MHz
P4SR = 0x7f; P4DR = 0x7f;
// P1SR = 0x7f;
MCLKOCR = 0x01; //主时钟输出到 P4.7 口
//MCLKOCR = 0x02; //主时钟 2 分频输出到 P4.7 口
//MCLKOCR = 0x04; //主时钟 4 分频输出到 P4.7 口
//MCLKOCR = 0x84; //主时钟 4 分频输出到 P5.6 口
STC单片机 系统时钟对外分频输出高频时钟 系统频率36.864MHz
页:
[1]
2