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 "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
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 "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
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&&y) //如果条件为真,输出什么
{
printf("条件为真\r\n");
}
else
{
printf("条件为假\r\n");
}
usb_OUT_done();
}
//这里面写代码
P40=0;
P0=0x06;
}
}
</code></pre>
fei2568
发表于 2024-12-13 18:56:08
<p>下面代码是实践按钮检测程序的</p>
<pre><code>#include "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#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 = "@STCISP#";
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("flag;%d\r\n",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 "ai8051u.h"<br />
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的<br />
#include "intrins.h"</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 = "@STCISP#";</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 &= 0x7F; //定时器时钟12T模式<br />
TMOD &= 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("count=;%d\r\n",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 "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#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 = "@STCISP#";
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 &= 0x7F; //定时器时钟12T模式
TMOD &= 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("按键按下次数\xfd:%d 次\r\n",(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 "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#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 = "@STCISP#";
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("当前run的状态:\xfd:%d 次\r\n",(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 &= 0x7F; //定时器时钟12T模式
TMOD &= 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 "ai8051u.h"
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的
#include "intrins.h"
#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 = "@STCISP#";
/*************本地常量声明 **************/
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("i:\xfd:%d 次\r\n",i);
}
}
/********************** 显示时钟函数 ************************/
void DisplayRTC(void)
{
if(hh >= 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>60)
{
ss=0;
mm++;
if(mm>60)
{
mm=0;
hh++;
if(hh>24)
{
hh=0;
}
}
}
DisplayRTC();
}
void Timer0_Init(void) //5秒@24.000MHz
{
TM0PS = 0x98; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 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<8; i++)
{
dat <<= 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 >= 8) display_index = 0;//8位结束回0
}
</code></pre>
fei2568
发表于 2024-12-14 19:41:57
<p>今天写了一个时钟程序,不知道为什么闪</p>
<p>#include "ai8051u.h"<br />
#include "stc32_stc8_usb.h"//usb 库文件,和那个stc_usb_cdc_32.LIB文件都是USB库文件,搞那个USB不停电下载时加的<br />
#include "intrins.h"</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 = "@STCISP#";</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("当前run的状态:\xfd:%d 次\r\n",i);
}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1 //1秒中断执行一次<br />
{<br />
ss++;<br />
if(ss>60)<br />
{<br />
ss=0;<br />
mm++;<br />
if(mm>60)<br />
{<br />
mm=0;<br />
hh++;<br />
if(hh>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 &= 0x7F; //定时器时钟12T模式<br />
TMOD &= 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<8; i++)<br />
{<br />
dat <<= 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 >= 8) display_index = 0;//8位结束回0
</code></pre>
<p>}</p>
<p>/********************** 显示时钟函数 ************************/<br />
void DisplayRTC(void)<br />
{<br />
if(hh >= 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>