打卡等级:初来乍到
打卡总天数:3
最近打卡:2025-12-08 13:58:42
新手上路
积分 33
新人第一次发帖,还请各位大佬多多指教~~
按照教学视频一步步学习,希望早日收到实验箱,进一步学习,目标:可以做一个示波器
第3集 擎天柱点亮LED灯
1.编译图片:
2.代码:
#include <AI8051u.h>
// #include <INTRINS.H>
// #define uint8_t unsigned char
// #define uint16_t unsigned int
// void Delay_ms(uint16_t ms);
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 ;
P6M0 = 0x00 ; P6M1 = 0x00 ;
P7M0 = 0x00 ; P7M1 = 0x00 ;
while (1 )
{
P20 = 0 ;
P21 = 0 ;
// Delay_ms(100);
// P20 = 1;
// Delay_ms(100);
}
}
// void Delay_ms(uint16_t ms) //@24.000MHz
// {
// uint8_t data i, j;
// do
// {
// _nop_();
// i = 32;
// j = 40;
// do
// {
// while (--j);
// } while (--i);
// }while(--ms);
// }
3.验证图片:
01_点灯.7z
(13.45 KB, 下载次数: 2)
第4集 USB-CDC 不停电下载
1.编译照片:
2.代码:
#include <AI8051u.h>
#include <ai_usb.h>
// #define uint8_t unsigned char
// #define uint16_t unsigned int
// void Delay_ms(uint16_t ms);
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 ;
P6M0 = 0x00 ; P6M1 = 0x00 ;
P7M0 = 0x00 ; P7M1 = 0x00 ;
usb_init ();
EA = 1 ;
while (1 )
{
if (bUsbOutReady )
{
USB_SendData (UsbOutBuffer ,OutNumber ); // CDC 串口测试
usb_OUT_done ();
}
P20 = 0 ;
P21 = 0 ;
}
}
// void Delay_ms(uint16_t ms) //@24.000MHz
// {
// uint8_t data i, j;
// do
// {
// _nop_();
// i = 32;
// j = 40;
// do
// {
// while (--j);
// } while (--i);
// }while(--ms);
// }
3.验证视频:
Your browser does not support video tags.
02_不断电下载.7z
(40.07 KB, 下载次数: 3)
第5集 C语言基础及USB-CDC串口
1.编译图片:
2.代码:
#include <AI8051U.h>
#include <ai_usb.h>
uint16_t a = 8 ;
uint16_t b = 10 ;
uint16_t c = 0 ;
uint8_t i = 0 ;
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 ;
P6M0 = 0x00 ; P6M1 = 0x00 ;
P7M0 = 0x00 ; P7M1 = 0x00 ;
usb_init ();
IE2 |= 0x80 ;
EA = 1 ;
c = a + b ;
while (1 )
{
if (bUsbOutReady )
{
USB_SendData (UsbOutBuffer ,OutNumber );//); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// if(c == 0)
// printf("STC YYDS\r\n"); //printf 在usb.h中需重定向到 printf_usb
// else printf("c = %d + %d \r\n",a,b);
// printf("c =%d\r\n",(uint16_t)(a+b));
// for(i = 0; i<64;i++)
// printf("%d\t",(uint16_t)UsbOutBuffer);
// if(UsbOutBuffer[0] == '0') //CDC 串口发送0,显示大写;其他显示小写
// printf("STC YYDS\r\n");
// else
// printf("stc yyds\r\n");
usb_OUT_done ();
}
// P20 = 0;
// P21 = 0;
// P22 = 0;
}
}
3.验证图片:
03_CDC_printf.7z
(41.35 KB, 下载次数: 1)
第6集 GPIO输入输出
1.编译照片:
2.代码(包括课后任务):
#include <AI8051U.h>
#include <ai_usb.h>
uint8_t state = 1;
uint8_t cnt = 0;
void Delay20ms(void) //@24.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 3;
j = 112;
k = 91;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
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;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init();
IE2 |= 0x80;
EA = 1;
while (1)
{
if (bUsbOutReady)
{
usb_OUT_done();
}
// 任务1:按下P33,擎天柱P20灯亮,松开P33灯灭
// P33 == 0 ? (P20 = 0) : (P20 = 1); // "=" 优先级高于条件判断符
if(P33)
{
P20 = 1;
}
else
{
P20 = 0;
}
//任务2:按下P33,擎天柱P20灯灭,松开P33灯亮
// P33 == 1 ? (P20 = 0) : (P20 = 1); // "=" 优先级高于条件判断符
// if(!P33)
// {
// P20 = 1;
// }
// else
// {
// P20 = 0;
// }
//任务3:按一下灯亮,再按一下灯灭
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// // P20 = ~P20; // 擎天柱
// state = !state;
// P20 = state;
// printf("state = %d\r\n",(uint16_t)state);
// while(!P33);
// }
// }
// 课后任务1:按一下P32灯亮,按一下P33灯灭
// if(!P32)
// {
// Delay20ms();
// if(!P32)
// {
// state = 0;
// while(!P32);
// printf("state = %d\r\n",(uint16_t)state);
// }
// }
// else if(!P33)
// {
// Delay20ms();
// if(!P33)
// {
// state = 1;
// while(!P33);
// printf("state = %d\r\n",(uint16_t)state);
// }
// }
// P20 = state;
// 课后任务2:按一下P33亮一颗灯,直至8颗全亮
// if(!P33)
// {
// Delay20ms();
// if(!P33)
// {
// cnt++;
// if(cnt > 8)
// {
// cnt = 0;
// P2 = 0xff;
// }
// P2 = 0xff << cnt;
// printf("P2 = 0x%x\r\n",P2);
// while(!P33);
// }
// }
}
}
3.验证视频:
Your browser does not support video tags.
04_IO.7z
(42.09 KB, 下载次数: 0)
第7集 定时器中断
1.编译照片:
2.代码(包括课后任务):
#include <AI8051U.h>
#include <ai_usb.h>
uint16_t state = 0;
uint16_t cnt = 0;
uint8_t Run_State = 0;
void Delay20ms(void); //@24.000MHz
void Timer0_Init(void); //3秒@24.000MHz
void main(void)
{
P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,0代表不等待,最快速度运行
CKCON = 0; //设置访问片内xdata速度,0表示用最快速度访问,不增加额外等待时间
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init();
IE2 |= 0x80; //使能usb中断
// Timer0_Init();
EA = 1;
while (1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber);//); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
// 任务1:LED灯3秒取反一次,这期间任意时刻按下按钮,串口打印按键次数
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// while(P33 == 0);
// printf("按键按下次数\xfd:%d次\r\n",++cnt); // 特殊汉字后需增加 \xfd
// }
// }
// 任务2:灯按一下点亮3秒后熄灭
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// P20 = 0;
// Timer0_Init();
// while(P33 == 0);
// printf("按键按下次数\xfd:%d次\r\n",++cnt); // 特殊汉字后需增加 \xfd
// }
// }
// 任务3:灯按一下P33 LED0,LED1交替闪烁,再按一下停止
if(P33 == 0)
{
Delay20ms();
if(P33 == 0)
{
Run_State = !Run_State; //运行状态取反
if (Run_State == 1)
{
Timer0_Init();
}
else
{
TR0 = 0; //关闭定时器
P20 = 1;
P21 = 1;
}
while(P33 == 0);
// printf("按键按下次数\xfd:%d次\r\n",++cnt); // 特殊汉字后需增加 \xfd
}
}
// 课后小练 功德箱:
// 1:按下P33,串口打印“双倍功德时间”,再按下显示“单倍功德时间”;
// 2:按下P32,双倍功德时间下显示“功德+2,当前功德: ”,LED点亮2秒后熄灭;单倍功德时间按下显示“功德+1,当前功德: ”,LED点亮1秒后熄灭;
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// Run_State = !Run_State; //运行状态取反
// if (Run_State == 1)
// {
// printf("双倍功德时间\r\n");
// }
// else
// {
// printf("单倍功德时间\r\n");
// }
// while(P33 == 0);
// }
// }
// if(Run_State && !P32)
// {
// Delay20ms();
// if(Run_State && !P32)
// {
// cnt += 2;
// printf("功德+2,当前功德:%d\r\n",cnt);
// P20 = 0;
// Timer0_Init();
// while(!P32);
// }
// }
// if(!Run_State && !P32)
// {
// Delay20ms();
// if(!Run_State && !P32)
// {
// cnt += 1;
// printf("功德+1,当前功德:%d\r\n",cnt);
// P20 = 0;
// Timer0_Init();
// while(!P32);
// }
// }
// if(cnt > 9)
// {
// printf("功德圆满\r\n");
// cnt = 0;
// }
}
}
void Delay20ms(void) //@24.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 3;
j = 112;
k = 91;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
// 任务1 任务2
// 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中断
// }
//任务3 500ms
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中断
// }
// 任务1,2
// void Timer0_Isr(void) interrupt 1
// {
// // state = !state;
// // P20 = state;
// P20 = 1;
// TR0 = 0;
// }
// 500ms 任务3
void Timer0_Isr(void) interrupt 1
{
state = !state;
P20 = state;
P21 = !state;
}
//功德箱中断
// void Timer0_Isr(void) interrupt 1
// {
// state ++;
// if( ((state == 2) && Run_State) || ((state == 1) && !Run_State))
// {
// P20 = 1;
// TR0 = 0;
// state = 0;
// }
// // if((state == 2) && Run_State)
// // {
// // P20 = 1;
// // TR0 = 0;
// // state = 0;
// // }
// // if((state == 1) && !Run_State)
// // {
// // P20 = 1;
// // TR0 = 0;
// // state = 0;
// // }
// }
3.验证照片:
Your browser does not support video tags.
05_TimerINT.7z
(42.48 KB, 下载次数: 0)
第 8 集 定时器周期性任务调度
1.编译照片:
2.代码:
#include "task.h"
#include "io.h"
static TASK_COMPONENTS xdata Task_Comps[]=
{
//状态 计数 周期 函数
{0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */
{0, 600, 600, LED1_Blink}, /* task 2 Period: 600ms */
{0, 900, 900, LED2_Blink}, /* task 3 Period: 900ms */
{0, 10, 10, Key_Task }, /* task 4 Period: 10ms */
};
uint8_t data 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)
{
uint8_t data i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps.TIMCount) /* If the time is not 0 */
{
Task_Comps.TIMCount--; /* Time counter decrement */
if(Task_Comps.TIMCount == 0) /* If time arrives */
{
/*Resume the timer value and try again */
Task_Comps.TIMCount = Task_Comps.TRITime;
Task_Comps.Run = 1; /* The task can be run */
}
}
}
}
//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
uint8_t data i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps.Run) /* If task can be run */
{
Task_Comps.Run = 0; /* Flag clear 0 */
Task_Comps.TaskHook(); /* Run task */
}
}
}
3.验证视频:
Your browser does not support video tags.
06_TimerTasks.7z
(49.03 KB, 下载次数: 0)
第 9 集 ISP 虚拟接口 LED_40 及数码管
1.编译照片:
2.代码(IO.c):
#include "io.h"
uint16_t xdata key_vol = 0;
void LED0_Blink(void)
{
P20 = !P20;
}
void LED1_Blink(void)
{
P21 = !P21;
}
void LED2_Blink(void)
{
P22 = !P22;
}
void Key_Task(void)
{
if(P32 == 0)
{
key_vol ++;
if(key_vol == 5)
{
printf("按键按下\r\n");
}
}
else
key_vol = 0;
}
uint8_t xdata state_LED = 0;
uint8_t xdata T_NUM[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//========================================================================
// ISP 调试仿真接口 擎天柱LED
// P2 LED 流水灯
//========================================================================
void PLED_40(void)
{
uint8_t cod[8];
cod[0] = 0x0f; //开启 P0~P3
cod[1] = ~0X01; //P0 端口
cod[2] = ~0x01; //P1 端口
cod[3] = ~T_NUM[state_LED]; //P2 端口
cod[4] = ~0x80; //P3 端口
LED40_SendData(cod,5); //发送数据
P2 = ~T_NUM[state_LED]; //晴天住硬件对比
state_LED ++;
if(state_LED > 7)
state_LED = 0;
}
//========================================================================
// ISP 调试仿真接口 数码管PC
// 字模 0~9 DP-G-F-E-D-C-B-A
//========================================================================
uint8_t 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*/
0x40, /*'-', 10*/
0x00, /*' ', 11*/
0x80, /*'.', 12*/
};
uint8_t xdata shi = 0;
uint8_t xdata fen = 0;
uint8_t xdata miao = 0;
//========================================================================
// ISP 调试仿真接口 数码管PC
// 简易时钟,秒自加 1
//========================================================================
void SEG_PC(void)
{
uint8_t 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[1];
cod[1] = SEG_NUM[0]|SEG_NUM[12];// 0xBF;
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[1];
cod[1] = SEG_NUM[0]|SEG_NUM[12];// 0xBF;
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.验证视频:
Your browser does not support video tags.
Your browser does not support video tags.
07_shu码管.7z
(58.72 KB, 下载次数: 1)