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

第一次:环境的创立 | 送实验箱

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-14 14:05:02 | 显示全部楼层
函数的调用:

截图202508141404308062.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-14 14:06:44 | 显示全部楼层
调用的函数没有返回值的情况:
截图202508141406235684.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-14 20:47:25 | 显示全部楼层
上面没有返回值,就写了void 函数末尾也不用谢return

实际上,上面是做了119998次 i--

没有返回值,只是空耗了时间

voidDelay20ms(void);   这是函数声明

Delay20ms();   这是函数调用

课后小练
电子功德箱:
     1.按下按钮1,串口显示“双倍功德时间”,再次按下显示“单倍功德时间”;
      2.按下按键2,双倍功德时间下串口显示“功德+2  当前功德:xxx”;      
      3.按下按键2,单倍功德时间下串口显示“功德+1  当前功德:xxx”;·
4.功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
5.功德+2时,LED点亮2秒后熄灭表示功德成功点亮,


这个感觉有点难,好了,今天就到此为止!88!!!
截图202508142026465724.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-15 08:41:24 | 显示全部楼层
第十次:《8051U深度入门到32位51大型实战教学视频》第八集定时器周期性调度任务


摘要

1.周期性任务介绍
2.文件的创建(.c和.h)
3.结构体的介绍
4.结构体数组的周期性任务调度


实际上从上节课开始就要认真点了,包括作业也不好完成,有点似懂非懂的感觉


1 注意英文字母的大小写问题,实际这个问题比较麻烦,详细可以看看布丁橘长的相关视频,我个人在刚拿到“擎天柱”的时候就发现了这个问题,大小写一定是区分的!
但是在C51的某些情况下,又是不区分的,小心对待.............
2 符号的中文和英文的差别,包括;; ()() 看上去一样,其实一个是中文,一个是英文,差别很大


3 { } 一定是成对出现的。







截图202508150827181909.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-15 09:09:05 | 显示全部楼层
先不管上节课的作业,把新课先听了吧!
任务1:用一个定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6沙取反一次,LED3.0.9秒取反一次

肯定是要用定时器,不过我们只会用一个定时器,现在明显要3个,怎么办?

通过一个变量计数,假设这个变量1ms自加一次,加到300即为300ms,加到600就是600ms;计数到达后重新清0;
数组使用分为如下两步
1.定义
类型 名称[长度] = { 数值 };
2.使用
赋值:名称[索引]= 数值

以后肉眼可见的延时,太占CUP,我们都不用了!全部删掉!
定时器计数器用STC公司的ISP ,产生一个1ms的定时器0函数:

void Timer0_Isr(void) interrupt 1
{
}

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断

}

但是:我和冲哥的相比较缺少下面这行..........
TM0PS = 0x00;                        //设置定时器时钟预分频

why?  难道是默认?毕竟ISP软件版本不一样!




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-15 10:21:03 | 显示全部楼层
跟着冲哥,把程序写好了:但是下载后3个LED全亮,是一直亮,哪里错啦?


#include "ai8051u.h"                        //调用头文件
#include "stc32_stc8_usb.h"                //调用头文件
#include "intrins.h"                        //d调用头文件

#define u8  unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)       
       
u8 State1 = 0;                                        //LED1初始状态
u8 State2 = 0;                                        //LED2初始状态
u8 State3 = 0;                                        //LED3初始状态



u8 Run_State = 0;                                //运行状态




u16 Count_300 = 0 ;            //计数300ms变量
u16 Count_600 = 0 ;            //计数600ms变量
u16 Count_900 = 0 ;            //计数900ms变量

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";


void Timer0_Init(void);  //定时器函数声明

void main(void)
{
        int count=1;                                                                        //按键计数变量
       
    WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
       
        usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
        Timer0_Init();        //定时器初始化                                                                //定时器初始化
       
    EA = 1;                                                                                        //IE |= 0X80;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
       
        while(1)
        {
               
        if (bUsbOutReady)                                                        //如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            printf("状态变量State1: %d  状态变量State2: %d 状态变量State3:  %d \r\n",State1,State2,State3);

            usb_OUT_done();                                                        //
        }
               
               
                if( Count_300++>=300)   //300ms到达!
                {
               
                                Count_300 = 0;
                                State1 = !State1;
                                P00 = State1;
                                               
                }       

                if( Count_600++>=600)   //600ms到达!
                {
               
                                Count_600 = 0;
                                State2 = !State2;
                                P01 = State2;

                                               
                }       

                if( Count_900++>=900)   //900ms到达!
                {
               
                                Count_900 = 0;
                                State3 = !State3;
                                P02 = State3;

                                               
                }       
               
               
        }
}


void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;           //设置定时器时钟预分频
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}




void Timer0_Isr(void) interrupt 1                //1毫秒执行一次
{
       
        Count_300++;
        Count_600++;
        Count_900++;
       

}



想看看哪里的问题,
printf("状态变量State1: %d  状态变量State2: %d 状态变量State3:  %d \r\n",State1,State2,State3);
串口也看不到任何信息?奇怪啊?


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-15 10:33:35 | 显示全部楼层
上面的表述有错,在串口看到3个状态变量,始终是0


所以LED长亮!

Timer0_Init();  //定时器初始化


应该是定时器中断程序没有执行?


void Timer0_Isr(void) interrupt 1                //1毫秒执行一次
{
       
        Count_300++;
        Count_600++;
        Count_900++;
       

}


不对,好像是这里错!


                if( Count_300++>=300)   //300ms到达!
                {
               
                                Count_300 = 0;
                                State1 = !State1;
                                P00 = State1;
                                               
                }       

                if( Count_600++>=600)   //600ms到达!
                {
               
                                Count_600 = 0;
                                State2 = !State2;
                                P01 = State2;

                                               
                }       

                if( Count_900++>=900)   //900ms到达!
                {
               
                                Count_900 = 0;
                                State3 = !State3;
                                P02 = State3;

                                               
                }

Count_300++  应该是Count_300!!!
改好了就一切正常!
       
               



截图202508151022257090.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-15 10:46:41 | 显示全部楼层
把定时器预分屏去掉,也正常:



void Timer0_Init(void)                //1毫秒@24.000MHz
{
        //TM0PS = 0x00;           //设置定时器时钟预分频
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}


截图202508151045458860.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-15 11:21:31 | 显示全部楼层
有没有其他方法实现或者说我们的代码可以简单一点?

有:先看数组的概念:

数组使用分为如下两步
1.定义
类型 名称[长度]={数值];
2.使用
赋值:名称[索引]= 数值15:06/1:23:29
给个例子:
u8 State[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个数组且赋初值
注意我们有关汉字乱码,已经打过补丁,不用加\XFD!!!


                        printf("State数值的第一个数值为: %d",(int)State[0]);









截图202508151052055848.jpg
截图202508151121226394.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2025-08-22 10:12:58
已绑定手机

1

主题

158

回帖

407

积分

中级会员

积分
407
发表于 2025-8-15 12:10:54 | 显示全部楼层
数组变量的写入:


printf("State数值的第一个数值为: %d \r\n",(int)State[0]);
State[0] = 15;
printf("State数值的第一个数值为: %d \r\n",(int)State[0]);


                       

截图202508151210489288.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-24 09:22 , Processed in 0.122322 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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