《8051U深度入门到32位51大型实战教学视频》学习打卡
2024.11.26学习打卡心得,期待持续更新!会紧跟冲哥学习步伐:第一集:8051U强在哪里
1.屏幕显示和视频播放(flash编程器)
2.IIS录放音
3.PWM DMA
4.频谱分析仪(上位机)
5.手写计算器
6.QSPI,PWM移相,硬件乘除,单精度浮点AI8051U强大的外
第二集:AI8051U实验箱丰富的硬件外设功能一一介绍,并将相关软件和工具手把手介绍(KEIL软件、添加头文件、下载代码 包和手册、下载ISP软件、下载插件)
第三集:点亮LED,进展很顺利
第四集: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,点击电脑端下载软件中的【下载/编程】按钮
下载进行中,几秒钟后,提示下载成功!
第五集C语言基础,冲哥讲的很务实!哈哈,手敲代码,测试通过
本帖最后由 AI-32位8051 于 2024-12-1 21:54 编辑
]跟着冲哥打卡第六集:IO口输入输出,已手敲代码,测试通过
354354
第7集定时器中断已学习 已手敲代码,测试通过
第8集 定时器周期性调度任务
任务一:用一个定时器实现: LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3实现0.9秒取反一次
任务二:数组点亮LED,实现流水灯
任务3:按键1按一下,LED通过数组移动一下 手敲代码,成功实现。
第九集 :数码管
任务一:数码管静态的显示一个数字
任务二:数码管显示数字 1-8 8个数字
任务三:数码管显示00-00-00分别代表时分秒,每过一秒钟秒+1
任务四:虚拟显示——LED和数码管
第十集 虚拟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 );
}
第十二集 复位系统任务一 硬件复位-看门狗程序
代码如下:
[*]#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(); //系统计时
[*]}
第十三集外部中断
#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