AI芯 发表于 2025-2-13 09:55:01

Ai8051U创新风格库函数学习打卡

第一集:I/O口模式和传统外部中断

用到如下函数:
// 声明函数
void set_io_mode(io_mode mode, ...); // 批量设置IO的模式
// 详细解释:mode为IO的模式,后面为可变参数的io_name参数,需要注意的是,输入完后需要添加Pin_End作为结束符
// 例如set_io_mode(pu_mode,Pin00,Pin21,Pin32,Pin_End);就是将P00,P21,P32这3个IO设置为上拉输入模式
//函数功能:设置外部中断INT0~INT4的触发方式.可以一次性设置同一种模式的多个中断。
//因为是变长函数,所以最后需要加上INT_End结束。
//举例:set_int_mode(all_edge_mode,Int0,Int1,Int_End);//设置INT0和INT1为边沿中断
void set_int_mode(int_mode mode, ...);// 函数功能:获取中断状态
// 返回值:0表示没有中断,1表示有中断
// 举例:if(get_int_state(Int0))//判断INT0是否有中断
char get_int_state(int_num num);
跟着视频写了程序:
#include <AI8051U.H>
#include "set_int.h"
#include "set_io.h"
#include "intrins.h"

void Delay1ms(void)        //@40.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 9998UL;
        while (i) i--;
}

void main(void)
{
        //初始化代码
        EAXFR = 1;
        CKCON = 0;
        WTST = 0;
        //设置IO模式,将P40置低
        //设置P32和P33为高阻输入模式,同时打开内部上拉电阻
        set_io_mode(pu_mode,Pin40,Pin00,Pin01,Pin02,Pin03,Pin_End);//Pin40,Pin00,Pin01,Pin02,Pin03为准双向口模式
        P40 = 0;
        set_io_mode(hz_mode,Pin32,Pin33,Pin34,Pin35,Pin_End);   //Pin32,Pin33,Pin34,Pin35为高阻输入模式
        set_io_mode(en_pur,Pin32,Pin33,Pin34,Pin35,Pin_End);    //打开Pin32,Pin33,Pin34,Pin35内部上拉电阻
        Delay1ms();                                             //延时1ms
        set_int_mode(falling_edge_mode,Int0,Int1,Int_End);      //Int0,Int1下降沿中断
        EA = 1;
        while(1)
        {
                //循环执行的代码
                //int0,int1下降沿触发时,改变P00和P01的电平状态
                if(get_int_state(Int0))
                {
                        P00 = ~P00;               //int0中断时执行
                }
                if(get_int_state(Int1))
                {
                        P01 = ~P01;               //int1中断时执行
                }
                P02 = P34;
                P03 = P35;
        }
}


AI芯 发表于 2025-2-14 17:26:54

第二集:IO中断

用到如下函数:
// 声明函数
void set_io_mode(io_mode mode, ...); // 批量设置IO的模式
// 详细解释:mode为IO的模式,后面为可变参数的io_name参数,需要注意的是,输入完后需要添加Pin_End作为结束符
// 例如set_io_mode(pu_mode,Pin00,Pin21,Pin32,Pin_End);就是将P00,P21,P32这3个IO设置为上拉输入模式// 外部使用函数,第一个参数为ioint_mode枚举类型,第二个参数及其后面为io_name枚举类型
// 这是一个变长函数,举一个例子:
// set_ioint_mode(en_int,Pin00,Pin01,Pin02,Pin20,Pin_End);
// 这样是将Pin00,Pin01,Pin02,Pin20的IO中断模式都使能,最后必须为Pin_End
void set_ioint_mode(ioint_mode mode, ...);// 这是一个获取中断标志位的函数,参数为io_name枚举类型,返回值为char类型
// 返回值只会出现0和1,0表示没有中断,1表示有中断,查询一次后自动清除
char get_ioint_state (io_name pin);
// 设置串口模式,默认配置为115200波特率,8位数据位,1位停止位.
// 变长参数,可变参数为波特率、超时中断数据位,串口切换引脚,最后需要使用Uart_End结束。
// 举个例子:set_uart_mode(Uart1, "9600bps", Uart1_P36_7, Uart_End);
// 这个的意思是设置串口1为9600波特率,8位数据位,1位停止位,并切换引脚为P36和P37上,超时中断为64byte
// 超时中断的作用是对数据自动分包,64byte就是没数据64个字节(根据波特率),就会自动中断,然后进行数据分包。
// 再举个例子:set_uart_mode(Uart1, "32byte", "115200bps", Uart_End);
// 这个的意思是设置串口1为115200波特率,并切换引脚为P30和P31上(默认引脚),超时中断为32byte。
// 变长参数部分支持乱序输入,波特率和超时中断需要带上单位bps和byte,中间不要有空格。
// 如果不输入变长参数,例如:set_uart_mode(Uart1, Uart_End);//则代表115200波特率,64byte,P30P31(UART1下)
// 即不输入的选项拥有默认值,不设置也可以的。
void set_uart_mode(uart_name uart, ...);
// 默认值为115200波特率,超时中断64byte,引脚切换每个串口的第一个(参见上面的宏定义)
// uart1是P30和P31,uart2是P12和P13,uart3是P00和P01,uart4是P02和P03实验箱程序如下:
#include <AI8051U.H>
#include "io_int.h"
#include "set_io.h"
#include "set_uart.h"

void main(void)
{
        EAXFR = 1;
        CKCON = 0;
        WTST = 0;
        //初始化程序
        //按下P32,按下P33,通过串口打印出识别到的上升沿/下降沿
        set_io_mode(hz_mode,Pin32,Pin33,Pin36,Pin_End);       //设置P32 P33 P36为高阻输入模式,上电默认为高阻输入模式
        set_io_mode(en_pur,Pin32,Pin33,Pin36,Pin_End);      //设置P32 P33 P36内部的4K上拉电阻打开
        set_io_mode(pp_mode,Pin37,Pin_End);                   //将串口发送脚P37设置为推挽输出,抗干扰
        set_ioint_mode(falling_edge_mode,Pin32,Pin_End);      //设置P32为下降沿中断
        set_ioint_mode(rising_edge_mode,Pin33,Pin_End);       //设置P33为上升沿中断
        set_ioint_mode(en_int,Pin32,Pin33,Pin_End);         //同时打开P32 P33的IO中断
       
        set_uart_mode(Uart1,"115200bps",Use_Timer2,Base_8b,"64byte",Uart1_P36_7, Uart_End);
        //设置串口1为115200bps的波特率,使用定时器2作为串口波特率发生器
        //超时中断长度选择64byte ,引脚切换到P36、P37上
               
        EA = 1;
        while(1)
        {
                //循环执行的程序
                if(get_ioint_state(Pin32))                // 设置P32为下降沿中断
      {
            uart_printf(Uart1,"P32 Click\r\n");
      }
      if(get_ioint_state(Pin33))                // 设置P33为上升沿中断
      {
            uart_printf(Uart1,"P33 Click\r\n");
      }
        }
}
擎天柱程序如下:
#include <AI8051U.H>
#include "io_int.h"
#include "set_io.h"

void main(void)
{
        EAXFR = 1;
        CKCON = 0;
        WTST = 0;
        //初始化程序
        //按下P32,按下P33,通过串口打印出识别到的上升沿/下降沿
        set_io_mode(hz_mode,Pin32,Pin33,Pin_End);       //设置P32 P33 为高阻输入模式,上电默认为高阻输入模式
        set_io_mode(en_pur,Pin32,Pin33,Pin_End);      //设置P32 P33 内部的4K上拉电阻打开
    set_io_mode(pu_mode,Pin20,Pin21,Pin_End);   
        set_ioint_mode(falling_edge_mode,Pin32,Pin_End);      //设置P32为下降沿中断
        set_ioint_mode(rising_edge_mode,Pin33,Pin_End);       //设置P33为上升沿中断
        set_ioint_mode(en_int,Pin32,Pin33,Pin_End);         //同时打开P32 P33的IO中断
       
               
        EA = 1;
        while(1)
        {
                //循环执行的程序
                if(get_ioint_state(Pin32))                // 设置P32为下降沿中断
      {
            P20 = ~P20;
      }
      if(get_ioint_state(Pin33))                // 设置P33为上升沿中断
      {
            P21 = ~P21;
      }
        }
}

阿杰爱学单片机 发表于 2025-2-14 22:31:47

才知道还有库函数可以用

AI芯 发表于 2025-2-15 08:45:44

阿杰爱学单片机 发表于 2025-2-14 22:31
才知道还有库函数可以用


深圳国芯人工智能有限公司-库函数



USB型,Ai8051U创新风格库函数持续开发中,内部视频培训, 听取建议,2/8更新
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13629
(出处: 国芯技术交流网站)


页: [1]
查看完整版本: Ai8051U创新风格库函数学习打卡