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 &quot;ai8051u.h&quot;                        //头文件<br />
#include &quot;stc32_stc8_usb.h&quot;                //不停电下载头文件</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;<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&gt;=30)
{
count_300=0;
state1=!state1;
led1=state1;
}
if(count_600&gt;=60)
{
count_600=0;
state2=!state2;
led2=state2;
}
if(count_900&gt;=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 &amp;= 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(&quot;state3\r&quot;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&lt;3;i++)</p>
<p>{</p>
<p>count_ms++;</p>
<p>if(count_ms&gt;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>
页: 1 2 [3] 4 5 6
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》学习打卡