找回密码
 立即注册
楼主: fei2568

8051U实验箱学习记录 | 学习打卡典范

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-11 12:56:06 | 显示全部楼层

今天实践一下USB 不停电下载

下载USB 库函数文件:主页-软件工具-库函数

image.png

下载下来解压后的样子

image.png

复制下面文件到程序根目录下,并添加到工程add

image.png

image.png

还有一个头文件也要复制过来

image.png

image.png

add添加.lib文件到工程

image.png

include头文件到工程

image.png

复制示例程序里面的代码如下

image.png

搞完有46个警告,不知道为什么

感谢群里国学芯用告诉我冲哥的视频里面讲了(顺便说一句我的实验箱也是这位哥哥给的)

image.png

搞定了

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-11 18:44:08 | 显示全部楼层

设置ISP软件进行连接,下面2张图片要对应一致

image.png

image.png

就是下载之前向单片机发生一个像密码一样的东西,单片机接收到这个密码之后就会进入这个下载端口

下面的狗狗要都打上

image.png

这样就不用每次按按钮进行下载了,编译完成直接就可以下载了

实验成功了,最后的代码是这样的

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-11 19:23:43 | 显示全部楼层
#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;
	}
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-13 18:56:08 | 显示全部楼层

下面代码是实践按钮检测程序的

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

	}
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-14 10:49:33 | 显示全部楼层

今天学习第七集的内容,定时器中断,首先炒一下作业(M的学习记录)

定时器与中断的重要性

  • 引入了定时器的概念,介绍定时器中断的功能
  • 强调定时器中断可以打断当前正在执行的任务,使系统能够在特定的时间内执行其他任务或操作

任务一:LED灯每3秒反转一次,按键打印次数

  • 使用ISP软件生成定时器相关的初始化和中断函数的代码
  • 将生成的代码复制到主程序,并确保正确配置定时器和实现每三秒触发一次中断
  • 在中断服务程序种实现LED状态反转,并通过全局变量统计按键次数,保证按键时间可以在任意时刻被响应

任务二:实现灯按一下点亮三秒后熄灭的功能

任务三:实现红蓝灯交替闪烁的救护车警灯功能

系统时钟配置

解释了TM0 PS寄存器的作用,他决定了系统时钟的分频情况

讨论了如何选择适当的分频值来满足不同的计时需求,并计算了实际的定时误差

函数定义,声明与调用

介绍了C语言种的函数定义、声明和调用的基本概念

举例说明了如何正确地定义和声明一个延时函数,并演示了其调用的方式

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-14 11:27:43 | 显示全部楼层

接下来看视频学习中断

AI8051U共有T0 T1 T2 T3 T4 T11 5个24位定时器

image.png

使用ISP 软件生成定时中断的代码

image.png

下面是利用中断3秒闪一次灯的代码

#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 = 1; //定时器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)
		{
			printf("count=;%d\r\n",count);
			while(P33==0);
		}
	}
}

}

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-14 13:06:42 | 显示全部楼层

下面代码是按一下3秒后灭的

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-14 13:53:15 | 显示全部楼层
#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中断
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-14 19:34:52 | 显示全部楼层

#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;
u8  LED8[8];        //显示缓冲
u8  display_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[0] = hh / 10;
    else            LED8[0] = 0x10;
    LED8[1] = hh % 10;
    LED8[2] = 0x11;
    LED8[3] = mm / 10;
    LED8[4] = mm % 10;
    LED8[5] = 0x11;
    LED8[6] = ss / 10;
    LED8[7] = 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)
{
    u8  i;
    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[LED8[display_index]]);   //输出段码
    Send_595(~T_COM[display_index]);            //输出位码

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-14 19:41:57 | 显示全部楼层

今天写了一个时钟程序,不知道为什么闪

#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;
u8 LED8[8]; //显示缓冲
u8 display_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(P33==0);
		}
	}
	DisplayScan();
	i++;

	printf("当前run的状态:\xfd:%d 次\r\n",i);
}

}

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

/**************** 向HC595发送一个字节函数 ******************/
void Send_595(u8 dat)
{
u8 i;
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[LED8[display_index]]); //输出段码
Send_595(~T_COM[display_index]); //输出位码

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

}

/********************** 显示时钟函数 ************************/
void DisplayRTC(void)
{
if(hh >= 10) LED8[0] = hh / 10;
else LED8[0] = 0x10;
LED8[1] = hh % 10;
LED8[2] = 0x11;
LED8[3] = mm / 10;
LED8[4] = mm % 10;
LED8[5] = 0x11;
LED8[6] = ss / 10;
LED8[7] = ss % 10;
}

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:54 , Processed in 0.142946 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表