阿巴拉契亚 发表于 2025-1-13 10:37:09

第十二集 复位系统,已手敲代码,测试通过。


任务一:编写看门狗程序
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-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】







阿巴拉契亚 发表于 2025-1-21 16:15:17

第十三集 外部中断,已手敲代码,测试通过。



任务:编写外部中断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-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】







阿巴拉契亚 发表于 2025-1-23 11:18:16

第十四集 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-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】









阿巴拉契亚 发表于 2025-1-24 14:33:07

第十五集 定时器做计数器,已手敲代码,测试通过。


任务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-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】







阿巴拉契亚 发表于 2025-2-5 11:37:12

第十七集 串口的简单应用,已手敲代码,测试通过

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-实验箱,等您在本坛学习打卡区,发表学习感悟后,【免费 + 包邮 送】









阿巴拉契亚 发表于 2025-3-10 13:37:48

第十八集 串口的高级应用,已手敲代码,测试通过

任务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]
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》学习心路历程