zhaoye818
发表于 2025-2-15 10:23:39
继续学习
桃花飞舞
发表于 2025-2-15 11:06:08
1.第一集讲了AI8051U的强大之处有
1).屏幕显示和视频播放
2).IIS录放音
3).PWM_DMA
4).上位机频谱分析仪
5).手写计算器
6).QSPI,PWM硬件乘除,单精度浮点
是比之前的更加强大。
桃花飞舞
发表于 2025-2-15 12:16:26
第二课,
硬件介绍
SPI,IIC 数码管,流水灯, TFT屏幕, 掉电检测电压调节,无缘蜂鸣器,24c02 eeprom,ds18b20温度,32.78mhz无源晶振.
软件keil的安装介绍,添加stc的头文件,添加中断,下载工具用最新的ISP版本,有新功能,
下载时候8bit和32bit选择,代码是8位的就选8bit,否则就是32bit的。
对试验箱,模块和对应功能进行了介绍,对keil编译器,和下载工具使用方法做了介绍。
桃花飞舞
发表于 2025-2-15 13:17:20
第三集,点亮一个LED灯
keil的小技巧扳手图标tab改为四个空格.
先介绍了工程的建立,
配置target下 :cpu mode 选择source251 4字节的中断模式选项要勾上。memory mode 下拉选Xsmall模式。 code mode size 下拉选large 64K的模式。 输出下面:hex文件在64k以内选择HEX-80,并勾上这个勾。
头文件在ISP工具里面找到头文件选择对应的AI-8051u的头文件,keil格式保存,
为什么能点亮LED灯,
IO就是GPIO分为四种模式:I就是input, O就是output ,0 0是准双向口:既能做输入也能做输出,0 1是推挽输出, 1 0是高阻输入 1 1是开路模式内部上拉电阻断开
如P0M0 = 0x00; P0M1 = 0x00;也就是配置P0为准双向口.
可以在ISP中配置IO模式并生成C代码。
语句结束要加分号,大括号要换行缩进
这节课讲了第一个最简单的代码,和它的原理。
桃花飞舞
发表于 2025-2-15 14:13:02
第四集USB不停电下载
while里面走一圈就是一个循环。
为了代码稳定高效的运行一般采用查询的方式运行。
.lib文件添加方法和添加main.c文件的方法一样,并调用.lib文件的头文件。
用P_SW2寄存器打开扩展寄存器的功能。也就是打开USB可以访问的开关
IE2|= 0x80;打开USB中断的开关。
USB不停电下载
1实验对比演示
2.下载所需文件库函数,USB库文件。
3.移植关键部分到工程.
3.1添加头文件即.h文件
3.2.USB初始化函数,用.lib和.h文件实现
3.3命令参数.
3.4打开寄存器P_SW2和IE2寄存器
使用不停电下载程序的方法就是把不停电下载程序的代码复制到新的工程中
mfhkudso
发表于 2025-2-15 14:26:00
今天刚注册了怎么领取擎天柱?
桃花飞舞
发表于 2025-2-15 15:31:59
第五课 C语言基础
printf("X / Y = %u \n", (u16)(X / Y));//u16强制类型转换(X / Y)为变量,这里也可以放常量
printf("X %% Y = %u \n", (u16)(X % Y));
if ( X > Y)//如果条件为真输出什么
{
printf("条件为真\r\n");
}
else//else必须搭配if出现,不能单独出现else
{
printf("条件为假\r\n");
}
if ( X && Y)//如果条件为真输出什么
{
printf("条件为真\r\n");
}
else
{
printf("条件为假\r\n");
}
>><< 移位操作符,缺的位数补零
printf的格式控制符, 转义符,ASCII码表, 二进制、十进制、十六进制、每一个变量类型对应的数值长度。注意变量类型以及它的长度,数值一定不能溢出.
0为假,非0为真。
桃花飞舞
发表于 2025-2-15 16:39:40
第六课IO输入输出
变量取反
u8 state = 0;
//任务1:按下P32按钮灯亮,松开P32按钮灯灭;
if( P32 == 0 ) //判断P32按键是否被按下
{
P00 = 0;
}
else
{
P00 = 1;
}
//任务2:按下P32按钮灯灭,松开P32按钮灯亮;
if( P32 == 1 ) //判断P32按键是否被按下
{
P00 = 0;
}
else
{
P00 = 1;
}
//任务3:按一下灯亮,按一下灯灭
if ( P32 == 0 )
{
Delay20ms(); //延时20ms消抖
if (P32 == 0)
{
state = !state;
P00 = state; //变量取反0 1 0 1 0
printf("state: %d\r\n", (int)state);
while(P32 == 0); //等待P32松开
}
}
GPIO的介绍拉电流和灌电流,高低电平电压的介绍,按键原理和按键抖动的介绍
delay()函数是CPU停在这里不会往下走,这是一个很非内存的做法
桃花飞舞
发表于 2025-2-15 18:35:07
第七节课定时器中断
void Timer0_Init(void) //3秒@24.000MHz
{
TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x3F; //设置定时初始值
TH0 = 0x01; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
// TM0PS = 0x5B;91
//12T /12
// TH0 - TL0 = 319
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
state = !state;
P00 = state;
}
int count; //按键计数变量
if ( P32 == 0 )
{
Delay20ms(); //延时20ms消抖
if (P32 == 0)
{
printf("按键按下次数\xfd: %d\r\n", (int)count);
count++;
while(P32 == 0); //等待P32松开
}
}
定时频率(HZ) = Sysclk(hz)/((TM0PS + 1)*(65536-)*T)
定时时间(s) = ((TM0PS + 1)(65536-)*T)/Sysclk(hz)
= 65536-(Sysclk(hz) * 定时时间(s))/(T*(TM0PS + 1))
T = 1或者12.
16位自动重载定时器的本质就是从设定值数到65536(溢出)之后置位一次标志位,如果使能ET0就可以进入中断!
返回值类型 函数名(入口参数)
{
//函数体
//函数执行的代码
return 返回值;
}
函数的定义、声明、调用
定义:包含返回值,函数名和入口参数,并定义了函数 具体功能
函数的名称应当能够描述函数的功能,便于代码的阅读和理解.
函数名称应当使用有意义的英文单词或者组合的英文单词,避免使用特殊字符或数字。
函数名称不能与C语言的关键字同名。例如if等
返回值类型 函数名(入口参数);
声明: 在头文件或者被调用之前使用,注意末尾要加分号
函数名(入口参数);
调用:在需要调用的地方直接使用函数名,加上括号和分号。
如果有入口参数的,需要在括号的多个参数之间加逗号隔开。
int count; //按键计数变量
//任务2:灯按一下点亮三秒后熄灭
if ( P32 == 0 )
{
Delay20ms(); //延时20ms消抖
if (P32 == 0)
{
// printf("按键按下次数\xfd: %d\r\n", (int)count);
// count++;
P00 = 0;
Timer0_Init();
while(P32 == 0); //等待P32松开
}
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
// state = !state;
P00 = 1;
TR0 = 0; //定时器0关闭
}
void Timer0_Init(void) //500毫秒@24.000MHz
{
TM0PS = 0x0F; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xDC; //设置定时初始值
TH0 = 0x0B; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
int count; //按键计数变量
u8 state = 0; //初始状态
u8 Run_State = 0; //运行状态
//任务3:救护车灯控制器,按下报警按钮,红蓝灯交替闪烁(LED1和LED2表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
if ( P32 == 0 )
{
Delay20ms(); //延时20ms消抖
if (P32 == 0)
{
Run_State = !Run_State; //运行状态取反
if ( Run_State == 1)
{
Timer0_Init();
}
else
{
TR0 = 0; //关闭定时器
P00 = 1;
P01 = 1;
}
// P00 = 0;
// Timer0_Init();
while(P32 == 0); //等待P32松开
}
}
void Timer0_Isr(void) interrupt 1 //500ms执行一次
{
state = !state;
P00 = state;
P01 = !state
}
定时器一次只能定时一次,如果我有很多个定时任务怎么办?
前后台的方法,用定时器做心跳2.5ms, 在中断中把HeartBeat = 1,,while(1) { if (HeartBeat) { HeartBeat = 0;}}根据定时任务的定时时间来执行,也就是说如果a任务是1s执行一次,if (count1S++>= 400)执行一次a任务count1S = 0;任务b是10s执行一次,if( count10S++ >= 4000) 执行一次任务b
白水大虾2016
发表于 2025-2-15 20:43:32
今天继续矩阵