芯LYS 发表于 2024-11-29 16:43:20

《8051U深度入门到32位51大型实战教学视频》之学习打卡

第三集已学习,已手敲代码,测试通过
学习打卡点灯 8个灯成功点亮 (分号要英文格式,否则编译不通过)






第四集 成功实现USB不停电下载,跟着冲哥步骤 添加库函数、添加USB库文件。
USB库文件操作好之后   注意都勾选    然后 先用普通下载,之后可以实现不停地下载






第五集 C语言基础 ,已手敲代码测试通过
串口发送 选择一致的串口号 否则无法发送接收

运算符的用法




第六集 while()用法,I/O口输入输出 学习打卡 手敲代码   
按键输入检测,抖动的解决办法:延时20ms消去抖动if(按键是否按下)


下载软件里的 软件延时计算器方便快捷 ;
注意调用的头文件以免编译出错



第七集 定时器中断 学习手敲代码
任务二灯按下三秒后熄灭


任务3 救护车灯控 灯按下 等交替闪烁再按两个灯熄灭。
用“定时器计算器”的小工具, 右下角的 “使能定时器中断 ”注意要勾选,不然就少了一条语句,按键后无反应的原因。




第八集跟着冲哥学习手敲代码, 用一个定时器实现任务一LED1实现 0.3秒取反一次、 LED2实现 0.6秒取反一次、 LED1实现 0.9秒取反一次




for 和数组的应用
任务2:数组点亮LED,实现流水灯。代码





第九集 数码管    用官方下载软件里的工具窗口里的字库生成工具:



第十一集 矩阵按键 学习手敲代码

















芯LYS 发表于 2025-1-13 17:27:05

第十二集   复位系统   学习手敲代码
硬件复位和软件复位







芯LYS 发表于 2025-1-21 16:52:45

第十三集 中断系统,已手敲代码,测试通过

当按下外部中断INT1/P33, LED01显示取反




主程序代码:

#include "config.h"
#include "task.h"
#include "io.h"



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)
{
      Sys_init();                                                                                 
      usb_init();                                    

    IE2 |= 0x80;                                    
      Timer0_Init();                                                                        
         INT1_Init();         
    EA = 1;                                                                                       
      
      P40 = 0;
      
      while (DeviceState != DEVSTATE_CONFIGURED);      
      //WDT_CONTR = 0x24;      
      
      while(1)
      {
               
      if (bUsbOutReady)                                                         
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   
                        
            usb_OUT_done();                                                         
      }
      //      Task_Pro_Handler_Callback();                                 

         
      // WDT_CONTR = 0x34;    //Çå¿Õ¿´ÃŹ·
      
      P00 = !P00;
      Delay3000ms();
      
      //if(P33 == 0)
      //P01 = !P01;
      }
}



void Timer0_Isr(void) interrupt 1               
{

      Task_Marks_Handler_Callback();                                       

}


测试视频

代码


芯LYS 发表于 2025-1-23 14:56:20

第十四集 I/O中断

中断号大于31在Keil 中编译出错的 方法:中断号拓展工具 。下载后解压 安装到Keil 的安装目录里
下载链接:https://www.stcaimcu.com/data/download/Tools/%E6%8B%93%E5%B1%95Keil%E7%9A%84C%E4%BB%A3%E7%A0%81%E4%B8%AD%E6%96%AD%E5%8F%B7.zip

学习手敲代码 测试通过


主程序 代码:增加P3_IO_Init();   // IO中断初始化
io.c 代码:增加

void P3_IO_Init(void)
{
                        P3IM0 = 0X00;       //中断模式设置为下降沿
                        P3IM1 = 0X00;
                       
                        P3INTE = 0X08;//打开中断
}
void P3_IO_ISR(void)interrupt 40
{
                        u8 intf;
                        intf = P3INTF;
                       
                        if( intf )    //判断有没有IO出发中断
                {
                        P3INTF = 0;
                        if(intf & 0x08 )   
                        {
                       P01 = !P01;
                        }
                }
}








芯LYS 发表于 2025-1-24 14:13:15

第十五集 定时器做计数器学习手敲代码 测试成功

1.

2. tim.c 代码

#include "tim.h"

u32 Count_T1 = 0;

void TIM1_Count_Init(void)
{
   T1_CT = 1;
         T1_M1 = 0;
         T1_M0 = 0;
         T1_GATE = 0;
         
         TH1 = (65536-Count_num)>>8;
         TL1 = (65536-Count_num);
         
             P3PU |= 0x20;    //内部4.1K上拉电阻打开

         TR1 = 1;//启动定时器1
         ET1 = 1;//打开定时器外部中断

}

void Timer1_Isr(void) interrupt 3                //1MS执行一次
{
         Count_T1 ++;   

}

void T1_RunTask(void)
{
    u32 count_th_t1 = 0;
                count_th_t1 = ((u16)TH1 << 8) + (u16)TL1;
                count_th_t1 -= 65526;
               
   SEG7_ShowLong(Count_T1*Count_num+count_th_t1,10);
         
}


3.完成视频




4.任务二   定时器1 测量INT1引脚低电平脉冲宽度代码



tim.c 代码
#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);

}



芯LYS 发表于 2025-2-14 10:16:19

打卡 第十六集串口的简单应用


2.
usart.c 代码:


#include "usart.h"
#include "io.h"

u8 Rec_Dat;
u8 Rec_Num = 0;
bitB_TX2_Busy = 0;

void Uart2_Isr(void) interrupt 8
{
        if (S2CON & 0x02)       
        {
                S2CON &= ~0x02;       
               B_TX2_Busy = 0;
        }
        if (S2CON & 0x01)       
        {
                S2CON &= ~0x01;       
               
                Rec_Dat = S2BUF;
        }
}

void Uart2_Init(void)        //9600bps@24.000MHz
{

P_SW2 |= 0x01;                                                //UART2/USART2: RxD2(P4.6), TxD2(P4.7)

        S2CON = 0x50;               
        AUXR |= 0x04;               
        T2L = 0x8F;               
        T2H = 0xFD;                       
        AUXR |= 0x10;               
        IE2 |= 0x01;               
       
        Rec_Num = 0;
       B_TX2_Busy = 0;
}

void Uart2_SendStr(u8 *puts)

{

    for (; *puts != 0;puts++)      
    {
      S2BUF = *puts;
      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') )
                               {

                                     passward = 16;
                                     passward = 16;
                                     passward = 16;
                                     passward = 16;
                                               Uart2_SendStr( "打开成功\r\n");
                                }
                               else if( (Rec_Dat == 'C') &&(Rec_Dat == 'L') &&(Rec_Dat == 'O') &&(Rec_Dat == 'S') &&(Rec_Dat == 'E') )
                               {
                             passward = 17;
                                     passward = 17;
                                     passward = 17;
                                     passward = 17;
                               Uart2_SendStr( "关闭成功\r\n");
                                }
                  Rec_Num = 0;
                                }
                        }
}


3.串口2发送字符串函数    puts:字符串指针

void Uart2_SendStr(u8 *puts)

{

    for (; *puts != 0;puts++)   //遇到停止符0结束
    {
      S2BUF = *puts;
      B_TX2_Busy = 1;
      while(B_TX2_Busy);
    }

}

4.串口2接收成功




页: [1]
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》之学习打卡