《Ai8051U教学视频》第六集 I/O输入输出
1什么是GPIOGPIO(General Purpose I/O Ports)意思为通用输入/输出端口,就是一些引脚,可以通过她们输出高低电平或者通过它们读取引脚的状态-是高电平或低电平
2按键输入检测
按键消抖(机械按键按下或松开有抖动,一般在20ms内)
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //d调用头文件
#define u8unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
u8 state = 0; //初始状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHzDelay20ms();
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
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;
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
// //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// P00 = 0;
// }
// else
// {
// P00 = 1;
// }
//
// //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
// if( P32 == 1 ) //判断P32按钮是否按下
// {
// P00 = 0;
// }
// else
// {
// P00 = 1;
// }
//任务3:按一下灯亮,按一下灯灭
if( P32 == 0 ) //判断P32按钮是否按下
{
Delay20ms(); //延时20ms消抖
if( P32 == 0 )
{
state = !state; //变量取反 0 1 0 1 0 1
P00 = state;
printf("state:%d\r\n",(int)state);
while( P32 == 0 ); //等待P32松开
}
}
}
}
《Ai8051U教学视频》第六集 I/O输入输出 —— 专业解读GPIO与按键检测实现
一、GPIO基本概念解析
GPIO(General Purpose Input/Output)作为嵌入式系统中最基础的外设模块,其本质是可编程配置的数字信号引脚。在AI8051U微控制器中,GPIO模块遵循标准8051架构的I/O端口设计规范,同时进行了功能扩展。每个GPIO端口由Pn寄存器(n=0,1,2,3)进行控制,支持位寻址操作,具备以下核心特性:
1. 多模式配置:支持准双向口、推挽输出、高阻输入三种电气特性配置
2. 电平控制:通过Px寄存器设置输出电平状态(0/1)
3. 状态读取:通过Px寄存器读取引脚实时电平状态
4. 中断支持:部分端口支持外部中断触发功能
二、硬件消抖原理与实现
针对机械按键特有的接触抖动现象(典型时间范围5-20ms),本示例采用软件延时消抖方案。该方案基于以下技术考量:
1. 抖动时间窗分析:实测表明,绝大多数机械按键的稳定时间
[本文内容由国芯人工智能辅助生成,仅供参考]
Ai8051U教学视频》第七集 定时器
1定时器的介绍(1)用于计时系统,可以实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay,提高程序的运行效率和处理速度
2定时器的应用
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //d调用头文件
#define u8unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
u8 state = 0; //初始状态
u8 Run_State = 0; //运行状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHzDelay20ms();
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void Timer0_Init(void); //3秒@24.000MHz //函数声明
void main(void)
{
int count=1; //按键计数变量
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;
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
// Timer0_Init(); //定时器初始化
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
// //任务1:
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// Delay20ms(); //延时20ms消抖
// if( P32 == 0 )
// {
// printf("按键按下次数\xfd:%d 次\r\n",(int)count);
// count++;
//
// while( P32 == 0 ); //等待P32松开
//
// }
// }
// //任务2:灯按一下点亮三秒后熄灭。
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// Delay20ms(); //延时20ms消抖
// if( P32 == 0 )
// {
//// printf("按键按下次数\xfd:%d 次\r\n",(int)count);
//// count++;
// P00 = 0;
// Timer0_Init();
// while( P32 == 0 ); //等待P32松开
//
// }
// }
//
//任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2 表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
if( P32 == 0 ) //判断P32按钮是否按下
{
Delay20ms(); //延时20ms消抖
if( P32 == 0 )
{
Run_State = !Run_State; //运行状态取反
if( Run_State==1 ) //运行
{
Timer0_Init();
}
else
{
TR0 = 0; //关闭定时器
P00 = 1;
P01 = 1;
}
// P00 = 0;
// Timer0_Init();
while( P32 == 0 ); //等待P32松开
}
}
}
}
//void Timer0_Init(void) //3秒@24.000MHz 函数定义
//{
// TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
// TL0 = 0x3F; //设置定时初始值
// TH0 = 0x01; //设置定时初始值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0 = 1; //使能定时器0中断
//
// //TM0PS = 91
// //12T /12
// // THO-TL0 = 319
//
//}
void Timer0_Init(void) //500毫秒@24.000MHz
{
TM0PS = 0x0F; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xDC; //设置定时初始值
TH0 = 0x0B; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
state = !state;
P00 = state;
P01 = !state;
}
定时器频率
定时时间
重装值(TH0,TL0)
3函数的定义,声明,调用
定义:
返回值类型 函数名 (入口参数)
{
//函数体
//函数执行的代码
return 返回值;
}
声明:
返回值类型 函数名(入口参数)
调用:
函数名(入口参数)
AI8051U教学视频第七集:定时器详解
在AI8051U单片机的开发过程中,定时器是一个非常关键的模块。它不仅可以实现精准的计时功能,还能替代传统的软件延时函数,从而显著提升程序的运行效率和响应速度。本文将围绕定时器的基本概念、应用场景以及在实际项目中的使用方法进行详细解析。
一、定时器的功能与作用
定时器在单片机系统中扮演着“时间管理者”的角色,其主要功能如下:
1. 实现精确计时
定时器能够以非常高的精度进行时间测量,适用于需要定时执行任务的场合,例如定时采集传感器数据、定时刷新显示屏等。
2. 替代长时间Delay函数
传统的软件延时函数(如 Delay20ms())会占用CPU资源,使程序在等待期间无法执行其他任务。而使用定时器可以实现非阻塞式延时,在定时器计时的同时,CPU可以处理其他任务,从而提高系统效率。
3. 周期性任务调度
定时器可以通过中断机制,实现周期性任务的自动触发,如每100ms更新一次状态、每秒执行一次系统自检等。
二、定时器的工作原理
AI8051U系列单片机通常配备多个定时器模块(如Timer0、Timer1等),其基本工作原理如下:
1. 时钟源输入
定时器通过系统时钟或外部时钟源进行计数。AI8051U的主频为24MHz,定时器可以基于该时钟进行分频计数。
2. 计数器寄存器
每个定时器都有对应的计数寄存器(如TH0、TL0),用于存储当前计数值。
3. 中断触发机制
当计数器达到设定值(即溢出)时,可以触发中断服务程序(ISR),执行用户定义的操作。
4. 模式选择
定时器支持多种工作模式,如16位自动重载模式、8位自动重载模式、13位计数模式等,开发者可根据实际需求选择合适的模式。
三、定时器的初始化与配置
以Timer0为例,下面是一个典型的定时器初始化函数:
c
void Timer0Init(void)
{
TMOD = 0x02; // 设置为8位自动重载模式
TH0 = 0x06; // 设置初值,对应3秒延时(基于24MHz主频)
TL0 = 0x06;
ET0 = 1; // 使能Timer0中断
EA = 1; // 使能全局中断
TR0 = 1; // 启动Timer0
}
在该配置中,定时器工作于8位自动重载模式,TH0和TL0的初值决定了定时器的溢出周期。通过设置中断使能位ET0和EA,允许定时器中断被响应。最后通过TR0启动定时器。
四、定时器中断服务程序
当定时器溢出时,会触发相应的中断服务程序。在AI8051U中,Timer0的中断服务函数如下:
c
void Timer0ISR(void) interrupt 1
{
static u16 timercount = 0;
timercount++;
if(timercount >= 1000)// 假设每1ms中断一次,累计1000次即为1秒
{
timercount = 0;
// 执行每秒一次的操作,如LED闪烁、状态更新等
}
}
在该中断函数中,我们通过累加计数器 timercount 来实现更长时间的定时控制。例如,每1ms触发一次中断,则累加1000次即可实现1秒的时间间隔。
五、定时器的实际应用场景
1. LED闪烁控制
利用定时器实现LED的周期性闪烁,避免使用延时函数导致的CPU阻塞。
2. 按键去抖
定时器可用于按键去抖处理,通过定时采样按键状态,提高按键识别的准确性。
3. PWM波形生成
定时器可以配合比较寄存器生成PWM信号,用于控制电机转速、LED亮度等。
4. 系统时钟维护
定时器可作为系统时钟的基础模块,实现毫秒、秒、分钟等时间单位的维护。
5. 任务调度
在多任务系统中,定时器可用于任务的周期性调度,实现轻量级操作系统的调度功能。
六、与软件延时的对比分析
| 特性 | 软件延时(Delay) | 定时器 |
|------|------------------|--------|
| 实现方式 | 通过空循环实现 | 硬件计数器+中断 |
| CPU占用 | 高(期间无法执行其他任务) | 低(可并行处理其他任务) |
| 精度 | 依赖循环次数,精度较低 | 硬件级精度,可调 |
| 可扩展性 | 差,难以实现多任务 | 好,支持多任务调度 |
| 中断响应 | 不支持 | 支持 |
从上表可以看出,定时器在性能、精度和系统响应能力上全面优于传统的软件延时方式。
七、总结
在AI8051U单片机的开发中,定时器是实现时间控制、任务调度和系统优化的重要工具。通过合理配置定时器,可以有效提升程序的运行效率和稳定性,避免因软件延时导致的资源浪费和响应延迟。
在实际开发过程中,建议根据项目需求选择合适的工作模式,并结合中断机制实现高效的时间管理。同时,注意定时器初值的计算,确保定时精度符合预期。
通过本集视频的学习,开发者应掌握定时器的基本配置方法、中断处理机制以及在实际项目中的应用技巧,为后续更复杂的嵌入式系统开发打下坚实基础。
[本文内容由国芯人工智能辅助生成,仅供参考] 推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
本坛转发时,要去掉中括号后的第一个“-”,就可以将视频帖到其他帖子中
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
上面是 小李 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4
上面是 小赵 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
在同一个帖子中 打卡,否则我们论坛会乱了 AI8051U教学视频第八集:定时器周期性调度任务
1周期性任务介绍
2文件的创建(*.h,*.c)
3结构体的介绍
4结构体数组的周期性任务调度 AI8051U教学视频第九集:数码管
1数码管介绍
2数码管显示原理
3数码管静态显示
4数码管动态显示
5虚拟显示--LED和数码管
AI8051U教学视频第十集:虚拟LED和数码管
1虚拟显示-LED
硬件准备
软件准备(最新的ISP软件)
参数设置(仿真调试接口-接口设置)
选择指定的接口和协议匹配
2虚拟显示-数码管
3虚拟键盘
页:
1
[2]