找回密码
 立即注册
楼主: vb2002

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-15 17:38:20 | 显示全部楼层

感谢支持
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-15 18:09:42 | 显示全部楼层

哈哈哈,功德马上就圆满了

定时器中断 小练,功德做出来了. 现在功能上面没问题了. 可以正常,接下来晚点有时间把亮灯的也完成,

截图202412151809212011.jpg


  1. #include "ai8051u.h"                        //头文件
  2. #include "stc32_stc8_usb.h"                //不停电下载头文件
  3. char *USER_DEVICEDESC = NULL;
  4. char *USER_PRODUCTDESC = NULL;
  5. char *USER_STCISPCMD = "@STCISP#";
  6. #define MAIN_Fosc 11059200UL
  7. #define BRT         (65536 - (MAIN_Fosc / 115200+2)/4)
  8. sbit key=P3^2;
  9. sbit key1=P3^3;
  10. sbit led=P2^0;
  11. sbit led1=P2^1;
  12. bit state=0;
  13. bit run_state=0;                        //运行状态
  14. bit gd_state=0;                        //功德状态10
  15. void Timer0_Init(void);
  16. void delayms(u8 ms);
  17. void main(void)
  18. {
  19.         u8 count;
  20.        
  21.     WTST = 0;                                                    //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  22.     EAXFR = 1;                                                   //扩展寄存器(XFR)访问使能
  23.     CKCON = 0;                                                   //提高访问XRAM速度
  24.        
  25.     P2M1 = 0x00;   P2M0 = 0x00;
  26.     P3M1 = 0x00;   P3M0 = 0x00;
  27.     P5M1 = 0x00;   P5M0 = 0x00;
  28.     usb_init();                                      //USB CDC 接口配置
  29.        
  30. //    Timer0_Init();
  31.        
  32.     IE2 |= 0x80;                                     //使能USB中断
  33.     EA = 1;                                                                 //打开总中断 IE|=0x80;
  34.        
  35.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  36.        
  37.         while(1)
  38.         {
  39.                
  40.         if (bUsbOutReady)
  41.         {
  42. //            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  43.             
  44.             usb_OUT_done();
  45.         }
  46.           if(key==0)
  47.           {
  48.           delayms(20);
  49.                   if(key==0)
  50.                   {
  51.                         gd_state=!gd_state;
  52.                           
  53.                           if(gd_state==1)
  54.                           {
  55.                           printf("两倍功德时间\r");
  56.                           }
  57.                           else
  58.                           {
  59.                           printf("功德时间\r");  
  60.                           }
  61.                           while(key==0);
  62.                   }
  63.           }         
  64.           if(key1==0)
  65.           {
  66.           delayms(20);
  67.                   if(key1==0)
  68.                   {
  69.                   if(gd_state==1)
  70.                         {
  71.                                 count+=2;
  72.                           printf("功德+2 当前功德:%bu\r\n",count);
  73.                         }
  74.                         else
  75.                         {
  76.                                 count++;
  77.                           printf("功德+1 当前功德:%bu\r\n",count);
  78.                         }
  79.                   }
  80.                     while(key1==0);
  81.           }
  82.           
  83.         }
  84. }
  85. void Timer0_Isr(void) interrupt 1
  86. {
  87.         state=!state;
  88.         led=state;
  89.         led1=!state;
  90.         TR0=1;
  91. }
  92. void Timer0_Init(void)                        //50毫秒@11.0592MHz
  93. {
  94.         TM0PS = 0x08;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  95.         AUXR |= 0x80;                        //定时器时钟1T模式
  96.         TMOD &= 0xF0;                        //设置定时器模式
  97.         TL0 = 0x00;                                //设置定时初始值
  98.         TH0 = 0x10;                                //设置定时初始值
  99.         TF0 = 0;                                //清除TF0标志
  100.         TR0 = 1;                                //定时器0开始计时
  101.         ET0 = 1;                                //使能定时器0中断
  102. }
  103. void delayms(u8 ms)
  104.         {u16 i;
  105.         do{
  106.                 i = MAIN_Fosc /10002;
  107.                 while(--i);
  108.         }                while(--ms);
  109. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-15 20:46:23 | 显示全部楼层
第七集 定时器中断,小练 ,功德箱
总算是功德圆满了.定时器中断哪里用了笨办法.
  1. #include "ai8051u.h"                        //头文件
  2. #include "stc32_stc8_usb.h"                //不停电下载头文件
  3. char *USER_DEVICEDESC = NULL;
  4. char *USER_PRODUCTDESC = NULL;
  5. char *USER_STCISPCMD = "@STCISP#";
  6. #define MAIN_Fosc 11059200UL
  7. #define BRT         (65536 - (MAIN_Fosc / 115200+2)/4)
  8. sbit key=P3^2;
  9. sbit key1=P3^3;
  10. sbit led=P2^0;
  11. sbit led1=P2^1;
  12. bit state=0;
  13. bit run_state=0;                        //运行状态
  14. bit gd_state=0;                        //功德状态10
  15. u8 gd_time;
  16. void Timer0_Init(void);
  17. void delayms(u8 ms);
  18. void main(void)
  19. {
  20.         u8 count;
  21.        
  22.     WTST = 0;                                                    //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  23.     EAXFR = 1;                                                   //扩展寄存器(XFR)访问使能
  24.     CKCON = 0;                                                   //提高访问XRAM速度
  25.        
  26.     P2M1 = 0x00;   P2M0 = 0x00;
  27.     P3M1 = 0x00;   P3M0 = 0x00;
  28.     P5M1 = 0x00;   P5M0 = 0x00;
  29.     usb_init();                                      //USB CDC 接口配置
  30.        
  31. //    Timer0_Init();
  32.        
  33.     IE2 |= 0x80;                                     //使能USB中断
  34.     EA = 1;                                                                 //打开总中断 IE|=0x80;
  35.        
  36.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  37.        
  38.         while(1)
  39.         {
  40.                
  41.         if (bUsbOutReady)
  42.         {
  43. //            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  44.             
  45.             usb_OUT_done();
  46.         }
  47.           if(key==0)
  48.           {
  49.           delayms(20);
  50.                   if(key==0)
  51.                   {
  52.                         gd_state=!gd_state;
  53.                           
  54.                           if(gd_state==1)
  55.                           {
  56.                           printf("两倍功德时间\r");
  57.                           }
  58.                           else
  59.                           {
  60.                           printf("功德时间\r");  
  61.                           }
  62.                           while(key==0);
  63.                   }
  64.           }         
  65.           if(key1==0)
  66.           {
  67.           delayms(20);
  68.                   if(key1==0)
  69.                   {
  70.                   if(gd_state==1)
  71.                         {
  72.                         count+=2;
  73.                         Timer0_Init();       
  74.                           printf("功德+2 当前功德:%bu\r\n",count);
  75.                         }
  76.                         else
  77.                         {
  78.                         count++;
  79.                         Timer0_Init();
  80.                           printf("功德+1 当前功德:%bu\r\n",count);
  81.                         }
  82.                   }
  83.                     while(key1==0);
  84.           }
  85.           
  86.         }
  87. }
  88. void Timer0_Isr(void) interrupt 1
  89. {
  90.       led=0;
  91.         gd_time++;
  92.         if(gd_state==0)
  93.         {
  94.         if(gd_time==20)
  95.         {
  96.         led=1;
  97.         TR0 = 0;
  98.         gd_time=0;       
  99.         }
  100.         }
  101.         if(gd_state==1)
  102.         {
  103.         if(gd_time==40)
  104.         {
  105.         led=1;
  106.         TR0 = 0;
  107.         gd_time=0;       
  108.         }
  109.         }
  110.                
  111. }
  112. void Timer0_Init(void)                        //50毫秒@11.0592MHz
  113. {
  114.         TM0PS = 0x08;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  115.         AUXR |= 0x80;                        //定时器时钟1T模式
  116.         TMOD &= 0xF0;                        //设置定时器模式
  117.         TL0 = 0x00;                                //设置定时初始值
  118.         TH0 = 0x10;                                //设置定时初始值
  119.         TF0 = 0;                                //清除TF0标志
  120.         TR0 = 1;                                //定时器0开始计时
  121.         ET0 = 1;                                //使能定时器0中断
  122. }
  123. void delayms(u8 ms)
  124.         {u16 i;
  125.         do{
  126.                 i = MAIN_Fosc /10002;
  127.                 while(--i);
  128.         }                while(--ms);
  129. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-16 10:32:25 | 显示全部楼层

第八集,定时器周期性调度任务

排错,注意代码里面的中英文符号.

括号的排错,整齐对应相应的括号,方便查看

image.png

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-16 10:46:59 | 显示全部楼层

任务一 300,600,900毫秒取反led1,2,3,

通过三个变量,在定时器中断里面分别控制三个计时,达到led不同闪烁

#include "ai8051u.h" //头文件
#include "stc32_stc8_usb.h" //不停电下载头文件

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
#define MAIN_Fosc 24000000UL
#define BRT (65536 - (MAIN_Fosc / 115200+2)/4)
sbit key=P3^2;
sbit key1=P3^3;
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
bit state1=0; //led1状态
bit state2=0;
bit state3=0;
bit run_state=0; //运行状态
u8 count_300;
u8 count_600;
u8 count_900;

void Timer0_Init(void);
void delayms(u8 ms);

void main(void)
{

WTST = 0;    					        //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1;   					        //扩展寄存器(XFR)访问使能
CKCON = 0;   					        //提高访问XRAM速度

P2M1 = 0x00;   P2M0 = 0x00;
P3M1 = 0x00;   P3M0 = 0x00;
P5M1 = 0x00;   P5M0 = 0x00;

usb_init();                                      //USB CDC 接口配置

Timer0_Init();

IE2 |= 0x80;                                     //使能USB中断
EA = 1;					 			//打开总中断 IE|=0x80;

while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

while(1)
{

    if (bUsbOutReady)
    {

// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

        usb_OUT_done();
    }
if(count_300>=30)
{
count_300=0;
state1=!state1;
led1=state1;
}
if(count_600>=60)
{
count_600=0;
state2=!state2;
led2=state2;
}
if(count_900>=90)
{
count_900=0;
state3=!state3;
led3=state3;
}

  
}

}

void Timer0_Isr(void) interrupt 1
{
count_300++;
count_600++;
count_900++;

}

void Timer0_Init(void) //10毫秒@24.000MHz
{
TM0PS = 0x03; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xA0; //设置定时初始值
TH0 = 0x15; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}

void delayms(u8 ms)
{u16 i;
do{
i = MAIN_Fosc /10002;
while(--i);
} while(--ms);
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-16 11:43:18 | 显示全部楼层

数组的应用,

state[5]={1,2,3,4,5};

printf("state3\r"n,state[3]);

修改数组中的某一个变量

state[3]= 66;

再次打印state[3],就变成66了.

接上次count_300,600,900

u8 count[3]={0,0,0};

for循环的应用

for(i=0;i<3;i++)

{

count_ms[i]++;

if(count_ms[0]>300)

{

count_ms[0]=0;

}

}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-16 12:22:30 | 显示全部楼层

开始讲到模块化了. 好好学.

可以让以后的变成界面看起来简洁,没有那么凌乱

以后所有的功能模块都可以在模块里面实现

image.png

image.png

image.png

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-16 12:44:51 | 显示全部楼层

第八集重点内容结构体

一次两次没看懂,多看几遍把.有点绕

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-16 14:05:12 | 显示全部楼层

定时器周期性调度任务已经实现了

但是其中的原理没有搞懂.

暂时就当一个固定格式的程序使用先

慢慢的照猫画虎

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:355
  • 最近打卡:2025-05-06 00:38:18
已绑定手机

130

主题

1539

回帖

1963

积分

金牌会员

积分
1963
发表于 2024-12-16 14:26:18 | 显示全部楼层

8个led 开始分别按照设定的不同时间开始闪烁.

任务调度确实是比一个一个设置方便多了

然后原理没有搞懂, 但是按照这个方法,已经会弄了.

加油

image.png

image.png

image.png

image.png

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-6 11:19 , Processed in 0.137650 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表