fei2568 发表于 2024-12-11 12:56:06

<p>今天实践一下USB 不停电下载</p>
<p>下载USB 库函数文件:主页-软件工具-库函数</p>
<p><img src="data/attachment/forum/202412/11/123705s0km6qqk98okqp0p.png" alt="image.png" title="image.png" /></p>
<p>下载下来解压后的样子</p>
<p><img src="data/attachment/forum/202412/11/123741tymzwgdzkny7yl53.png" alt="image.png" title="image.png" /></p>
<p>复制下面文件到程序根目录下,并添加到工程add</p>
<p><img src="data/attachment/forum/202412/11/124328ddgztdtxzdtto02q.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/11/124357s3s0pys3degzpd0r.png" alt="image.png" title="image.png" /></p>
<p>还有一个头文件也要复制过来</p>
<p><img src="data/attachment/forum/202412/11/124524anhbshhxrhonihsh.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/11/124546wz7hx5m5c1xh9cim.png" alt="image.png" title="image.png" /></p>
<p>add添加.lib文件到工程</p>
<p><img src="data/attachment/forum/202412/11/125315qwcw81twc5rc433n.png" alt="image.png" title="image.png" /></p>
<p>include头文件到工程</p>
<p><img src="data/attachment/forum/202412/11/125352zbe0oz3811elnee8.png" alt="image.png" title="image.png" /></p>
<p>复制示例程序里面的代码如下</p>
<p><img src="data/attachment/forum/202412/11/130859x15p245tx1enjzp4.png" alt="image.png" title="image.png" /></p>
<p>搞完有46个警告,不知道为什么</p>
<p>感谢群里国学芯用告诉我冲哥的视频里面讲了(顺便说一句我的实验箱也是这位哥哥给的)</p>
<p><img src="data/attachment/forum/202412/11/132319ot0tztya931taw0w.png" alt="image.png" title="image.png" /></p>
<p>搞定了</p>
<p><img src="data/attachment/forum/202412/11/132343q5v2967pggv2g5pv.png" alt="image.png" title="image.png" /></p>

fei2568 发表于 2024-12-11 18:44:08

<pre><code>
</code></pre>
<p>设置ISP软件进行连接,下面2张图片要对应一致</p>
<p><img src="data/attachment/forum/202412/11/183709i92fxja2v9vmryzv.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/11/183755esotrgiggs155irn.png" alt="image.png" title="image.png" /></p>
<p>就是下载之前向单片机发生一个像密码一样的东西,单片机接收到这个密码之后就会进入这个下载端口</p>
<p>下面的狗狗要都打上</p>
<p><img src="data/attachment/forum/202412/11/184103i44r9mmk2llylkyy.png" alt="image.png" title="image.png" /></p>
<p>这样就不用每次按按钮进行下载了,编译完成直接就可以下载了</p>
<p>实验成功了,最后的代码是这样的</p>
<pre><code>#include &quot;ai8051u.h&quot;
#include &quot;stc32_stc8_usb.h&quot;//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的

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

void main(void)
{

        P_SW2 |= 0x80;

        //下面4行为配置IO口工作模式
        P0M0=0x00;
        P0M1=0x00;
        P4M0=0x00;
        P4M1=0x00;

        usb_init();                                     //USB CDC 接口配置
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置

        while(1)
        {
       
                if (bUsbOutReady)
                {
                        USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                        usb_OUT_done();
                }
       
                //这里面写代码
                P40=0;
                P0=0x00;
        }
}

</code></pre>

fei2568 发表于 2024-12-11 19:23:43

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

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;
int x,y;
void main(void)
{

        P_SW2 |= 0x80;

        //下面4行为配置IO口工作模式
        P0M0=0x00;
        P0M1=0x00;
        P4M0=0x00;
        P4M1=0x00;

        usb_init();                                     //USB CDC 接口配置
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置

        while(1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                        if(x&amp;&amp;y)        //如果条件为真,输出什么
                        {
                                printf(&quot;条件为真\r\n&quot;);
                        }
                        else
                        {
                                printf(&quot;条件为假\r\n&quot;);
                        }
                        usb_OUT_done();
                }
       
                //这里面写代码
                P40=0;
                P0=0x06;
        }
}

</code></pre>

fei2568 发表于 2024-12-13 18:56:08

<p>下面代码是实践按钮检测程序的</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;;


void Delay20ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}

u8 state=0;

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 接口配置

        IE2|=0x80;                                                                                //使能USB中断
        EA = 1;                                                                                        //开总中断吗?
   
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
       

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

                        usb_OUT_done();
                }
       
                //这里面写代码

                if(P33==0)
                {
                        Delay20ms();
                        if(P33==0)
                        {
                                state=!state;
                                printf(&quot;flag;%d\r\n&quot;,state);

                                while(P33==0);
                                P00=state;
                        }
                }

        }
}

</code></pre>

fei2568 发表于 2024-12-14 10:49:33

<p>今天学习第七集的内容,定时器中断,首先炒一下作业(M的学习记录)</p>
<h1>定时器与中断的重要性</h1>
<ul>
<li>引入了定时器的概念,介绍定时器中断的功能</li>
<li>强调定时器中断可以打断当前正在执行的任务,使系统能够在特定的时间内执行其他任务或操作</li>
</ul>
<h1>任务一:LED灯每3秒反转一次,按键打印次数</h1>
<ul>
<li>使用ISP软件生成定时器相关的初始化和中断函数的代码</li>
<li>将生成的代码复制到主程序,并确保正确配置定时器和实现每三秒触发一次中断</li>
<li>在中断服务程序种实现LED状态反转,并通过全局变量统计按键次数,保证按键时间可以在任意时刻被响应</li>
</ul>
<h1>任务二:实现灯按一下点亮三秒后熄灭的功能</h1>
<h1>任务三:实现红蓝灯交替闪烁的救护车警灯功能</h1>
<h1>系统时钟配置</h1>
<p>解释了TM0 PS寄存器的作用,他决定了系统时钟的分频情况</p>
<p>讨论了如何选择适当的分频值来满足不同的计时需求,并计算了实际的定时误差</p>
<h1>函数定义,声明与调用</h1>
<p>介绍了C语言种的函数定义、声明和调用的基本概念</p>
<p>举例说明了如何正确地定义和声明一个延时函数,并演示了其调用的方式</p>

fei2568 发表于 2024-12-14 11:27:43

<p>接下来看视频学习中断</p>
<p>AI8051U共有T0 T1 T2 T3 T4 T11 5个24位定时器</p>
<p><img src="data/attachment/forum/202412/14/105240nwmlscrdvxsj23dq.png" alt="image.png" title="image.png" /></p>
<p>使用ISP 软件生成定时中断的代码</p>
<p><img src="data/attachment/forum/202412/14/110106zm05vzv13m70eqfq.png" alt="image.png" title="image.png" /></p>
<p>下面是利用中断3秒闪一次灯的代码</p>
<p>#include &quot;ai8051u.h&quot;<br />
#include &quot;stc32_stc8_usb.h&quot;//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的<br />
#include &quot;intrins.h&quot;</p>
<p>#define u8 unsigned char                //8位无符号变量(0-255)<br />
#define u16 unsigned int                //16位无符号变量(0-65535)</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>void Delay20ms(void)        //@24.000MHz<br />
{<br />
unsigned long edata i;</p>
<pre><code>_nop_();
_nop_();
i = 119998UL;
while (i) i--;
</code></pre>
<p>}</p>
<p>u8 state=0;<br />
u8 count=0;</p>
<p>void Timer0_Init(void)                //3秒@24.000MHz<br />
{<br />
TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )<br />
AUXR &amp;= 0x7F;                        //定时器时钟12T模式<br />
TMOD &amp;= 0xF0;                        //设置定时器模式<br />
TL0 = 0x3F;                                //设置定时初始值<br />
TH0 = 0x01;                                //设置定时初始值<br />
TF0 = 0;                                //清除TF0标志<br />
TR0 = 1;                                //定时器0开始计时<br />
ET0 = 1;                                //使能定时器0中断<br />
}</p>
<p>void main(void)<br />
{<br />
WTST = 0;                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快<br />
EAXFR = 1;                                                 //扩展寄存器(XFR)访问使能<br />
CKCON = 0;                                                 //提高访问XRAM速度</p>
<pre><code>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;                                                                                        //打开LED灯的总开关
while (1)
{
        if (bUsbOutReady)                                                        //如果接收到了数据
        {
                //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                usb_OUT_done();
        }

        //这里面写代码

        if(P33==0)
        {
                Delay20ms();
                if(P33==0)
                {
                        printf(&quot;count=;%d\r\n&quot;,count);
                        while(P33==0);
                }
        }
}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1                                //3秒中断执行一次<br />
{<br />
state=!state;<br />
P00=state;<br />
count++;<br />
}</p>

fei2568 发表于 2024-12-14 13:06:42

<p>下面代码是按一下3秒后灭的</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;;


void Delay20ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}

u8 state=0;
u8 count=0;




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




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;                                                                                        //打开LED灯的总开关
        while (1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                        usb_OUT_done();
                }
       
                //这里面写代码

                if(P33==0)
                {
                        Delay20ms();
                        if(P33==0)
                        {
                                P00=0;
                                TR0=1;
                                printf(&quot;按键按下次数\xfd:%d 次\r\n&quot;,(int)count);
                                while(P33==0);
                        }
                }
        }
}


void Timer0_Isr(void) interrupt 1                                //3秒中断执行一次
{
        P00=1;
        count++;
        TR0=0;
}

</code></pre>

fei2568 发表于 2024-12-14 13:53:15

<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;;


void Delay20ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}

u8 state=0;
u8 count=0;
u8 run=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;                                                                                        //打开LED灯的总开关
        while (1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                        usb_OUT_done();
                }
       
                //这里面写代码

                if(P33==0)
                {
                        Delay20ms();
                        if(P33==0)
                        {
                                run=!run;
                                if(run==0)
                                {
                                        P00=1;
                                        P01=1;
                                        TR0=0;
                                }
                                else
                                {
                                        P00=0;
                                        P01=1;
                                        TR0=1;
                                        TL0 = 0xDC;                                //设置定时初始值
                                        TH0 = 0x0B;                                //设置定时初始值
                                }
                                printf(&quot;当前run的状态:\xfd:%d 次\r\n&quot;,(int)run);
                                while(P33==0);
                        }
                }
        }
}


void Timer0_Isr(void) interrupt 1                                //3秒中断执行一次
{
        P00=!P00;
        P01=!P01;
}

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

</code></pre>

fei2568 发表于 2024-12-14 19:34:52

<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;;



/*************本地常量声明    **************/
u8 code t_display[]={                     //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black-   H    J    K    L    N    o   P    U   t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码


void Delay20ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}

u16 i=0;
u8 ss=0;
u8 mm=0;
u8 hh=0;
u8LED8;      //显示缓冲
u8display_index;//显示位索引


/*************IO口定义    **************/
sbit    P_HC595_SER   = P3^4;   //pin 14    SER   data input
sbit    P_HC595_RCLK= P3^5;   //pin 12    RCLk    store (latch) clock
sbit    P_HC595_SRCLK = P3^2;   //pin 11    SRCLK   Shift data clock


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

void Send_595(u8 dat);
void DisplayScan(void);
void DisplayRTC(void);

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完成配置


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

                        usb_OUT_done();
                }

                //这里面写代码

                if(P33==0)
                {
                        Delay20ms();
                        if(P33==0)
                        {
                                hh=0;
                                mm=0;
                                ss=0;
                                while(P33==0);
                        }
                }
                if(P32==0)
                {
                        Delay20ms();
                        if(P32==0)
                        {
                                TR0=!TR0;
                                while(P32==0);
                        }
                }
                DisplayScan();
                i++;

                printf(&quot;i:\xfd:%d 次\r\n&quot;,i);
        }
}


/********************** 显示时钟函数 ************************/
void DisplayRTC(void)
{
    if(hh &gt;= 10)LED8 = hh / 10;
    else            LED8 = 0x10;
    LED8 = hh % 10;
    LED8 = 0x11;
    LED8 = mm / 10;
    LED8 = mm % 10;
    LED8 = 0x11;
    LED8 = ss / 10;
    LED8 = ss % 10;
}

void Timer0_Isr(void) interrupt 1                                //1秒中断执行一次
{
        ss++;
        if(ss&gt;60)
        {
                ss=0;
                mm++;
                if(mm&gt;60)
                {
                        mm=0;
                        hh++;
                        if(hh&gt;24)
                        {
                                hh=0;
                        }
                }
        }
        DisplayRTC();
}



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



/**************** 向HC595发送一个字节函数 ******************/
void Send_595(u8 dat)
{
    u8i;
    for(i=0; i&lt;8; i++)
    {
      dat &lt;&lt;= 1;
      P_HC595_SER   = CY;
      P_HC595_SRCLK = 1;
      P_HC595_SRCLK = 0;
    }
}

/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{
    Send_595(t_display]);   //输出段码
    Send_595(~T_COM);            //输出位码

    P_HC595_RCLK = 1;
    P_HC595_RCLK = 0;
    if(++display_index &gt;= 8)    display_index = 0;//8位结束回0
}


</code></pre>

fei2568 发表于 2024-12-14 19:41:57

<p>今天写了一个时钟程序,不知道为什么闪</p>
<p>#include &quot;ai8051u.h&quot;<br />
#include &quot;stc32_stc8_usb.h&quot;//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的<br />
#include &quot;intrins.h&quot;</p>
<p>#define u8 unsigned char                //8位无符号变量(0-255)<br />
#define u16 unsigned int                //16位无符号变量(0-65535)</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>/*************本地常量声明    **************/<br />
u8 code t_display[]={                     //标准字库<br />
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F<br />
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,<br />
//black-   H    J    K    L    N    o   P    U   t    G    Q    r   M    y<br />
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,<br />
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1</p>
<p>u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码</p>
<p>void Delay20ms(void)        //@24.000MHz<br />
{<br />
unsigned long edata i;</p>
<pre><code>_nop_();
_nop_();
i = 119998UL;
while (i) i--;
</code></pre>
<p>}</p>
<p>u16 i=0;<br />
u8 ss=0;<br />
u8 mm=0;<br />
u8 hh=0;<br />
u8LED8;      //显示缓冲<br />
u8display_index;//显示位索引</p>
<p>/*************IO口定义    **************/<br />
sbit    P_HC595_SER   = P3^4;   //pin 14    SER   data input<br />
sbit    P_HC595_RCLK= P3^5;   //pin 12    RCLk    store (latch) clock<br />
sbit    P_HC595_SRCLK = P3^2;   //pin 11    SRCLK   Shift data clock</p>
<p>void Timer0_Init(void);                //500毫秒@24.000MHz</p>
<p>void Send_595(u8 dat);<br />
void DisplayScan(void);<br />
void DisplayRTC(void);</p>
<p>void main(void)<br />
{<br />
WTST = 0;                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快<br />
EAXFR = 1;                                                 //扩展寄存器(XFR)访问使能<br />
CKCON = 0;                                                 //提高访问XRAM速度</p>
<pre><code>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完成配置


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

                usb_OUT_done();
        }

        //这里面写代码

        if(P33==0)
        {
                Delay20ms();
                if(P33==0)
                {
                        hh=0;
                        mm=0;
                        ss=0;
                        while(P33==0);
                }
        }
        if(P32==0)
        {
                Delay20ms();
                if(P32==0)
                {
                        TR0=!TR0;
                        while(P33==0);
                }
        }
        DisplayScan();
        i++;

        printf(&quot;当前run的状态:\xfd:%d 次\r\n&quot;,i);
}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1                                //1秒中断执行一次<br />
{<br />
ss++;<br />
if(ss&gt;60)<br />
{<br />
ss=0;<br />
mm++;<br />
if(mm&gt;60)<br />
{<br />
mm=0;<br />
hh++;<br />
if(hh&gt;24)<br />
{<br />
hh=0;<br />
}<br />
}<br />
}<br />
DisplayRTC();<br />
}</p>
<p>void Timer0_Init(void)                //1秒@24.000MHz<br />
{<br />
TM0PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )<br />
AUXR &amp;= 0x7F;                        //定时器时钟12T模式<br />
TMOD &amp;= 0xF0;                        //设置定时器模式<br />
TL0 = 0xFC;                                //设置定时初始值<br />
TH0 = 0x03;                                //设置定时初始值<br />
TF0 = 0;                                //清除TF0标志<br />
TR0 = 1;                                //定时器0开始计时<br />
ET0 = 1;                                //使能定时器0中断<br />
}</p>
<p>/**************** 向HC595发送一个字节函数 ******************/<br />
void Send_595(u8 dat)<br />
{<br />
u8i;<br />
for(i=0; i&lt;8; i++)<br />
{<br />
dat &lt;&lt;= 1;<br />
P_HC595_SER   = CY;<br />
P_HC595_SRCLK = 1;<br />
P_HC595_SRCLK = 0;<br />
}<br />
}</p>
<p>/********************** 显示扫描函数 ************************/<br />
void DisplayScan(void)<br />
{<br />
Send_595(t_display]);   //输出段码<br />
Send_595(~T_COM);            //输出位码</p>
<pre><code>P_HC595_RCLK = 1;
P_HC595_RCLK = 0;
if(++display_index &gt;= 8)    display_index = 0;//8位结束回0
</code></pre>
<p>}</p>
<p>/********************** 显示时钟函数 ************************/<br />
void DisplayRTC(void)<br />
{<br />
if(hh &gt;= 10)LED8 = hh / 10;<br />
else            LED8 = 0x10;<br />
LED8 = hh % 10;<br />
LED8 = 0x11;<br />
LED8 = mm / 10;<br />
LED8 = mm % 10;<br />
LED8 = 0x11;<br />
LED8 = ss / 10;<br />
LED8 = ss % 10;<br />
}</p>
页: 1 2 3 [4] 5 6 7 8 9
查看完整版本: 8051U实验箱学习记录 | 学习打卡典范