- 打卡等级:常住居民III
- 打卡总天数:140
- 最近打卡:2025-12-18 08:52:37
已绑定手机
高级会员
- 积分
- 615
|
擎天柱Ai8051U 打卡
第三集:擎天柱点亮LED灯
1.编译图片:
2.代码:
#include "ai8051u.h"
void main(void)
{
P2M0 = 0x00;
P2M1 = 0x00;
while(1)
{
P20 = 0;
P21 = 0;
P22 = 0;
P23 = 0;
P24 = 0;
P25 = 0;
P26 = 0;
P27 = 0;
}
}
3.结果验证:
01_Light_On.7z
(29.69 KB, 下载次数: 0)
第四集:USB不停电下载
1.编译图片:
2.代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80; // B7位写1,使能访问XFR
P0M1 = 0x00;
P0M0 = 0x00;
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; // IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED)
; // 等待USB完成配置
while (1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer, OutNumber); // 发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P20 = 0;
P21 = 0;
P22 = 0;
P23 = 0;
P24 = 0;
P25 = 0;
P26 = 0;
P27 = 0;
}
}
3.结果验证:
02_Usb_Non-stop_Download.7z
(56.42 KB, 下载次数: 0)
第五集: C语言基础
1.编译图片:
2.代码:
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
u8 X = 200;
u8 Y = 10;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80; //B7位写1,使能访问XFR
P0M1 = 0x00; P0M0 = 0x00;
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; //IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
if( X && Y ) //如果条件为真,输出什么
{
printf("True\r\n");
}
// else
// {
// printf("条件为假\r\n");
// }
// printf("X / Y = %u \r\n",(u16)(X/Y));
// printf("X %% Y = %u \r\n",(u16)(X%Y));
usb_OUT_done(); //
}
}
}
3.结果验证
03_Basics_of_C_Language.7z
(57.94 KB, 下载次数: 0)
第六集:GPIO输入输出
1.编译图片:
2.代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
u8 state = 0; // 初始状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay1ms(unsigned int xms) //@24.000MHz
{
unsigned char data i, j;
while (xms--)
{
_nop_();
i = 32;
j = 40;
do
{
while (--j)
;
} while (--i);
}
}
void main(void)
{
WTST = 0; // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
P_SW2 |= 0x80; //B7位写1,使能访问XFR
CKCON = 0; // 提高访问XRAM速度
P0M1 = 0x00;
P0M0 = 0x00;
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; // IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED)
; // 等待USB完成配置
while (1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer, OutNumber); // 发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
// //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// P20 = 0;
// }
// else
// {
// P20 = 1;
// }
//
// 任务2:按下P32按钮灯灭,松开P32按钮灯亮;
// if( P32 == 1 ) //判断P32按钮是否按下
// {
// P20 = 0;
// }
// else
// {
// P20 = 1;
// }
// 任务3:按一下灯亮,按一下灯灭
if (P32 == 0) // 判断P32按钮是否按下
{
Delay1ms(20); // 延时20ms消抖
if (P32 == 0)
{
state = !state; // 变量取反 0 1 0 1 0 1
P20 = state;
printf("state:%d\r\n", (int)state);
while (P32 == 0)
; // 等待P32松开
}
}
}
}
3.结果验证
第七集:定时器中断
1.编译图片:
2.代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
u8 state = 0; // 初始状态
u8 Run_State = 0; // 按键运行状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delayms(unsigned int xms) //@24.000MHz
{
unsigned char data i, j;
while (xms--)
{
_nop_();
i = 32;
j = 40;
do
{
while (--j)
;
} while (--i);
}
}
void Timer0_Init(void);
void main(void)
{
int count=1; //按键计数变量
WTST = 0; // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
P_SW2 |= 0x80; //B7位写1,使能访问XFR
CKCON = 0; // 提高访问XRAM速度
P0M1 = 0x00;
P0M0 = 0x00;
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中断
// Timer0_Init(); // 定时器初始化,用于USB定时
EA = 1; // IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED)
; // 等待USB完成配置
while (1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer, OutNumber); // 发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//任务1:
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// Delayms(20); //延时20ms消抖
// if( P32 == 0 )
// {
// printf("按键按下次数\xfd:%d 次\r\n",(int)count);
// count++;
//
// while( P32 == 0 ); //等待P32松开
//
// }
// }
// // //任务2:灯按一下点亮三秒后熄灭。
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// Delayms(20); //延时20ms消抖
// if( P32 == 0 )
// {
// // printf("按键按下次数\xfd:%d 次\r\n",(int)count);
// // count++;
// P20 = 0;
// Timer0_Init();
// while( P32 == 0 ); //等待P32松开
// }
// }
//
//任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2 表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
if( P32 == 0 ) //判断P32按钮是否按下
{
Delayms(20); //延时20ms消抖
if( P32 == 0 )
{
Run_State = !Run_State;
//运行状态取反
if( Run_State==1 ) //运行
{
Timer0_Init();
}
else
{
TR0 = 0; //关闭定时器
P20 = 1;
P21 = 1;
}
while( P32 == 0 ); //等待P32松开
}
}
}
}
//void Timer0_Init(void) //3秒@24.000MHz 函数定义 <1 2>
//{
// TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
// TL0 = 0x3F; //设置定时初始值
// TH0 = 0x01; //设置定时初始值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0 = 1; //使能定时器0中断
//
// //TM0PS = 91
// //12T /12
// // THO-TL0 = 319
//
//}
void Timer0_Init(void) //500毫秒@24.000MHz <3>
{
TM0PS = 0x0F; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xDC; //设置定时初始值
TH0 = 0x0B; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
// void Timer0_Isr(void) interrupt 1 //<1.2>
// {
// // state = !state;
// // P20 = state;
// P20 = 1;
// TR0 = 0;
// }
void Timer0_Isr(void) interrupt 1 //3秒执行一次 <3>
{
state = !state;
P20 = state;
P21 = !state;
}
3.结果验证
05_Timer.7z
(60.15 KB, 下载次数: 0)
第八集:定时器周期性任务调度
1.编译图片:
2.代码:
#include "config.h"
#include "task.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
Sys_init(); // 系统初始化
usb_init(); // USB CDC 接口配置
IE2 |= 0x80; // 使能USB中断
Timer0_Init();
EA = 1; // IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED)
; // 等待USB完成配置
while (1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer, OutNumber); // 发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
Task_Pro_Handler_Callback(); //执行功能函数
}
}
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
3.结果验证
06_Timer_Task_Scheduling.7z
(73.36 KB, 下载次数: 0)
第九集:ISP虚拟接口 LED和数码管
1.编译图片:
2.代码:
#include "io.h"
u8 xdata SEG_NUM[]=
{
0x3F, /*'0', 0*/
0x06, /*'1', 1*/
0x5B, /*'2', 2*/
0x4F, /*'3', 3*/
0x66, /*'4', 4*/
0x6D, /*'5', 5*/
0x7D, /*'6', 6*/
0x07, /*'7', 7*/
0x7F, /*'8', 8*/
0x6F, /*'9', 9*/
// 0x77, /*'A', 10*/
// 0x7C, /*'B', 11*/
// 0x39, /*'C', 12*/
// 0x5E, /*'D', 13*/
// 0x79, /*'E', 14*/
// 0x71, /*'F', 15*/
0x40, /*'-', 16*/
0x00, /*' ', 17*/
0x80, /*'.', 18*/
};
u8 xdata T_NUM[8] =
{
0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};
u8 State1 = 0; //LED1初始状态
u8 State2 = 0; //LED2初始状态
u8 State3 = 0; //LED3初始状态
// u16 Key_Vol[3] ; //按键按下持续时间
uint16_t xdata key_vol = 0;
uint8_t xdata state_LED = 0;
void LED0_Blink(void)
{
State1 = !State1;
P20 = State1;
}
void LED1_Blink(void)
{
State2 = !State2;
P21 = State2;
}
void LED2_Blink(void)
{
State3 = !State3;
P22 = State3;
}
void KEY_Task(void)
{
// if( P32 == 0 )
// {
// Key_Vol[0]++;
// if( Key_Vol[0]==5 )
// {
// //按键按下的任务
// printf( "按键单击\r\n" );
// }
// }
// else
// {
// Key_Vol[0] = 0;
// }
}
u8 shi =0;
u8 fen =0;
u8 miao =0;
void TIMECOUNT_Task(void)
{
miao ++;
if( miao>59 )
{
miao = 0;
fen++;
if( fen>59 )
{
fen = 0;
shi ++;
if( shi>23 )
shi = 0;
}
}
}
u8 state_now = 0;
void PLED_40(void)
{
u8 cod[8];
cod[0] = 0x0f; //表示开启P0-P3
cod[1] = 0X01; //P0端口
cod[2] = 0X01; //P1
// cod[3] = ~T_NUM[state_now]; //P2
cod[3] = ~T_NUM[state_LED]; //P2 端口
// cod[4] = 0X01; //P3
cod[4] = ~0x80; //P3 端口
LED40_SendData( cod,5 );
P2 = ~T_NUM[state_now];
// state_now++;
// if( state_now>7 )
// state_now = 0;
state_LED++;
if (state_LED > 7)
state_LED = 0;
}
void SEG_PC( void )
{
u8 cod[8];
cod[0] = SEG_NUM[shi/10]; //小时的十位数的数码管段码
cod[1] = SEG_NUM[shi%10];
cod[2] =SEG_NUM[10]; //数码管刷段码和位码
cod[3] = SEG_NUM[fen/10]; //分钟
cod[4] = SEG_NUM[fen%10];
cod[5] =SEG_NUM[10]; //数码管刷段码和位码
cod[6] = SEG_NUM[miao/10]; //分钟
cod[7] = SEG_NUM[miao%10];
SEG7_ShowCode(cod);
miao ++;
if(miao > 59)
{
miao = 0;
fen ++;
if(fen > 59)
{
fen = 0;
shi ++;
if(shi > 23)
shi = 0;
}
}
}
uint8_t flag_1 = 0; //初始值标志
uint8_t flag_2 = 0; //计数启停标志
//temp[0] = ms
//temp[1] = s
uint8_t temp[2] = {0};
//========================================================================
// ISP 调试仿真接口 数码管PC
// 课后小练:简易免单器
//========================================================================
void SEG7_Pra(void)
{
uint8_t cod[8];
if(!flag_1)
{
cod[0] = SEG_NUM[0];
cod[1] = SEG_NUM[0];
cod[2] = SEG_NUM[0];
cod[3] = SEG_NUM[0];
cod[4] = SEG_NUM[0];
cod[5] = SEG_NUM[0]|SEG_NUM[12];// 0xBF;
cod[6] = SEG_NUM[0];
cod[7] = SEG_NUM[0];
SEG7_ShowCode(cod);
}
if(flag_2)
{
cod[0] = SEG_NUM[0];
cod[1] = SEG_NUM[0];
cod[2] = SEG_NUM[0];
cod[3] = SEG_NUM[0];
cod[4] = SEG_NUM[temp[1]/10];
cod[5] = SEG_NUM[temp[1]%10]|SEG_NUM[12];// 0xBF;
cod[6] = SEG_NUM[temp[0]/10];
cod[7] = SEG_NUM[temp[0]%10];
SEG7_ShowCode(cod);
temp[0] ++;
if(temp[0] > 99)
{
temp[0] = 0;
temp[1] ++;
if(temp[1] > 99)
temp[1] = 99;
}
}
}
void Key_SEG7_Task(void)
{
uint8_t key_cnt = 0; // ????????????flag_1??
if(P33 == 0)
{
key_vol ++;
if(key_vol == 5)
{
if(key_cnt == 0)
flag_1 = 1;
flag_2 = !flag_2;
key_cnt ++;
if(key_cnt > 254)
key_cnt = 254;
}
}
else
key_vol = 0;
}
3.结果验证
07_Digital_Tube.7z
(77.46 KB, 下载次数: 0)
|
|