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