小涵子爸爸
发表于 2024-9-25 14:16:28
{:4_197:}
惦饭宝
发表于 2024-9-25 20:45:07
本帖最后由 惦饭宝 于 2024-9-27 19:28 编辑
惦饭宝 发表于 2024-9-22 19:51
第十五集:外部中断👌😄
一.中断和中断系统
最近做比赛去了,实在没啥精力去学了,大概停更一周左右,我会回来的😭
惦饭宝
发表于 2024-9-27 20:04:59
本帖最后由 惦饭宝 于 2024-10-4 08:57 编辑
惦饭宝 发表于 2024-9-25 20:45
最近做比赛去了,实在没啥精力去学了,大概停更一周左右,我会回来的😭 ...
第十六集:I/O中断🕵️♀️
一.什么是I0中断?
在STC32G中,普通 I/0 口均可中断,不是传统外部中断
STC32G 系列支持所有的 I/0 中断,且支持4种中断模式:下降沿中断、上升沿中断、低电平中断、高电平中断。每组 I/0 口都有独立的中断入口地址,且每个 I0 可独立设置中断模式。
中断是指,在程序运行过程中,系统出现一个必须由CPU立即处理的情况,此时CPU暂时中止程序的执行转而处理这个新情况的过程叫做中断。
而I/O中断通过中断处理器执行中断操作。当外部设备的I/O模块准备好时,它会发送给CPU一个中断信号,CPU则会“立即”做出响应,暂停当前程序的处理去服务该I/O设备的程序。
二.10中断的用法
要做哪个端口的中断就查上面的表格来设置对应位的数值,同时还要对端口中断使能寄存器开启对应的使能。
.......
三.中断优先级的设置
中断初始化:
void P3Exit_Init(void) {
P3IM0 = 0X00;
P3IM1 = 0XFF; //低电平中断
P3INTE = 0X20; //p35中断0010 0000
}
配置中断号:
void P3Exit_Isr(void) interrupt 40
{
u8 intf;
intf = P3INTF;
if( intf )
{
P3INTF = 0; //清空中断标志位,必须软件清0
if( intf & 0x01 ) //p30按下
{
}
}
}
注意:在中断中千万不能加入延时
中断优先级:相同优先级,靠前的中断源先执行执行完 之后在执行低中断源,且一个中断源在执行的时候不能被打断。定时器0和P3中断都是最低优先级:定时器0中断号1,P3中断号40,执行完定时器0,在执行P3,在执行定定时器0,在执行...
编译时出现中断号超出31的报错,根据官方网址内容,使用下述软件拓展即可
关于中断号大于31在Keil中编译出错的处理-深圳国芯人工智能有限公司 (stcai.com)
四.实战小练
简易中央门禁控制系统
1.用8个按键代表每个门的门锁开关,8个LED作为每个门的工作状态,点亮表示门已经打开,熄灭表示门关闭。
2.如遇突发火灾,按下应急按钮立刻打开所有门锁,方便人逃生。
3.按下应急按钮后,所有按钮门锁不能上锁
4.松开应急按钮后,倒计时5秒后恢复之前的状态,并可以操作门锁:
惦饭宝
发表于 2024-10-5 08:34:25
本帖最后由 惦饭宝 于 2024-10-5 08:35 编辑
第十七集:模数转换器ADC上🕵️♂️
一.模数转换器(ADC)是什么
模数转换器即A/D转换器,或简称ADC(Analog-to-digitalconverter),通常是指一个将模拟信号转变为数字信号的电子元件
主要用于将连续传输的模拟信号转换为数字信号,便于数字系统(如中央处理器CPU、微控制器MCU等)对传输信息进行快速处理和分析。
模拟信号是时间和幅值均连续变化的信号,数字信号的幅值是离散的。
模拟信号主要用于语音、音乐、温度等自然现象的传输,数字信号通常只包括“开”和“关”两种离散的状态。
注意事项:使用ADC功能时有Vref引脚的单片机干万不能悬空,必须接外部参考电压源或者VCC!!!
ADC原理EXCLE表:
二.STC32G单片机ADC使用原理
左对齐或者右对齐,由于寄存器有8位但是ADC需要12位,所以需要两个寄存器来存储。
ADC时序控制器(ADCTIM)
ADC速度计算公式
没有参考电压源的就以VCC作为基准电压
由于VCC外部接电路可能导致电压不稳定,所以在高精度ADC中接入一个基准电压源,且该引脚需<=2.5V
三.编写最简单的ADC采集代码(查询&中断)
// 函数名称: ADC_Init
// 函数功能: ADC初始化,查询写法
void ADC_Init( void )
{
P1M0 = 0x00; //设置P10为高阻输入
P1M1 = 0x01;
ADCTIM = 0X3F;
ADCCFG = 0X2F; //数据右对齐,时钟选择位SYSCLK/2/16最慢
ADC_POWER = 1; //打开adc电源
}
//======================================================================================================
// 函数名称: ADC_Read
// 函数功能: 读取指定通道的adc电压
u16ADC_Read( u8 no )
{
u16 adcval; //adc数值保存变量
ADC_CONTR &= 0xf0; //清空通道
ADC_CONTR |= no; //选择通道
ADC_START = 1; //开启ADC转化
_nop_(); //空操作指令
_nop_();
while(!ADC_FLAG); //等待ADC转换结束
ADC_FLAG = 0;
adcval = (ADC_RES << 8)+ ADC_RESL; //计算adc的数值
adc_val = adcval;
return adcval;
}
//======================================================================================================
// 函数名称: ADC_Init
// 函数功能: 中断的adc初始化,中断写法
void ADC_Init( void )
{
P1M0 = 0x00; //设置P10为高阻输入
P1M1 = 0x01;
ADCTIM = 0X3F;
ADCCFG = 0X2F; //数据右对齐,时钟选择位SYSCLK/2/16最慢
ADC_POWER = 1; //打开adc电源
EADC = 1; //打开中断
ADC_START = 1; //开启ADC转化
}
void ADC_iSR() interrupt 5
{
ADC_FLAG = 0; //清空读取标志位
adc_val = (ADC_RES << 8)+ ADC_RESL; //读取adc的数值
ADC_START = 1; //开启ADC转化
}
//======================================================================================================
// 函数名称: ADC_CAL_Voltage
// 函数功能: 将adc数值换算成电源电压
u16 ADC_CAL_Voltage(u16 num)
{
return num*2.5*1000 /4096;
}
ADC文件:
四.总结:
1.了解ADC的位数、引脚、基准电压、等关键名词。
2.学会ADC的原理,学会用法和电源的换算公式。
五.课后练习
简易电压表:
1.用前4位数码管显示ADC的数值
2.用后四位数码管显示最终电压。
3.电压大于2.2V,蜂鸣长响,表示快要到达上限
江上酒酒
发表于 2024-10-5 11:38:47
惦饭宝 发表于 2024-9-13 17:28
第四集:1.点亮第一颗LED灯😁
概念引入:输出电压=VCC就是高电平,输出电压=GND(一般是0V)就是低电平,分别 ...
学习的很认真
白水大虾2016
发表于 2024-10-5 12:11:51
跟着大佬学习很有收获!