vb2002
发表于 2024-12-15 17:38:20
zhaoye818 发表于 2024-12-15 16:03
必须点赞
感谢支持
vb2002
发表于 2024-12-15 18:09:42
哈哈哈,功德马上就圆满了
定时器中断 小练,功德做出来了. 现在功能上面没问题了. 可以正常,接下来晚点有时间把亮灯的也完成,
#include "ai8051u.h" //头文件
#include "stc32_stc8_usb.h" //不停电下载头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
#define MAIN_Fosc 11059200UL
#define BRT (65536 - (MAIN_Fosc / 115200+2)/4)
sbit key=P3^2;
sbit key1=P3^3;
sbit led=P2^0;
sbit led1=P2^1;
bit state=0;
bit run_state=0; //运行状态
bit gd_state=0; //功德状态10
void Timer0_Init(void);
void delayms(u8 ms);
void main(void)
{
u8 count;
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(key==0)
{
delayms(20);
if(key==0)
{
gd_state=!gd_state;
if(gd_state==1)
{
printf("两倍功德时间\r");
}
else
{
printf("功德时间\r");
}
while(key==0);
}
}
if(key1==0)
{
delayms(20);
if(key1==0)
{
if(gd_state==1)
{
count+=2;
printf("功德+2 当前功德:%bu\r\n",count);
}
else
{
count++;
printf("功德+1 当前功德:%bu\r\n",count);
}
}
while(key1==0);
}
}
}
void Timer0_Isr(void) interrupt 1
{
state=!state;
led=state;
led1=!state;
TR0=1;
}
void Timer0_Init(void) //50毫秒@11.0592MHz
{
TM0PS = 0x08; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x10; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void delayms(u8 ms)
{u16 i;
do{
i = MAIN_Fosc /10002;
while(--i);
} while(--ms);
}
vb2002
发表于 2024-12-15 20:46:23
第七集 定时器中断,小练 ,功德箱
总算是功德圆满了.定时器中断哪里用了笨办法.
#include "ai8051u.h" //头文件
#include "stc32_stc8_usb.h" //不停电下载头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
#define MAIN_Fosc 11059200UL
#define BRT (65536 - (MAIN_Fosc / 115200+2)/4)
sbit key=P3^2;
sbit key1=P3^3;
sbit led=P2^0;
sbit led1=P2^1;
bit state=0;
bit run_state=0; //运行状态
bit gd_state=0; //功德状态10
u8 gd_time;
void Timer0_Init(void);
void delayms(u8 ms);
void main(void)
{
u8 count;
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(key==0)
{
delayms(20);
if(key==0)
{
gd_state=!gd_state;
if(gd_state==1)
{
printf("两倍功德时间\r");
}
else
{
printf("功德时间\r");
}
while(key==0);
}
}
if(key1==0)
{
delayms(20);
if(key1==0)
{
if(gd_state==1)
{
count+=2;
Timer0_Init();
printf("功德+2 当前功德:%bu\r\n",count);
}
else
{
count++;
Timer0_Init();
printf("功德+1 当前功德:%bu\r\n",count);
}
}
while(key1==0);
}
}
}
void Timer0_Isr(void) interrupt 1
{
led=0;
gd_time++;
if(gd_state==0)
{
if(gd_time==20)
{
led=1;
TR0 = 0;
gd_time=0;
}
}
if(gd_state==1)
{
if(gd_time==40)
{
led=1;
TR0 = 0;
gd_time=0;
}
}
}
void Timer0_Init(void) //50毫秒@11.0592MHz
{
TM0PS = 0x08; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x10; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void delayms(u8 ms)
{u16 i;
do{
i = MAIN_Fosc /10002;
while(--i);
} while(--ms);
}
vb2002
发表于 2024-12-16 10:32:25
<p>第八集,定时器周期性调度任务</p>
<p>排错,注意代码里面的中英文符号.</p>
<p>括号的排错,整齐对应相应的括号,方便查看</p>
<p><img src="data/attachment/forum/202412/16/103106be3md7jz0jm9mb30.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/16/103221o5zakh55ff57cc99.png" alt="image.png" title="image.png" /></p>
vb2002
发表于 2024-12-16 10:46:59
<p>任务一300,600,900毫秒取反led1,2,3,</p>
<p>通过三个变量,在定时器中断里面分别控制三个计时,达到led不同闪烁</p>
<p>#include "ai8051u.h" //头文件<br />
#include "stc32_stc8_usb.h" //不停电下载头文件</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = "@STCISP#";<br />
#define MAIN_Fosc 24000000UL<br />
#define BRT (65536 - (MAIN_Fosc / 115200+2)/4)<br />
sbit key=P3^2;<br />
sbit key1=P3^3;<br />
sbit led1=P2^0;<br />
sbit led2=P2^1;<br />
sbit led3=P2^2;<br />
bit state1=0; //led1状态<br />
bit state2=0;<br />
bit state3=0;<br />
bit run_state=0; //运行状态<br />
u8 count_300;<br />
u8 count_600;<br />
u8 count_900;</p>
<p>void Timer0_Init(void);<br />
void delayms(u8 ms);</p>
<p>void main(void)<br />
{</p>
<pre><code>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)
{
</code></pre>
<p>// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)</p>
<pre><code> 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;
}
}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1<br />
{<br />
count_300++;<br />
count_600++;<br />
count_900++;</p>
<p>}</p>
<p>void Timer0_Init(void) //10毫秒@24.000MHz<br />
{<br />
TM0PS = 0x03; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )<br />
AUXR |= 0x80; //定时器时钟1T模式<br />
TMOD &= 0xF0; //设置定时器模式<br />
TL0 = 0xA0; //设置定时初始值<br />
TH0 = 0x15; //设置定时初始值<br />
TF0 = 0; //清除TF0标志<br />
TR0 = 1; //定时器0开始计时<br />
ET0 = 1; //使能定时器0中断<br />
}</p>
<p>void delayms(u8 ms)<br />
{u16 i;<br />
do{<br />
i = MAIN_Fosc /10002;<br />
while(--i);<br />
} while(--ms);<br />
}</p>
vb2002
发表于 2024-12-16 11:43:18
<p>数组的应用,</p>
<p>state={1,2,3,4,5};</p>
<p>printf("state3\r"n,state);</p>
<p>修改数组中的某一个变量</p>
<p>state= 66;</p>
<p>再次打印state,就变成66了.</p>
<p>接上次count_300,600,900</p>
<p>u8 count={0,0,0};</p>
<p>for循环的应用</p>
<p>for(i=0;i<3;i++)</p>
<p>{</p>
<p>count_ms++;</p>
<p>if(count_ms>300)</p>
<p>{</p>
<p>count_ms=0;</p>
<p>}</p>
<p>}</p>
vb2002
发表于 2024-12-16 12:22:30
<p>开始讲到模块化了. 好好学.</p>
<p>可以让以后的变成界面看起来简洁,没有那么凌乱</p>
<p>以后所有的功能模块都可以在模块里面实现</p>
<p><img src="data/attachment/forum/202412/16/120344pb11b5r5elt1505v.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/16/122134b6znr41rykbobobw.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/16/122148cte0cumut40it05q.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/16/122200yv0qyxci26se0iis.png" alt="image.png" title="image.png" /></p>
vb2002
发表于 2024-12-16 12:44:51
<p>第八集重点内容结构体</p>
<p>一次两次没看懂,多看几遍把.有点绕</p>
<p><img src="data/attachment/forum/202412/16/122454ttm3rm88gfbf23t1.png" alt="image.png" title="image.png" /></p>
vb2002
发表于 2024-12-16 14:05:12
<p>定时器周期性调度任务已经实现了</p>
<p>但是其中的原理没有搞懂.</p>
<p>暂时就当一个固定格式的程序使用先</p>
<p>慢慢的照猫画虎</p>
<p><img src="data/attachment/forum/202412/16/140503xid0eee4664m6iei.png" alt="image.png" title="image.png" /></p>
vb2002
发表于 2024-12-16 14:26:18
<p>8个led 开始分别按照设定的不同时间开始闪烁.</p>
<p>任务调度确实是比一个一个设置方便多了</p>
<p>然后原理没有搞懂, 但是按照这个方法,已经会弄了.</p>
<p>加油</p>
<p><img src="data/attachment/forum/202412/16/142358r8ozz347p1sqm7q7.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/16/142415z77ng6gzg89zu9b9.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/16/142430z6ayazuwas8ammaz.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/16/142449x0zi67721i1s8287.png" alt="image.png" title="image.png" /></p>