AI8051U创库函数学习打卡
第一集:I/O口模式设置,传统外部中断【INT0, INT1, INT2, INT3, INT4】#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;
}
}
第二集:所有普通I/O口都支持的外部中断
#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为高阻输入模式,默认就是高阻
set_io_mode(en_pur,Pin32,Pin33,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",0dd_9b,Uart1_P16_7,Uart_End);
//设置串口1为9600bps的波特率,使用定时器1作为串口波特率发生器
//超时中断长度选择32byte,引脚切换到P16、P17上
//set_uart_mode(Uart1,Uart1_P36_7,Uart_End);
//支持默认值操作,这部分设置等效为
//设置串口1为115200bps的波特率,使用定时器2作为串口波特率发生器
//超时中断长度选择64byte,引脚切换到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_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位无校验模式
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");
}
}
}
第三集:24位定时器
#include <AI8051U.H>
#include "set_io.h"
#include "set_timer.h"
void main(void)
{
EAXFR = 1;
//初始化代码
set_io_mode(pu_mode,Pin40,Pin00,Pin01,Pin_End);
P40=0;
//初始化LED部分的IO口
set_timer_mode(Timer0,"1s",Timer_End);
set_timer_mode(Timer1,"0.5s",Timer_End);
//初始化定时器,让P00每隔1s闪烁一次,P01每个0.5s闪烁一次
EA = 1;
while(1)
{
//循环执行代码
//检测定时器是否有中断
//对LED对应的IO口进行取反
if(get_timer_state(Timer0))//1s改变一次
{
P00 = ~P00;
}
if(get_timer_state(Timer1))//0.5s改变一次
{
P01 = ~P01;
}
}
}619
#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)
{
//循环执行代码
//检测定时器中断是否来临
//将对应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;
set_timer_mode(Timer4,Dis_Int,Timer_End);
//实现定时器4定时2s中断,产生中断后对P04取反,然后关闭定时器4中断
}
if(get_timer_state(Timer11))
{
//执行代码
P05 = ~P05;
}
}
}620
页:
[1]