- 打卡等级:初来乍到
- 打卡总天数:6
- 最近打卡:2025-12-27 16:57:41
已绑定手机
新手上路
- 积分
- 15
|
第三集:点亮第一个LED灯
编译图片:
第三集
源代码:
#include "ai8051u.h"
void main(void)
{
P0M0 = 0x00;P0M1 = 0x00;
P1M0 = 0x00;P1M1 = 0x00;
P2M0 = 0x00;P2M1 = 0x00;
P3M0 = 0x00;P3M1 = 0x00;
P4M0 = 0x00;P4M1 = 0x00;
P5M0 = 0x00;P5M1 = 0x00;
while(1)
{
P24 = 0;
P25 = 0;
}
}
第三集.zip
(815.24 KB, 下载次数: 0)
运行效果:
第三集
第四集:USB不停电下载
编译图片:
第四集
源代码:
#include "ai8051u.h"
#include "ai_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80;
P0M0 = 0x00;P0M1 = 0x00;
P1M0 = 0x00;P1M1 = 0x00;
P2M0 = 0x00;P2M1 = 0x00;
P3M0 = 0x00;P3M1 = 0x00;
P4M0 = 0x00;P4M1 = 0x00;
P5M0 = 0x00;P5M1 = 0x00;
usb_init();
IE2 |= 0x80;
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P24 = 0;
P25 = 0;
}
}
第四集.zip
(434.38 KB, 下载次数: 0)
运行效果:
第四集效果
第五集:C语言基础
编译图片:
第五集
源代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define u8 unsigned char
#define u16 unsigned int
u8 KO = 24;
u8 BE = 8;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80;
P0M0 = 0x00;P0M1 = 0x00;
P1M0 = 0x00;P1M1 = 0x00;
P2M0 = 0x00;P2M1 = 0x00;
P3M0 = 0x00;P3M1 = 0x00;
P4M0 = 0x00;P4M1 = 0x00;
P5M0 = 0x00;P5M1 = 0x00;
usb_init();
IE2 |= 0x80;
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);
while(1)
{
if(bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
if( KO && BE )
{
printf("MAN!\r\n");
}
// else
// {
// printf("条件为假\r\n");
// }
usb_OUT_done();
}
// P24 = 0;
// P25 = 0;
}
}
第五集.zip
(397.28 KB, 下载次数: 0)
运行效果:
第五集效果
第六集:I/O输入输出
编译图片:
第六集
源代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
u8 state = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void)
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main(void)
{
WTST = 0;
EAXFR = 1;
CKCON = 0;
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();
IE2 |= 0x80;
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);
while(1)
{
if(bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//任务1:按下P32按钮灯亮,松开P32按钮灯灭
// if( P32 == 0 )
// {
// P20 = 0;
// }
// else
// {
// P20 = 1;
// }
//任务2:按下P32按钮灯灭,松开P32按钮灯亮
// if( P32 == 1 )
// {
// P20 = 0;
// }
// else
// {
// P20 = 1;
// }
// //任务3:按一下灯亮,按一下灯灭
// if(P32 == 0)
// {
// Delay20ms();
// if( P32 == 0 )
// {
// state = !state;
// P20 = state;
// printf("state:%d\r\n",(int)state);
// while(P32 == 0);
// }
// }
// // 课后任务1:按一下P32灯亮,按一下P33灯灭
// if(P32 == 0)
// {
// Delay20ms();
// if( P32 == 0 )
// {
// state = 0;
// P20 = state;
// while(P32 == 0);
// }
// }
// else if(P33 == 0)
// {
// Delay20ms();
// if( P33 == 0 )
// {
// state = 1;
// P20 = state;
// while(P33 == 0);
// }
// }
// 课后任务2:按一下P33亮一颗灯,直至8颗全亮
if(P32 == 0)
{
Delay20ms();
if( P32 == 0 )
{
state++;
if(state>8)
{
state=0;
}
P2 = 0xff<<state;
printf("P2 = 0x%x\r\n",P2);
while(P32 == 0);
}
}
}
}
第六集.zip
(226.77 KB, 下载次数: 0)
运行效果:
第七集:定时器中断
编译图片:
第七集
源代码:
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //d调用头文件
#define u8 unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
u8 state = 0;
u8 Run_State = 0;
u8 cnt = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHz Delay20ms();
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void Timer0_Init(void); //3秒@24.000MHz //函数声明
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 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(); //定时器初始化
EA = 1; //IE |= 0X80;
// P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
// 课后小练 功德箱:
// 1:按下P33,串口打印“双倍功德时间”,再按下显示“单倍功德时间”;
// 2:按下P32,双倍功德时间下显示“功德+2,当前功德: ”,LED点亮2秒后熄灭;单倍功德时间按下显示“功德+1,当前功德: ”,LED点亮1秒后熄灭;
if(P33==0)
{
Delay20ms();
if(P33==0)
{
Run_State = !Run_State;
if(Run_State)
{
printf("双倍功德时间");
}
else
{
printf("单倍功德时间");
}
while(!P33);
}
}
if(P32==0)
{
Delay20ms();
if(P32==0&& Run_State)
{
cnt+=2;
P20=0;
printf("功德+2,当前功德:%d\r\n",cnt);
Timer0_Init();
while(!P32);
}
else if(P32==0&& !Run_State)
{
cnt+=1;
P20=0;
printf("功德+1,当前功德:%d\r\n",cnt);
Timer0_Init();
while(!P32);
}
}
//任务1:
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// Delay20ms(); //延时20ms消抖
// if( P32 == 0 )
// {
// printf("按键按下次数\xfd:%d 次\r\n",(int)count);
// count++;
//
// while( P32 == 0 ); //等待P32松开
//
// }
// }
//// //任务2:灯按一下点亮三秒后熄灭。
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// Delay20ms(); //延时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按钮是否按下
// {
// Delay20ms(); //延时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 函数定义
//{
// 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
//{
// TM0PS = 0x0F; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
// TL0 = 0xDC; //设置定时初始值
// TH0 = 0x0B; //设置定时初始值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0 = 1; //使能定时器0中断
//}
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中断
}
void Timer0_Isr(void) interrupt 1
{
state++;
if(state==2 && Run_State || state==1 && !Run_State)
{
P20 = 1;
TR0 = 0;
state= 0;
}
}
第七集.zip
(6.95 MB, 下载次数: 0)
运行效果:
第八集:定时器周期性调度服务
编译图片:
第八集
源代码:
#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(); //系统计时
}
第八集.zip
(2.91 MB, 下载次数: 0)
运行效果:
第九集:虚拟LED和数码管
编译图片:
第九集
源代码:
#include "io.h"
u8 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 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] ; //按键按下持续时间
u8 Key_flag = 0;
u8 cnt[3];
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 )
{
//按键按下的任务
Key_flag = !Key_flag;
if(cnt[2])
{
cnt[1] = 0;
cnt[2] = 0;
}
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[4] = 0X01; //P3
LED40_SendData( cod,5 );
P2 = ~T_NUM[state_now];
state_now++;
if( state_now>7 )
state_now = 0;
}
void SEG_PC( void )
{
u8 cod[8];
cod[0] = SEG_NUM[shi/10]; //小时的十位数的数码管段码
cod[1] = SEG_NUM[shi%10];
cod[2] =SEG_NUM[16]; //数码管刷段码和位码
cod[3] = SEG_NUM[fen/10]; //分钟
cod[4] = SEG_NUM[fen%10];
cod[5] =SEG_NUM[16]; //数码管刷段码和位码
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;
}
}
}
// 课后小练:简易免单器
void SEGLED_PC(void)
{
u8 cod[8];
if(Key_flag)
{
cod[0] = SEG_NUM[1];
cod[1] = SEG_NUM[0]|SEG_NUM[18];
cod[2] = SEG_NUM[0];
cod[3] = SEG_NUM[0];
cod[4] = SEG_NUM[cnt[1]/10];
cod[5] = SEG_NUM[cnt[1]%10]|SEG_NUM[18];
cod[6] = SEG_NUM[cnt[0]/10];
cod[7] = SEG_NUM[cnt[0]%10];
}
else
{
cod[0] = SEG_NUM[1];
cod[1] = SEG_NUM[0]|SEG_NUM[18];
cod[2] = SEG_NUM[0];
cod[3] = SEG_NUM[0];
cod[4] = SEG_NUM[cnt[1]/10];
cod[5] = SEG_NUM[cnt[1]%10]|SEG_NUM[18];
cod[6] = SEG_NUM[cnt[0]/10];
cod[7] = SEG_NUM[cnt[0]%10];
}
SEG7_ShowCode(cod);
if(!cnt[2] && Key_flag)
{
cnt[0]++;
if(cnt[0] > 59)
{
cnt[0] = 0;
cnt[1]++;
if( cnt[1]>9 )
{
cnt[2] = 1;
}
}
}
}
第九集.zip
(10.42 MB, 下载次数: 0)
运行效果:
|
|