找回密码
 立即注册
查看: 262|回复: 4

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:59
  • 最近打卡:2025-06-16 10:04:37
已绑定手机

21

主题

476

回帖

2276

积分

版主

积分
2276
QQ
发表于 2025-2-12 17:01:30 | 显示全部楼层 |阅读模式
第一集IO模式和传统的外部中断
先学习如何创建新项目
截图202502121655525471.jpg
截图202502131431592937.jpg
截图202502131432106382.jpg

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

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

        _nop_();
        _nop_();
        _nop_();
        i = 9998UL;
        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( pp_mode,Pin40,Pin00,Pin01,Pin_End);
        set_io_mode(hz_mode,Pin32,Pin33,Pin34,Pin35,Pin_End);
        //设置p32和p33P34P35为高阻输入模式
        set_io_mode(en_pur,Pin32,Pin33,Pin34,Pin35,Pin_End);
        //打开内部上拉电阻后,最好加一段1MS的延时,以等待端口被拉高
        Delay1ms();

        //打开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);
        //设置INTO.INT1为下降沿中断
        //  set_int_mode(rising_falling_edge_mode ,Int0,Int1,Int_End);
        //设置INTO.INT1为边沿中断

        EA = 1;        //打开总中断

        while (1)
{
//需要循环执行的代码
//        INTO.INT1的下降沿时,改变p00和p01的电平状态
        if(get_int_state(INT0))
        {
        //INT0中断时执行的部分
                P00= ~P00;
        }
        if(get_int_state(INT1))
                {
                        //INT1中断时执行的部分
                        P01= ~P01;
                }
            P02 =P34;
                P03 =P35;

}

}



www.STCAI.com
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:59
  • 最近打卡:2025-06-16 10:04:37
已绑定手机

21

主题

476

回帖

2276

积分

版主

积分
2276
QQ
发表于 2025-2-14 15:49:07 | 显示全部楼层
第二集打卡所有的普通IO都支持外部中断
截图202502141657408942.jpg

#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为115200波特率,使用定时器2作为串口波特率发生器
        //超时中断长度选择64byte,引脚切换到P36P37上,
        //set_uart_mode(Uart1,"9600bps",Use_TimerX,Odd_9b,"32byte", Uart1_P16_7,Uart_End);
        //设置串口1为9600波特率,使用定时器1作为串口波特率发生器,
        //超时中断长度32byte,引脚切换到P16P17
    //set_uart_mode(Uart1,Uart1_P36_7,Uart_End);
    //支持默认值操作,这部分设置等效为
        //设置串口1为115200波特率,使用定时器2作为串口波特率发生器
        //超时中断长度选择64byte,引脚切换到P36P37上
    //        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");
        
        }
}



}



www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:59
  • 最近打卡:2025-06-16 10:04:37
已绑定手机

21

主题

476

回帖

2276

积分

版主

积分
2276
QQ
发表于 2025-2-19 14:27:52 | 显示全部楼层
第三集24位定时器学习打卡
截图202502191424593730.jpg
截图202502191425166666.jpg


代码

#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,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, 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)
                {       
                //循环的代码
                        //检测定时器终端是否来临
                        //将对应的I/O口进行取反
                       
                        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;
                               
                        }
                               
                        if(get_timer_state(Timer11))
                        {
                                //执行的代码
                        P05 = ~P05;
                               
                        }
                }

}

3timer.mp4

735.28 KB, 下载次数: 11

www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:59
  • 最近打卡:2025-06-16 10:04:37
已绑定手机

21

主题

476

回帖

2276

积分

版主

积分
2276
QQ
发表于 2025-2-19 15:27:54 | 显示全部楼层
第四集串口通信有DMA支持
截图202502191528539041.jpg
截图202502191529022872.jpg

手敲代码编译通过

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


void main (void)
{
         EAXFR = 1;
        
//将P36、37的I0口设置为准双向模式

set_io_mode(pu_mode, Pin36,Pin37,Pin_End);
//P32按键,打开上拉电阻,设置对应的io口中断打开
set_io_mode(en_pur, Pin32,Pin_End);
set_ioint_mode(falling_edge_mode, Pin32,Pin_End);
set_ioint_mode(en_int, Pin32,Pin_End);

//设置串口1,切换引脚到P36、37
set_uart_mode(Uart1,Uart1_P36_7,Uart_End);


        
        EA =1 ;
        while (1)
        {
        //检测P32按下
                //通过串口1发送一串数据
        if(get_ioint_state(Pin32) )
        {
               
                uart_printf(Uart1,"ai8051u\r\n");
        }
        }

}


www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:59
  • 最近打卡:2025-06-16 10:04:37
已绑定手机

21

主题

476

回帖

2276

积分

版主

积分
2276
QQ
发表于 2025-2-20 13:47:38 | 显示全部楼层
第五集:ADC
截图202502201122263932.jpg
截图202502201347277158.jpg


#include <AI8051U.H>
#include "set_adc.h"
#include "set_io.h"
#include "set_timer.h"
#include "set_uart.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_io_mode (hz_mode, Pin10,Pin_End );//设置ADC输入为高阻输入模式
        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[Adc0_P10]);
               
                }
               
                //循环执行部分代码

        }
}
        }

www.STCAI.com
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 23:40 , Processed in 0.139991 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表