AI-32位8051 发表于 2024-12-1 21:41:26

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

2024.11.26学习打卡心得,期待持续更新!会紧跟冲哥学习步伐:
第一集:8051U强在哪里
1.屏幕显示和视频播放(flash编程器)
2.IIS录放音
3.PWM DMA
4.频谱分析仪(上位机)
5.手写计算器
6.QSPI,PWM移相,硬件乘除,单精度浮点AI8051U强大的外

第二集:AI8051U实验箱丰富的硬件外设功能一一介绍,并将相关软件和工具手把手介绍(KEIL软件、添加头文件、下载代码 包和手册、下载ISP软件、下载插件)
第三集:点亮LED,进展很顺利








AI-32位8051 发表于 2024-12-1 21:43:24

第四集:USB不停电下载 ===错误频出,空格漏加、用错括号,最终也实现了USB不停电下载功能



补充:【USB 下载方法 一,P3.2 按键,再结合停电上电 进自带USB直接下载】
1、按下板子上的 P3.2/INT0 按键,就是 P3.2 接地
2、给目标芯片重新上电,不管之前是否已通电。
---电子开关是按下停电后, 再松开就是上电
    等待电脑端 ISP 下载软件中自动识别出“(HID1) USB Writer”后,
   就与 P3.2 状态无关了,这时可以松开 P3.2 按键
   (P3.2 在用户程序区可做其它任意用途)
---传统的机械自锁紧开关是按上来停电,按下去是上电
3,点击电脑端下载软件中的【下载/编程】按钮
   (注意:USB 下载与串口下载的操作顺序不同)

下载进行中,几秒钟后,提示下载成功!

【USB 下载方法 二,复位管脚低电平复位, 进自带USB直接下载】
USB 连接好并已上电的情况下,外部按键复位也可进入 USB 下载模式,
注意:P4.7-nRST 出厂时默认是 P4.7-I/0 功能,
要改为复位功能,需 ISP 烧录时取消 设置复位脚用作 I/0口,停电一次再上电才生效,
程序区中用户程序也可改为复位脚或 I/0,这个立即生效。
1,按下 P4.7-nRST 外接的低电平复位按键复位 MCU,松开复位键,
MCU从系统程序区启动,判断是否要下载用户程序,
等待电脑端 ISP 下载软件中自动识别出“(HID1)USB writer”后
2,点击电脑端下载软件中的【下载/编程】按钮下载进行中,

几秒钟后,提示下载成功!

【USB 下载方法 三,从用户程序区软复位到系统区下载】
USB 连接好并已上电的情况下,
从用户程序区软复位到系统区也可进入 USB 下载模式
1,在用户程序区运行软复位到系统区的程序,
   就是IAP CONTR 寄存器送 60H。
   等待电脑端 ISP 下载软件中自动识别出“(HID1) USB Writer”后
2,点击电脑端下载软件中的【下载/编程】按钮
   
   下载进行中,几秒钟后,提示下载成功!



AI-32位8051 发表于 2024-12-1 21:48:15

第五集C语言基础,冲哥讲的很务实!哈哈,手敲代码,测试通过



AI-32位8051 发表于 2024-12-1 21:50:29

本帖最后由 AI-32位8051 于 2024-12-1 21:54 编辑

]跟着冲哥打卡第六集:IO口输入输出,已手敲代码,测试通过


354354


AI-32位8051 发表于 2024-12-4 00:09:36

第7集定时器中断已学习 已手敲代码,测试通过




AI-32位8051 发表于 2024-12-10 22:39:05

第8集 定时器周期性调度任务
任务一:用一个定时器实现: LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3实现0.9秒取反一次


任务二:数组点亮LED,实现流水灯




任务3:按键1按一下,LED通过数组移动一下 手敲代码,成功实现。








AI-32位8051 发表于 2024-12-21 00:01:09

第九集 :数码管
任务一:数码管静态的显示一个数字



任务二:数码管显示数字 1-8 8个数字




任务三:数码管显示00-00-00分别代表时分秒,每过一秒钟秒+1


任务四:虚拟显示——LED和数码管
















AI-32位8051 发表于 2024-12-27 22:10:45

第十集 虚拟LED数码管,已手敲代码
任务1: P2口流水灯,P10闪烁


#include "io.h"

u8 State1 = 0;                              //LED1初始状态
u8 State2 = 0;                              //LED2初始状态      
u8 State3 = 0;                              //LED3初始状态
u16 Key_Vol = 0;                        //按键按下持续时间

void LED0_Blink(void)
{
      State1 = !State1;
      P00 = State1;      
}

void LED1_Blink(void)
{
      State2 = !State2;
      P01 = State2;
}

void LED2_Blink(void)
{
      State3 = !State3;
      P02 = State3;
}

void KEY_Task(void)
{
      if( P32 == 0 )
      {
                Key_Vol++;
                if(Key_Vol==5)
                {
                //按键按下的任务
                        printf("按键单击\r\n");
                }
      }
      else
      {
                Key_Vol = 0;
      }
}

u8 P2_STATE = 0x01;
u8 P10_STATE = 0;

//任务1:P2口流水灯,P10闪烁
void TASK_1(void)
{
//-----------      p2端口流水灯-----------
      LED40_SetPort(2,~P2_STATE);                                        //点亮P20端口
      
      P2_STATE = (P2_STATE<<1);
      if(P2_STATE == 0)
         P2_STATE = 1;
//-----------   P10闪烁--------------
      if(P10_STATE == 0)
                LED40_SetBit(1,0);
      else
                LED40_ClrBit(1,0);
      
      P10_STATE = !P10_STATE;      
}

任务2:左边数码管显示P32按下次数,右边数码管显示P33按下次数



#include "io.h"

u8 State1 = 0;                              //LED1初始状态
u8 State2 = 0;                              //LED2初始状态      
u8 State3 = 0;                              //LED3初始状态

u16 Key_Vol;                        //按键按下持续时间
u16 Key_Vol_2;                        //按键按下持续时间

void LED0_Blink(void)
{
      State1 = !State1;
      P00 = State1;      
}

void LED1_Blink(void)
{
      State2 = !State2;
      P01 = State2;
}

void LED2_Blink(void)
{
      State3 = !State3;
      P02 = State3;
}

u16 KEY1_COUNT = 0;                              //P32按钮计数
u16 KEY2_COUNT = 0;

void KEY_Task(void)
{
//----------P32按钮计数----------
      if( P32 == 0 )
      {
                Key_Vol++;
                if(Key_Vol==5)
                {
                        KEY1_COUNT++;
                }
      }
      else
      {
                Key_Vol = 0;
      }
//----------P33按钮计数----------
                if( P33 == 0 )
      {
                Key_Vol_2++;
                if(Key_Vol_2==5)
                {
                        KEY2_COUNT++;
                }
      }
      else
      {
                Key_Vol_2 = 0;
      }
}

u8 P2_STATE = 0x01;
u8 P10_STATE = 0;

//任务1:P2口流水灯,P10闪烁
void TASK_1(void)
{
//-----------      p2端口流水灯-----------
      LED40_SetPort(2,~P2_STATE);                                        //点亮P20端口
      
      P2_STATE = (P2_STATE<<1);
      if(P2_STATE == 0)
         P2_STATE = 1;
//-----------   P10闪烁--------------
      if(P10_STATE == 0)
                LED40_SetBit(1,0);
      else
                LED40_ClrBit(1,0);
      
      P10_STATE = !P10_STATE;      
}
u32 KEY_Count = 0;

任务3:按下数字按键在数码管显示对应的按键数字



#include "io.h"

u8 State1 = 0;                              //LED1初始状态
u8 State2 = 0;                              //LED2初始状态      
u8 State3 = 0;                              //LED3初始状态

u16 Key_Vol;                        //按键按下持续时间
u16 Key_Vol_2;                        //按键按下持续时间

void LED0_Blink(void)
{
      State1 = !State1;
      P00 = State1;      
}

void LED1_Blink(void)
{
      State2 = !State2;
      P01 = State2;
}

void LED2_Blink(void)
{
      State3 = !State3;
      P02 = State3;
}

u16 KEY1_COUNT = 0;                              //P32按钮计数
u16 KEY2_COUNT = 0;

void KEY_Task(void)
{
//----------P32按钮计数----------
      if( P32 == 0 )
      {
                Key_Vol++;
                if(Key_Vol==5)
                {
                        KEY1_COUNT++;
                }
      }
      else
      {
                Key_Vol = 0;
      }
//----------P33按钮计数----------
                if( P33 == 0 )
      {
                Key_Vol_2++;
                if(Key_Vol_2==5)
                {
                        KEY2_COUNT++;
                }
      }
      else
      {
                Key_Vol_2 = 0;
      }
}

u8 P2_STATE = 0x01;
u8 P10_STATE = 0;
//任务1:P2口流水灯,P10闪烁
void TASK_1(void)
{
//-----------      p2端口流水灯-----------
      LED40_SetPort(2,~P2_STATE);                                        //点亮P20端口
      
      P2_STATE = (P2_STATE<<1);
      if(P2_STATE == 0)
         P2_STATE = 1;
//-----------   P10闪烁--------------
      if(P10_STATE == 0)
                LED40_SetBit(1,0);
      else
                LED40_ClrBit(1,0);
      
      P10_STATE = !P10_STATE;      
}

u32 KEY_Count = 0;
//任务2:左边数码管显示P32按下次数,右边数码管显示P33按下次数
void TASK_2(void)
{
      KEY_Count = KEY1_COUNT *10000+KEY2_COUNT;
      
      SEG7_ShowLong( KEY_Count,10 );
}

u32 REC_NUM = 0;


//任务3:按下数字按键在数码管显示对应的按键数字
void TASK_3(void)
{
                SEG7_ShowLong( REC_NUM,10 );
}


AI-32位8051 发表于 2025-1-18 00:03:34

第十二集   复位系统任务一 硬件复位-看门狗程序

代码如下:

[*]#include "config.h"
[*]#include "task.h"
[*]#include "io.h"
[*]
[*]char *USER_DEVICEDESC = NULL;
[*]char *USER_PRODUCTDESC = NULL;
[*]char *USER_STCISPCMD = "@STCISP#";
[*]
[*]void main(void)
[*]{
[*]
[*]      Sys_int();                                                                                 //系统初始化
[*]      usb_init();                                    //USB CDC 接口配置
[*]
[*]    IE2 |= 0x80;                                                                         //使能USB中断
[*]      Timer0_Init();                                                                        //定时器初始化
[*]    Init_595();
[*]      EA = 1;                                                                                        //IE |= 0X80;
[*]
[*]      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                                                //1MS执行一次
[*]{
[*]      Task_Marks_Handler_Callback();                                                //系统计时
[*]}

AI-32位8051 发表于 2025-1-24 17:10:04

第十三集外部中断

#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();
    Init_595();      
      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();
               
      }
}


void Timer0_Isr(void) interrupt 1
{
                Task_Marks_Handler_Callback();
}


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