fei2568 发表于 2024-12-16 12:49:51

<p>上面代码数码管闪的原因找到了,P32是数码管数字芯片595的时钟线</p>
<p>无语了</p>

fei2568 发表于 2024-12-16 18:54:48

<p>第8集 下面代码是周期性调度任务的代码</p>
<p>led1 300ms反转一次;</p>
<p>led2 600ms反转一次;</p>
<p>led3 900ms反转一次;</p>
<pre><code>#include &quot;ai8051u.h&quot;
#include &quot;stc32_stc8_usb.h&quot;//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include &quot;intrins.h&quot;


#define u8 unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;


u16 count_300=0;
u16 count_600=0;
u16 count_900=0;


void Timer0_Init(void);                //500毫秒@24.000MHz


void main(void)
{
        WTST = 0;                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;        //设置为推挽输出
    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 接口配置
        Timer0_Init();                                                                        //定时器初始化
        IE2|=0x80;                                                                                //使能USB中断
        EA = 1;                                                                                        //开总中断吗?

        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
        P40=0;

        while (1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                        usb_OUT_done();
                }
       
                //这里面写代码
                if(count_300&gt;=300)
                {
                        count_300=0;
                        P00=!P00;
                }
                if(count_600&gt;=600)
                {
                        count_600=0;
                        P01=!P01;
                }
                if(count_900&gt;=900)
                {
                        count_900=0;
                        P02=!P02;
                }

        }
}


void Timer0_Isr(void) interrupt 1                                //1m秒中断执行一次
{
        count_300++;
        count_600++;
        count_900++;
}




void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &amp;= 0x7F;                        //定时器时钟12T模式
        TMOD &amp;= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

</code></pre>

fei2568 发表于 2024-12-16 18:56:39

<p>第二部分数组的使用</p>
<p><img src="data/attachment/forum/202412/16/185634k0blyzbyvvc9s9a0.png" alt="image.png" title="image.png" /></p>

fei2568 发表于 2024-12-16 19:04:16

<p>for循环的用法</p>
<pre><code>#include &quot;ai8051u.h&quot;
#include &quot;stc32_stc8_usb.h&quot;//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include &quot;intrins.h&quot;


#define u8 unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;



u16 count[]={0,0,0};

void Timer0_Init(void);                //500毫秒@24.000MHz


void main(void)
{
        WTST = 0;                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;        //设置为推挽输出
    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 接口配置
        Timer0_Init();                                                                        //定时器初始化
        IE2|=0x80;                                                                                //使能USB中断
        EA = 1;                                                                                        //开总中断吗?

        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
        P40=0;

        while (1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                        usb_OUT_done();
                }
       
                //这里面写代码
                if(count&gt;=100)
                {
                        count=0;
                        P00=!P00;
                }
                if(count&gt;=100)
                {
                        count=0;
                        P01=!P01;
                }
                if(count&gt;=500)
                {
                        count=0;
                        P02=!P02;
                }

        }
}


void Timer0_Isr(void) interrupt 1                                //1m秒中断执行一次
{
        u8 i;
        for(i=0;i&lt;3;i++)
        {
                count++;
        }
}




void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &amp;= 0x7F;                        //定时器时钟12T模式
        TMOD &amp;= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

</code></pre>

fei2568 发表于 2024-12-17 13:15:04

<p>下面是流水灯的代码,使用的是数组和中断</p>
<pre><code>/*
led1-7依次点亮
01111111        0x01        0xFE
10111111        0x02        0xFD
11011111        0x04        0xFB
11101111        0x08        0xF7
11110111        0x10        0xEF
11111011        0x20        0xDF
11111101        0x40        0xBF
11111110        0x80        0x7F
*/

#include &quot;ai8051u.h&quot;
#include &quot;stc32_stc8_usb.h&quot;//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include &quot;intrins.h&quot;


#define u8 unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;


u8 i=0;
u8 j=0;
u16 count[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

void Timer0_Init(void);                //500毫秒@24.000MHz


void main(void)
{
        WTST = 0;                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;        //设置为推挽输出
    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 接口配置
        Timer0_Init();                                                                        //定时器初始化
        IE2|=0x80;                                                                                //使能USB中断
        EA = 1;                                                                                        //开总中断吗?

        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
        P40=0;

        while (1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                        usb_OUT_done();
                }
       
                //这里面写代码
                if(i&gt;=100)
                {        i=0;
                        P0=count;
                        j++;
                        if(j&gt;=8)
                        {
                                j=0;
                        }
                }


        }
}


void Timer0_Isr(void) interrupt 1                                //1m秒中断执行一次
{
        i++;
}


void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &amp;= 0x7F;                        //定时器时钟12T模式
        TMOD &amp;= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

</code></pre>

fei2568 发表于 2024-12-17 19:50:26

<pre><code>/*
led1-7依次点亮
01111111        0x01        0xFE
10111111        0x02        0xFD
11011111        0x04        0xFB
11101111        0x08        0xF7
11110111        0x10        0xEF
11111011        0x20        0xDF
11111101        0x40        0xBF
11111110        0x80        0x7F
*/

#include &quot;ai8051u.h&quot;
#include &quot;stc32_stc8_usb.h&quot;//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include &quot;intrins.h&quot;


#define u8 unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;


u8 i=0;
u8 j=0;
u8 k=0;
u8 x=0;

u16 count[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

void Timer0_Init(void);                //500毫秒@24.000MHz


void main(void)
{
        WTST = 0;                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;        //设置为推挽输出
    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 接口配置
        Timer0_Init();                                                                        //定时器初始化
        IE2|=0x80;                                                                                //使能USB中断
        EA = 1;                                                                                        //开总中断吗?

        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
        P40=0;

        while (1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                        usb_OUT_done();
                }
//任务1流水灯每100ms移位一次
                //这里面写代码
//                if(i&gt;=100)
//                {        i=0;
//                        P0=count;
//                        j++;
//                        if(j&gt;=8)
//                        {
//                                j=0;
//                        }
//                }
       
// 任务2,流水灯按一下移位一次
                if(k&gt;=10)                                                        //10ms看一次
                {
                        k=0;
                        if(P33==0)                                                //如果按键按下
                        {       
                                x++;                                                //按键计数加1
                        }
                        else
                        {
                                x=0;                                                //如果没有按下或抖动或抬起,按键计数清0
                        }
                        if(x==6)                                                //如果60ms内全部按下,说明按键就按下了
                        {
                                P0=count;                                //执行代码
                                j++;
                                if(j&gt;=8)
                                {
                                        j=0;
                                }
                        }
                }
        }
}


void Timer0_Isr(void) interrupt 1                                //1m秒中断执行一次
{
        i++;
        k++;
}


void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &amp;= 0x7F;                        //定时器时钟12T模式
        TMOD &amp;= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

</code></pre>

fei2568 发表于 2024-12-20 10:05:22

<p>这个内容之前没有接触到,再加上这几天比较忙,断断续续学了好几天了</p>
<p><img src="data/attachment/forum/202412/20/090826hzcalfaba57ffray.png" alt="image.png" title="image.png" /></p>
<p>1.新建一个config.c和一个config.h的文件</p>
<p><img src="data/attachment/forum/202412/20/091155nl34tx3rlyt9d9lr.png" alt="image.png" title="image.png" /></p>
<p>2.格式</p>
<p>config.h的固定格式为:</p>
<p>#ifndef __XXX_H</p>
<p>#define __XXX_H</p>
<p>调用头文件</p>
<p>函数声明...</p>
<p>#endif</p>
<p>config.c的固定格式为:</p>
<p>#include “xxx.h”</p>
<p>函数定义</p>
<p>3.添加config.c到工程和引用config.h到工程</p>
<p>添加config</p>
<p><img src="data/attachment/forum/202412/20/091936a0tgqyjyrnjkwnk7.png" alt="image.png" title="image.png" /></p>
<p>编译报错没有找到config.h文件</p>
<p>下面引用config.h路径到工程</p>
<p><img src="data/attachment/forum/202412/20/092909yc0o64l7op064qpg.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/20/093037p9fuwwd699z3wwwm.png" alt="image.png" title="image.png" /></p>
<p>再次编译没有报错</p>
<p>4.将原来代码里面的头文件搬移到config.h里面,初始化代码搬移到config.c里面(main函数里面要include.h)</p>
<p>函数定义放config.c里面;函数声明放config.h里面;main函数进行调用</p>
<p><img src="data/attachment/forum/202412/20/100414bt4xmgg6lpllzx6m.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/20/100446u4fcz02f53358zup.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/20/100516xv3ijqznn4bt4jqr.png" alt="image.png" title="image.png" /></p>

fei2568 发表于 2024-12-20 13:38:49

<p>结构体数组的周期性任务调度</p>
<p>0.新建一个task.c和一个task.h,并添加到工程</p>
<p><img src="data/attachment/forum/202412/21/084506nt2pjajqvjiyj4vy.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/21/084551hjocmo4vzx4dpuv4.png" alt="image.png" title="image.png" /></p>
<p>1.task.c</p>
<pre><code>#include &quot;task.h&quot;


static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
    {0, 1,   1,   Sample_Display},      /* task 1 Period: 1ms */
    {0, 10,10,Sample_MatrixKey},    /* task 2 Period: 10ms */
    {0, 10,10,Sample_adcKey},       /* task 3 Period: 10ms */
    {0, 300, 300, Sample_NTC},          /* task 4 Period: 300ms */
    {0, 500, 500, Sample_RTC},          /* task 5 Period: 500ms */
    /* Add new task here */
};

u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);

//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i&lt;Tasks_Max; i++)                                                                                                //循环好几次,几个任务几个循环
    {
      if(Task_Comps.TIMCount)      /* If the time is not 0 */                        //如果计数不为0
      {
            Task_Comps.TIMCount--;   /* Time counter decrement */                //计数减减
            if(Task_Comps.TIMCount == 0) /* If time arrives */                        //如果计数减到0
            {
                /*Resume the timer value and try again */
                Task_Comps.TIMCount = Task_Comps.TRITime;                        //重装计数
                Task_Comps.Run = 1;      /* The task can be run */                //将run置为1
            }
      }
    }
}

//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
    u8 i;
    for(i=0; i&lt;Tasks_Max; i++)                                                                                                //循环好几次,几个任务几个循环
    {
      if(Task_Comps.Run) /* If task can be run */                                                //如果哪个任务的run参数为1
      {
            Task_Comps.Run = 0;      /* Flag clear 0 */                                        //那么就将rin标志清0
            Task_Comps.TaskHook();   /* Run task */                                                //并且执行这个任务的任务
      }
    }
}

</code></pre>
<p>2.task.h</p>
<pre><code>#ifndef __TASK_H
#define __TASK_H

#include &quot;config.h&quot;                        //调用头文件

typedef struct
{
        u8 Run;               //任务状态:Run/Stop
        u16 TIMCount;         //定时计数器
        u16 TRITime;          //重载计数器
        void (*TaskHook) (void); //任务函数

} TASK_COMPONENTS;

void Task_Marks_Handler_Callback(void);
void Task_Pro_Handler_Callback(void);

#endif
</code></pre>
<p>3.中断函数里面进行计数:Task_Marks_Handler_Callback();</p>
<p>main 里面去执行:Task_Pro_Handler_Callback();</p>

fei2568 发表于 2024-12-21 13:11:29

<p>今天学习第九集视频--数码管</p>
<p>主要有下面内容</p>
<p><img src="data/attachment/forum/202412/21/131053hxgxoe69olg0o3xo.png" alt="image.png" title="image.png" /></p>

fei2568 发表于 2024-12-21 14:13:40

<p>ISP软件的字库生成工具,好用</p>
<p><img src="data/attachment/forum/202412/21/141335cyygywmwguydyzrg.png" alt="image.png" title="image.png" /></p>
页: 1 2 3 4 [5] 6 7 8 9
查看完整版本: 8051U实验箱学习记录 | 学习打卡典范