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

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

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-16 12:49:51 | 显示全部楼层

上面代码数码管闪的原因找到了,P32是数码管数字芯片595的时钟线

无语了

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-16 18:54:48 | 显示全部楼层

第8集 下面代码是周期性调度任务的代码

led1 300ms反转一次;

led2 600ms反转一次;

led3 900ms反转一次;

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


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>=300)
		{
			count_300=0;
			P00=!P00;
		}
		if(count_600>=600)
		{
			count_600=0;
			P01=!P01;
		}
		if(count_900>=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 &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x30;				//设置定时初始值
	TH0 = 0xF8;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

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

第二部分数组的使用

image.png

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-16 19:04:16 | 显示全部楼层

for循环的用法

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



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[0]>=100)
		{
			count[0]=0;
			P00=!P00;
		}
		if(count[1]>=100)
		{
			count[1]=0;
			P01=!P01;
		}
		if(count[2]>=500)
		{
			count[2]=0;
			P02=!P02;
		}

	}
}


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




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

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-17 13:15:04 | 显示全部楼层

下面是流水灯的代码,使用的是数组和中断

/*
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 "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 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>=100)
		{	i=0;
			P0=count[j];
			j++;
			if(j>=8)
			{
				j=0;
			}
		}


	}
}


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


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

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-17 19:50:26 来自手机 | 显示全部楼层
/*
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 "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 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>=100)
//		{	i=0;
//			P0=count[j];
//			j++;
//			if(j>=8)
//			{
//				j=0;
//			}
//		}
	
// 任务2,流水灯按一下移位一次
		if(k>=10)							//10ms看一次
		{
			k=0;
			if(P33==0)						//如果按键按下
			{	
				x++;						//按键计数加1
			}
			else
			{
				x=0;						//如果没有按下或抖动或抬起,按键计数清0
			}
			if(x==6)						//如果60ms内全部按下,说明按键就按下了
			{
				P0=count[j];				//执行代码
				j++;
				if(j>=8)
				{
					j=0;
				}
			}
		}
	}
}


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


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

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-20 10:05:22 | 显示全部楼层

这个内容之前没有接触到,再加上这几天比较忙,断断续续学了好几天了

image.png

1.新建一个config.c和一个config.h的文件

image.png

2.格式

config.h的固定格式为:

#ifndef __XXX_H

#define __XXX_H

调用头文件

函数声明...

#endif

config.c的固定格式为:

#include “xxx.h”

函数定义

3.添加config.c到工程和引用config.h到工程

添加config

image.png

编译报错没有找到config.h文件

下面引用config.h路径到工程

image.png

image.png

再次编译没有报错

4.将原来代码里面的头文件搬移到config.h里面,初始化代码搬移到config.c里面(main函数里面要include.h)

函数定义放config.c里面;函数声明放config.h里面;main函数进行调用

image.png

image.png

image.png

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-20 13:38:49 | 显示全部楼层

结构体数组的周期性任务调度

0.新建一个task.c和一个task.h,并添加到工程

image.png

image.png

1.task.c

#include "task.h"


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[0]);

//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)												//循环好几次,几个任务几个循环
    {
        if(Task_Comps[i].TIMCount)      /* If the time is not 0 */			//如果计数不为0
        {
            Task_Comps[i].TIMCount--;   /* Time counter decrement */		//计数减减
            if(Task_Comps[i].TIMCount == 0) /* If time arrives */			//如果计数减到0
            {
                /*Resume the timer value and try again */
                Task_Comps[i].TIMCount = Task_Comps[i].TRITime;  			//重装计数
                Task_Comps[i].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<Tasks_Max; i++)												//循环好几次,几个任务几个循环
    {
        if(Task_Comps[i].Run) /* If task can be run */						//如果哪个任务的run参数为1
        {
            Task_Comps[i].Run = 0;      /* Flag clear 0 */					//那么就将rin标志清0
            Task_Comps[i].TaskHook();   /* Run task */						//并且执行这个任务的任务
        }
    }
}

2.task.h

#ifndef __TASK_H
#define __TASK_H

#include "config.h"			//调用头文件

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

3.中断函数里面进行计数:Task_Marks_Handler_Callback();

main 里面去执行:Task_Pro_Handler_Callback();

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-21 13:11:29 | 显示全部楼层

今天学习第九集视频--数码管

主要有下面内容

image.png

回复 支持 反对

使用道具 举报 送花

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

1

主题

61

回帖

285

积分

中级会员

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

ISP软件的字库生成工具,好用

image.png

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 20:07 , Processed in 0.149957 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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