任务一:编写看门狗程序
1、学习截图
P33按住0.5s以上系统复位
501
2、主要代码
#include "config.h"
#include "task.h"
#include "io.h"
u8 State={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 i;
u8 Run_State = 0; //运行状态
u8 num = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
int count = 1; //按键计数
Sys_init(); //函数调用,系统初始化
usb_init(); //USB CDC接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init();//定时器初始化
Init_595();
EA = 1;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
WDT_CONTR = 0X24;
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
Task_Pro_Handler_Callback();//执行功能函数
if( P33 !=0)
WDT_CONTR = 0X34;
}
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
任务二:软件复位
1、学习截图
(1)复位后进入下载模式 IAP_CONTR = 0X60;
502
(2)复位后从头开始运行用户程序 IAP_CONTR = 0X20;
503
2、主要代码
#include "config.h"
#include "task.h"
#include "io.h"
u8 State={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 i;
u8 Run_State = 0; //运行状态
u8 num = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
int count = 1; //按键计数
Sys_init(); //函数调用,系统初始化
usb_init(); //USB CDC接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init();//定时器初始化
Init_595();
EA = 1;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
WDT_CONTR = 0X24;
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
Task_Pro_Handler_Callback();//执行功能函数
WDT_CONTR = 0X34;
}
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
附学习链接:
https://www.stcaimcu.com/data/attachment/forum/202412/04/133759svqx900qdzbqj0x5.png
https://www.stcaimcu.com/forum.p ... 11902&extra=&page=1
《8051U深度入门到32位51大型实战教学视频》发表学习心得 七集 以上,赠送 超级强大的 Ai8051U实验箱,并保证会持续到15集课程以后可做:USB声卡,各种USB教学设备,音频播放器,示波器,FFT频谱分析仪, AI手写计算器100万套 Ai8051U-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】
第十三集 外部中断,已手敲代码,测试通过。
任务:编写外部中断1的程序
1、学习截图
P00三秒取反,P01随着P33按一下,取反一次
532
2、主要代码
#include "config.h"
#include "task.h"
#include "io.h"
u8 State={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 i;
u8 Run_State = 0; //运行状态
u8 num = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay3000ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 17999998UL;
while (i) i--;
}
void main(void)
{
int count = 1; //按键计数
Sys_init(); //函数调用,系统初始化
usb_init(); //USB CDC接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init();//定时器初始化
Init_595();
INT1_Init();//外部中断1初始化
EA = 1;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
// WDT_CONTR = 0X24;
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
// Task_Pro_Handler_Callback();//执行功能函数
// if(P33 != 0)
// WDT_CONTR = 0X34;
P00 = !P00;
Delay3000ms();
}
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
附学习链接:
https://www.stcaimcu.com/data/attachment/forum/202412/04/133759svqx900qdzbqj0x5.png
https://www.stcaimcu.com/forum.p ... 11902&extra=&page=1
《8051U深度入门到32位51大型实战教学视频》发表学习心得 七集 以上,赠送 超级强大的 Ai8051U实验箱,并保证会持续到15集课程以后可做:USB声卡,各种USB教学设备,音频播放器,示波器,FFT频谱分析仪, AI手写计算器100万套 Ai8051U-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】
第十四集 IO中断,已手敲代码,测试通过。
任务1:编写IO中断程序
1、学习截图
539
2、主要代码
#include "config.h"
#include "task.h"
#include "io.h"
u8 State={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 i;
u8 Run_State = 0; //运行状态
u8 num = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay3000ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 17999998UL;
while (i) i--;
}
void main(void)
{
int count = 1; //按键计数
Sys_init(); //函数调用,系统初始化
usb_init(); //USB CDC接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init();//定时器初始化
Init_595();
//INT1_Init();//外部中断1初始化
P3_IO_Init();//IO中断初始化
EA = 1;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
// WDT_CONTR = 0X24;
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
// Task_Pro_Handler_Callback();//执行功能函数
// if(P33 != 0)
// WDT_CONTR = 0X34;
P00 = !P00;
Delay3000ms();
}
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
任务2:编写P4端口的I0中断 打断 P3低电平中断的的程序
1、设置P3优先级比P4高
(1)学习截图
按下P3显示1,按下P4显示2,高优先级可以打断低优先级中断
538
(2)主要代码
void P3_IO_Init(void)
{
P3IM0 = 0X00; //IO中断模式设置为了下降沿
P3IM1 = 0Xff;
P3INTE = 0X08;//打开中断
}
void P3_IO_ISR(void) interrupt 40
{
u8 intf;
intf = P3INTF;
if(intf)//判断有没有IO触发了中断
{
P3INTF = 0;
if(intf & 0X08)//判断是否是P33按钮按下
{
passward = 1;
//P01 = !P01;
}
}
}
void P4_IO_Init(void)
{
P4IM0 = 0X00; //IO中断模式设置为了下降沿
P4IM1 = 0Xff;
P4INTE = 0X80;//打开中断
}
void P4_IO_ISR(void) interrupt 41
{
u8 intf;
intf = P4INTF;
if(intf)//判断有没有IO触发了中断
{
P4INTF = 0;
if(intf & 0X80)//判断是否是P33按钮按下
{
passward = 2;
}
}
}
2、设置P4优先级比P3高
(1)学习截图
按下P3显示1,按下P4显示2,高优先级可以打断低优先级中断
537
(2)主要代码
void P3_IO_Init(void)
{
P3IM0 = 0X00; //IO中断模式设置为了下降沿
P3IM1 = 0Xff;
P3INTE = 0X08;//打开中断
}
void P3_IO_ISR(void) interrupt 40
{
u8 intf;
intf = P3INTF;
if(intf)//判断有没有IO触发了中断
{
P3INTF = 0;
if(intf & 0X08)//判断是否是P33按钮按下
{
passward = 1;
//P01 = !P01;
}
}
}
void P4_IO_Init(void)
{
P4IM0 = 0X00; //IO中断模式设置为了下降沿
P4IM1 = 0Xff;
P4INTE = 0X80;//打开中断
PINIPH |=(1<<4);//写入最高优先级
PINIPL |=(1<<4);
}
void P4_IO_ISR(void) interrupt 41
{
u8 intf;
intf = P4INTF;
if(intf)//判断有没有IO触发了中断
{
P4INTF = 0;
if(intf & 0X80)//判断是否是P33按钮按下
{
passward = 2;
}
}
}
附学习链接:
https://www.stcaimcu.com/data/attachment/forum/202412/04/133759svqx900qdzbqj0x5.png
https://www.stcaimcu.com/forum.p ... 11902&extra=&page=1
《8051U深度入门到32位51大型实战教学视频》发表学习心得 七集 以上,赠送 超级强大的 Ai8051U实验箱,并保证会持续到15集课程以后可做:USB声卡,各种USB教学设备,音频播放器,示波器,FFT频谱分析仪, AI手写计算器100万套 Ai8051U-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】
第十五集 定时器做计数器,已手敲代码,测试通过。
任务1:编写定时器1计数的的程序
1、学习截图
10个脉冲中断一次,按下P35实现计数
564
2、主要代码
#include "tim.h"
u32 Count_T1 = 0;
void TIM1_Count_Init(void)
{
T1_CT = 1;//设置为外部计数
T1_M1 = 0;//设置为16位自动重载
T1_M0 = 0;
T1_GATE = 0;
TH1 = (65536-Count_num)>>8;//65526
TL1 = (65536-Count_num);
P3PU |= 0x20;
TR1 = 1;//启动定时器1
ET1 = 1;//打开定时器1外部中断
}
void Timer1_Isr(void) interrupt 3 //3秒执行一次
{
Count_T1 ++; //T1引脚检测到十个脉冲就会溢出一次
}
void T1_RunTask(void)
{
u32 count_th_tl = 0;
count_th_tl = ((u16)TH1 << 8)+(u16)TL1;
count_th_tl -=65526;
SEG7_ShowLong(Count_T1*Count_num+count_th_tl,10);
}
任务2:编写INT1测量低电平时间
1、学习截图
由按键模拟信号,按下P33,实现100us的计数周期计数
565
2、主要代码
#include "tim.h"
u32 Count_T1 = 0;
void Timer1_Isr(void) interrupt 3
{
static u32 count_p33 = 0;
if(P33 == 0)//按键按下开始计数
{
count_p33 ++;
}
else
{
if(count_p33 > 0)
{
Count_T1 = count_p33;
}
count_p33 = 0;
}
}
void Timer1_Init(void) //100微秒@24.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x38; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
}
void T1_RunTask(void)
{
//SEG7_ShowLong(Count_T1,10);//显示整数
SEG7_ShowString("%07.01f",((float)Count_T1)/10);
}
附学习链接:
https://www.stcaimcu.com/data/attachment/forum/202412/04/133759svqx900qdzbqj0x5.png
https://www.stcaimcu.com/forum.p ... 11902&extra=&page=1
《8051U深度入门到32位51大型实战教学视频》发表学习心得 七集 以上,赠送 超级强大的 Ai8051U实验箱,并保证会持续到15集课程以后可做:USB声卡,各种USB教学设备,音频播放器,示波器,FFT频谱分析仪, AI手写计算器100万套 Ai8051U-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】
第十七集 串口的简单应用,已手敲代码,测试通过
1、学习截图
2、主要代码
#include "config.h"
#include "task.h"
#include "io.h"
#include "time.h"
#include "usart.h"
u8 State={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 i;
//State
u8 Run_State = 0; //运行状态
u8 num = 0;
u16 Count_ms = {0,0,0}; //3个计时变量
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay3000ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 17999998UL;
while (i) i--;
}
void main(void)
{
int count = 1;
Sys_init(); //函数调用系统初始化
usb_init();
IE2 |= 0x80;
Timer0_Init();
EA = 1;
// init_595();
P40 = 0;
Timer1_Init();
Uart2_Init();
//TIM1_Count_Init();
T1_RunTask();
// P3_IO_Init();
// P4_IO_Init();
// INT1_Init();
while (DeviceState != DEVSTATE_CONFIGURED);
// WDT_CONTR = 0X24;
while(1)
{
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
Task_Pro_Handler_Callback();
}
}
void Timer0_Isr(void) interrupt 1
{
Task_Marks_Handler_Callback();
}
附学习链接:
https://www.stcaimcu.com/data/attachment/forum/202412/04/133759svqx900qdzbqj0x5.png
https://www.stcaimcu.com/forum.p ... 11902&extra=&page=1
《8051U深度入门到32位51大型实战教学视频》发表学习心得 七集 以上,赠送 超级强大的 Ai8051U实验箱,并保证会持续到15集课程以后可做:USB声卡,各种USB教学设备,音频播放器,示波器,FFT频谱分析仪, AI手写计算器100万套 Ai8051U-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】
第十八集 串口的高级应用,已手敲代码,测试通过
任务1:使用奇校验,8位数据位,1位停止位的数据,发送"OPEN\r\n"
1、学习截图
2、主要代码
#include "usart.h"
#include "io.h"
bit B_TX2_Busy=0;
u8 Rec_Dat;
u8 Rec_Num = 0;
void Uart2_Isr(void) interrupt 8
{
u8 dat;
if (S2CON & 0x02) //检测串口2发送中断
{
S2CON &= ~0x02;
B_TX2_Busy = 0; //清除串口2发送中断请求位
}
if (S2CON & 0x01) //检测串口2接收中断
{
S2CON &= ~0x01; //清除串口2接收中断请求位
dat = S2BUF;
ACC = dat;
if( S2RB8 == (!P))//奇校验
Rec_Dat = dat;
}
}
void Uart2_Init(void) //9600bps@24.000MHz
{
P_SW2 |= 0x01; //UART2/USART2: RxD2(P4.6), TxD2(P4.7)
S2CON = 0xD0; //9位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x8F; //设置定时初始值
T2H = 0xFD; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x01; //使能串口2中断
Rec_Num = 0;
B_TX2_Busy = 0;
}
void Uart2_SendStr(u8 *puts) //串口数据发送函数
{
u8 dat;
for(; *puts !=0;puts++) //遇到停止符0结束
{
dat = *puts;
ACC = dat;
if( P )
S2TB8 = 0;
else
S2TB8 = 1;
S2BUF = dat;
B_TX2_Busy=1;
while(B_TX2_Busy);
}
}
void Usart2_RunTask(void)
{
if(Rec_Num >= 6)
{
if((Rec_Dat =='\n')&&(Rec_Dat =='\r'))
{
if((Rec_Dat =='O')&&(Rec_Dat =='P')&&(Rec_Dat =='E')&&(Rec_Dat =='N'))
{
password=16;
password=16;
password=16;
password=16;
Uart2_SendStr("打开成功!\r\n");
}
else if((Rec_Dat =='C')&&(Rec_Dat =='L')&&(Rec_Dat =='O')&&(Rec_Dat =='S')&&(Rec_Dat =='E'))
{
password=17;
password=17;
password=17;
password=17;
Uart2_SendStr("关闭成功!\r\n");
}
Rec_Num = 0;
}
}
}
任务二:串口超时中断
1、学习截图
2、主要代码
#include "usart.h"
#include "io.h"
bit B_TX2_Busy=0;
u8 B_RX2_OK = 0;//串口接收完成标志位
u8 Rec_Dat;
u8 Rec_Num = 0;
void Uart2_Isr(void) interrupt 8
{
if (S2CON & 0x02) //检测串口2发送中断
{
S2CON &= ~0x02;
B_TX2_Busy = 0; //清除串口2发送中断请求位
}
if (S2CON & 0x01) //检测串口2接收中断
{
S2CON &= ~0x01; //清除串口2接收中断请求位
UR2TOCR = 0xe0; //开启超时中断,使用系统时钟
Rec_Dat = S2BUF;
}
if(UR2TOSR & 0x01) //串口超时中断
{
B_RX2_OK = 1; //接收完成标志位
UR2TOSR = 0x00; //清除超时标志位
UR2TOCR = 0x00; //关闭超时中断
}
}
void Uart2_Init(void) //9600bps@24.000MHz
{
P_SW2 |= 0x01; //UART2/USART2: RxD2(P4.6), TxD2(P4.7)
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x8F; //设置定时初始值
T2H = 0xFD; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x01; //使能串口2中断
UR2TOCR = 0x00; //关闭超时中断
UR2TOTL = 0x04;
UR2TOTH = 0x3b;
UR2TOTE = 0x01;
Rec_Num = 0;
B_TX2_Busy = 0;
}
void Uart2_SendStr(u8 *puts) //串口数据发送函数
{
for(; *puts !=0;puts++) //遇到停止符0结束
{
S2BUF = *puts;
B_TX2_Busy=1;
while(B_TX2_Busy);
}
}
void Usart2_RunTask(void)
{
if( B_RX2_OK == 1 )
{
B_RX2_OK = 0;
Uart2_SendStr("接收成功!\r\n");
}
}
附学习链接:
https://www.stcaimcu.com/data/attachment/forum/202412/04/133759svqx900qdzbqj0x5.png
https://www.stcaimcu.com/forum.p ... 11902&extra=&page=1
《8051U深度入门到32位51大型实战教学视频》发表学习心得 七集 以上,赠送 超级强大的 Ai8051U实验箱,并保证会持续到15集课程以后可做:USB声卡,各种USB教学设备,音频播放器,示波器,FFT频谱分析仪, AI手写计算器100万套 Ai8051U-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】
页:
1
[2]