芯希望 发表于 2025-2-12 16:41:53

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

第1集I/O口模式和传统的外部中断

595
#include <AI8051U.H>
#include "set_int.h"
#include "set_io.h"
#include "intrins.h"

void Delay1us(void)      //@24.000MHz
{
      unsigned long edata i;

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

void main(void)
{
      
      //需要初始化部分的代码
      EAXFR = 1;//拓展寄存器访问使能
      CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
      WTST = 0;//设置取程序代码不等待,以最快速度运行
      //设置io端口模式,将P40置为低电平
      //设置P32和P33为高阻输入模式,同时打开内部的上拉电阻
      set_io_mode(pu_mode, Pin40,Pin00,Pin01,Pin02,Pin03,Pin_End);
      P40 = 0;
      //set_io_mode(pu_mode, Pin40,Pin00,Pin01,Pin_End);
      set_io_mode(hz_mode,Pin32,Pin33,Pin34,Pin35,Pin_End);
      //设置P32、P33、P34、P35为高阻输入模式
      set_io_mode(en_pur,Pin32,Pin33,Pin34,Pin35,Pin_End);
      //打开内部上拉电阻后,最好加一段1ms的延时,以等待端口被拉高
      Delay1us();
      //打开P32和P33内部的上拉电阻
      //set_io_mode(dis_pur,Pin32,Pin33,Pin_End);//关闭P32和P33的内部上拉电阻
      //set_io_mode(en_pur,Pin32,Pin33,Pin_End);//关闭P32和P33的内部上拉电阻,参数顺序无所谓
      set_int_mode(falling_edge_mode,Int0,Int1,Int_End);
      //设置INT0和INT1为下降沿中断
      set_int_mode(rising_falling_edge_mode,Int0,Int1,Int_End);
      //设置INT0和INT1为边沿中断
      
      EA = 1;//打开总中断
      while(1)
      {
                //需要循环执行的代码
                //INT0、INT1的下降沿时,改变P00和P01的电平状态
                if(get_int_state(INT0))
                {
               //INT0中断执行的部分
                        P00 = ~P00;
                }
                if(get_int_state(INT1))
                {
               //INT1中断执行的部分
                        P01 = ~P01;
                }
                P02 = P34;
                P03 = P35;
      }
}

芯希望 发表于 2025-2-14 11:06:18

第2集 所有普通IO口都支持的外部中断


#include <AI8051U.H>
#include "io_int.h"
#include "set_io.h"
#include "set_uart.h"

void main(void)
{
        EAXFR = 1;//拓展寄存器访问使能
        CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
        WTST = 0;//设置取程序代码不等待,以最快速度运行
        //初始化程序
        //按下P32按键,按下P33按键,通过串口打印出识别到的上升沿/下降沿
        set_io_mode(hz_mode,Pin32,Pin33,Pin36,Pin_End);
        //设置P32和P33为高阻输入模式,默认就是高阻
        set_io_mode(en_pur,Pin32,Pin33,Pin36,Pin_End);
        //设置P32和P33内部的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,Pin32,Pin_End);
        //设置P32为上升沿中断
        //set_ioint_mode(low_level_mode,Pin32,Pin_End);
        //设置P32为低电平中断
        //set_ioint_mode(high_level_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_ioint_mode(dis_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上
    //set_uart_mode(Uart1,"9600bps",Use_Timerx,"32byte",Odd_9b,Uart1_P16_7,Uart_End);
        //设置串口1为9600bps的波特率,使用定时器1作为串口波特率发生器
        //超时中断长度选择32byte,引脚切换到P16、P17
        //set_uart_mode(Uart1,Uart1_P36_7,Uart_End);
        //支持默认值操作,这部分设置等效为
        //设置串口1为9600bps的波特率,使用定时器1作为串口波特率发生器
        //超时中断长度选择32byte,引脚切换到P36、P37上
        //set_uart_mode(Uart3,"9600bps",Use_Timerx,Base_8b,"64byte",Uart3_P50_1,Uart_End);
        //set_uart_mode(Uart4,"38400bps",Use_Timerx,Base_8b,"64byte",Uart4_P52_3,Uart_End);
        //实现设置两个串口工作在不同的波特率下,使用的是8位无校验模式
        //set_uart_mode(Uart3,"9600bps",Use_Timer2,Base_8b,"64byte",Uart3_P50_1,Uart_End);
        //set_uart_mode(Uart4,"9600bps",Use_Timer2,Base_8b,"64byte",Uart4_P52_3,Uart_End);
        //实现设置两个串口工作在相同的波特率下,使用的是8位无校验模式
        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");
                }
        }
}

芯希望 发表于 2025-2-20 10:54:25

第3集24位定时器

(1)学习截图

614
(2)学习截图

615

#include <AI8051U.H>
#include "set_io.h"
#include "set_timer.h"

void main(void)
{
      EAXFR = 1;
      CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
      WTST = 0;//设置取程序代码不等待,以最快速度运行
      //初始化的代码
      //P40设置为准双向口,,同时置为低电平
      set_io_mode(pu_mode,Pin40,Pin00,Pin01,Pin02,Pin03,Pin04,Pin05,Pin_End);
      //设置P00--P05 I/O口为准双向口
      P40 = 0;
      //设置定时器0为0.5s,定时器1为1s,定时器2为200ms,定时器3为10hz
      //定时器4为2s,定时器11为300ms
      //暂时只能支持秒、毫秒、赫兹三个单位,如果想要使用微秒,0.5ms=500us
      //set_timer_fosc(11059200UL);
      set_timer_mode(Timer0,"0.5s",Timer_End);
    //set_timer_mode(Timer1,"1s",Timer_End);//设置1s的定时
      set_timer_mode(Timer1,"100000hz",En_OutClk,Dis_Int,Timer_End);
      //设置用定时器1对系统时钟分频对外输出时钟,如100Khz
      //产生较高频率对外输出时,系统时钟需要满足要求,并且需要关闭中断
      //如1khz为set_timer_mode(Timer1,"1000hz",En_OutClk,Dis_Int,Timer_End);
      //如1Mhz为set_timer_mode(Timer1,"1000000hz",En_OutClk,Dis_Int,Timer_End);
      set_timer_mode(Timer2,"200ms",Timer_End);
      set_timer_mode(Timer3,"10hz",Timer_End);
      set_timer_mode(Timer4,"2s",Timer_End);
      set_timer_mode(Timer11,"300ms",Timer_End);
      
      EA = 1;
      while(1)
      {
                //循环的代码
                //检测定时器是否有中断
                //将对应IO口的电平进行取反
                if(get_timer_state(Timer0))
                {
                        //执行的代码
                        P00 = ~P00;
                }
//                if(get_timer_state(Timer1))
//                {
//                        //执行的代码
//                        P01 = ~P01;
//                }
                if(get_timer_state(Timer2))
                {
                        //执行的代码
                        P02 = ~P02;
                }
                if(get_timer_state(Timer3))
                {
                        //执行的代码
                        P03 = ~P03;
                }
                if(get_timer_state(Timer4))
                {
                        //执行的代码
                        P04 = ~P04;
                        set_timer_mode(Timer4,Dis_Int,Timer_End);
                        //实现定时器4定时2s中断,产生中断后对P04取反,然后关闭定时器4中断
                }
                if(get_timer_state(Timer11))
                {
                        //执行的代码
                        P05 = ~P05;
                }
      }
}

芯希望 发表于 2025-2-20 11:44:51

第4集 串口部分库函数



#include <AI8051U.H>
#include "io_int.h"
#include "set_io.h"
#include "set_uart.h"
#include "stdio.h"

int num = 0;
char str = {'a','b','c','d','e'};


void main(void)
{
    EAXFR = 1; //拓展寄存器访问使能
      CKCON = 0; //设置访问片内扩展的xdata部分速度为最快
      WTST = 0; //设置取程序代码不等待,以最快速度运行
      //需要初始化部分的程序
      //设置P36、P37端口为准双向口,推荐:TXD(推挽输出)、RXD(高阻输入+4K内部电阻上拉)
      set_io_mode(pu_mode,Pin36,Pin37,Pin42,Pin43,Pin_End);
      //不同波特率的串口使用,以及printf函数的使用
         set_uart_mode(Uart1, "115200bps", Uart1_P36_7, Use_Timerx, Uart_End);
      //set_uart_mode(Uart1, Uart1_P36_7, "115200bps",Uart_End);
      set_uart_mode(Uart2, Uart2_P42_3, "9600bps", Use_Timerx, Uart_End);
      //设置I/O中断,P34按键,按下时发送一个字符串
         set_io_mode(hz_mode, Pin34, Pin_End);
   set_io_mode(en_pur, Pin34, Pin_End);
   set_ioint_mode(falling_edge_mode, Pin34, Pin_End);
   set_ioint_mode(en_int, Pin34, Pin_End);
   EA = 1; //打开总中断
      while(1)
      {
                if(get_ioint_state(Pin34))
                {
                         uart_printf(Uart1, "uart1,hello!\r\n");
                         uart_printf(Uart2, "uart2,hello!\r\n");
                }
               
                if(get_uart_state(Uart1))
                {
                        sscanf(_uart1_rx_buff, "num:%d", &num);
                        uart_printf(Uart1, "this_num:%d\r\n",num);
                        uart_printf(Uart2, Buff_Mode, str, 5);      
                }            
      }
}



芯希望 发表于 2025-2-21 10:57:54

第5集 ADC部分库函数


#include <AI8051U.H>
#include "set_adc.h"
#include "set_uart.h"
#include "set_timer.h"
#include "set_io.h"

void main(void)
{
        EAXFR = 1; //拓展寄存器访问使能
        CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
        WTST = 0;//设置取程序代码不等待,以最快速度运行
        //初始化部分代码
        //初始化P36 P37为准双向IO口
        set_io_mode(pu_mode,Pin36,Pin37,Pin_End);
        //设置0.5s定时时间,使用Timer0
        set_timer_mode(Timer0, "0.5s", Dis_OutClk, En_Int, Timer_End);
        //设置串口1为P36 P37
        set_uart_mode(Uart1, "115200bps", Uart1_P36_7, Uart_End);
        //设置ADC采样ADC0
        set_adc_mode(cycl_mode,Adc0_P10,Adc_End);
        EA = 1;
        while(1)
        {
                //检测到定时器产生中断,使用串口打印ADC的值
                if(get_timer_state(Timer0))//0.5s执行一次
                {
                        if(get_adc_state(Adc0_P10))
                        {
                                uart_printf(Uart1, "adc_dat:%d\r\n",adc_value);
                        }
                }
                //循环执行部分代码
        }
}

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