找回密码
 立即注册
查看: 203|回复: 2

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 10:40:24

11

主题

425

回帖

1971

积分

版主

积分
1971
发表于 2025-2-13 15:49:28 | 显示全部楼层 |阅读模式
第一集:I/O口模式设置,传统外部中断

#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;//设置访问片内扩展的xdata部分速度为最快
        WTST = 0;//设置取程序代码不等待,以最快速度运行
        //设置io端口模式,将P40置为低电平
        //设置P32和P33为高阻输入模式,同时打开内部的上拉电阻
        set_io_mode(pu_mode,Pin40,Pin00,Pin01,Pin02,Pin03,Pin_End);
        P40 = 0;
        set_io_mode(hz_mode,Pin32,Pin33,Pin34,Pin35,Pin_End);
        //设置为高阻输入模式
        set_io_mode(en_pur,Pin32,Pin33,Pin34,Pin35,Pin_End);
        //打开内部的上拉电阻,P32和P33顺序可调换
        //打开内部上拉电阻后,最好加一段1ms的延时,以等待端口被拉高
        Delay1ms();
        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))
                {
                //INT0中断时执行的部分
                        P00 = ~P00;
                }
                if(get_int_state(Int1))
                {
                //INT1中断时执行的部分
                        P01 = ~P01;
                }
                P02 = P34;
                P03 = P35;
        }
}

第一集、IO口模式设置,传统外部中断.zip (79.45 KB, 下载次数: 7)

QQ:2269694595     微信:18106296594
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 10:40:24

11

主题

425

回帖

1971

积分

版主

积分
1971
发表于 2025-2-19 11:56:51 | 显示全部楼层
第二集:所有普通 I/O口 都支持的外部中断

截图202502191154367483.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,Pin_End);
        //设置P32和P33为高阻输入模式,IO口默认上电后都是高阻输入模式,上一句可注释掉
        set_io_mode(en_pur,Pin32,Pin33,Pin_End);
        //设置内部上拉电阻打开
        set_io_mode(pp_mode,Pin37,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中断
        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");       
                }
        }
}
第二集 所有普通IO口都支持的外部中断.zip (143.7 KB, 下载次数: 7)

QQ:2269694595     微信:18106296594
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 10:40:24

11

主题

425

回帖

1971

积分

版主

积分
1971
发表于 2025-2-27 09:54:52 | 显示全部楼层
第三集:定时器,【16位自动重装载定时器 + 8位预分频或不分频】= 24位定时器

#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)
        {
                //循环执行代码
                //检测定时器是否有中断
                //对LED对应的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;
                }
                if(get_timer_state(Timer11))
                {
                        P05 = ~P05;
                }
        }
}


QQ:2269694595     微信:18106296594
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 22:25 , Processed in 0.189347 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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