wuzhengmin 发表于 2025-8-14 14:05:02

函数的调用:

wuzhengmin 发表于 2025-8-14 14:06:44

调用的函数没有返回值的情况:https://www.stcaimcu.com/forum.php?mod=image&aid=111844&size=300x300&key=fe78918ae5ed1338&nocache=yes&type=fixnone

wuzhengmin 发表于 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!!!

wuzhengmin 发表于 2025-8-15 08:41:24

第十次:《8051U深度入门到32位51大型实战教学视频》第八集定时器周期性调度任务


摘要

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


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


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


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







wuzhengmin 发表于 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软件版本不一样!




wuzhengmin 发表于 2025-8-15 10:21:03

跟着冲哥,把程序写好了:但是下载后3个LED全亮,是一直亮,哪里错啦?


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

#define u8unsigned 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);
串口也看不到任何信息?奇怪啊?


wuzhengmin 发表于 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!!!
改好了就一切正常!
       
               



wuzhengmin 发表于 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中断
}


wuzhengmin 发表于 2025-8-15 11:21:31

有没有其他方法实现或者说我们的代码可以简单一点?

有:先看数组的概念:

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


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









wuzhengmin 发表于 2025-8-15 12:10:54

数组变量的写入:


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


                       

页: 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17
查看完整版本: 第一次:环境的创立 | 送实验箱