小涵子爸爸 发表于 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

跟着大佬学习很有收获!
页: 1 2 [3]
查看完整版本: 32G12K128学习打卡记录 加油GOGOGO!