打卡复习《Ai8051U教学视频》
第一讲哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
Flash芯片的读写功能提升IIS的功能浮点运算单精度浮点DMA功能 Stc8051 到AI8051
看到了8080并口的LCD,屏显刷新很快,不知道串口如何?希望能有一个实验板试试
兼容89C52,相当于更强大的8H8K64U
第二讲
USB LINK 1D接口,下载、烧录、调试
USB转双串口STC自己的芯片,10m速度
带示波器接口
还有录放音
OLED流水灯8位数码管 TFT屏并口/串口?
主芯片是AI8051ULQFP48封装
RTC电池维持时间的继续,存储flash的芯片,动画的实现
软件的安装下载,比较详细
Isp现在最新版本6.95E
C251软件包
按照顺序下载安装 ISP\头文件\中断插件\代码****就可以试验了
32-bit 不是8-bit
完成下载
安装成功
Isp软件 把头文件安装在keil路径
软件设置
Small 128RAM,xsmall 2k不容易超
void main(void)
{
不会贴图晕 第4讲usb不停电下载
1,比较了每次按键下载和不停电下载,理解了这节课的意义
2.下载stc的usb库函数,并拷贝到自己的文件夹里
3 keil软件内加入#include“stc-cdc-usb.h”,采用查询方式
4 USB-init()函数的初始化,P-SW2,IE2寄存器的应用,|=的技巧
5,设置相关参数,以及ISP软件的设置
范例程序
#include "stc32g.h"
#include "stc32_stc8_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main()
{
P_SW2 |= 0x80;
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 接口配置
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while (1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
}
}
下面是我参照讲座编的keil 软复制如下
#include "ai8051u.h" // 头文件
#include "stc32_stc8_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";//根据isp软件命名
void main(void)
{
//仅执行一次
P_SW2 |= 0x80;
P0M0=0X00; // 准双向口
P0M1=0X00;
P4M0=0X00;
P4M1=0X00;
usb_init(); //USB CDC 接口配置
IE2 |=1; //EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40=0;
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P00=1; //循环执行
P01=1;
}
}
第五讲c语言的知识点
1,#include "stc32_stc8_usb.h"
//#define PRINTF_HID //printf输出直接重定向到USB口(早期命名方式)
#define PRINTF_USB //printf输出直接重定向到USB口(避免误解修改的命名方式,与PRINTF_HID效果一样)
这个里面的定义是已经改过的程序
#if defined PRINTF_SEGLED
#define printfSEG7_ShowString
#elif defined PRINTF_HID || defined PRINTF_USB
#define printfprintf_usb
#endif
2.printf("");应用在串口输出上,关键字符%、\r\n%d等待
3.c语句的计算符号和逻辑运算符号,重新复习一下
第六讲关于GPIO
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。
掌握00 准双向口,01 推挽输出,拉电流大,10 高阻状态,11开漏模式
按键的检测
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
ISP产生的软件延时程序,务必把WTST初始化为0
#include "ai8051u.h" // 头文件
#include "stc32_stc8_usb.h"
#include "strins.h" // _nop()_ 指令
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";//根据isp软件命名
#define u8 unsigned char
#define u16 unsigned int
u8 led_state=0;
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main(void)
{
//仅执行一次
//P_SW2 |= 0x80; // EAXFR=1; 一样功能
WTST=0; //设置程序指令延时参数
EAXFR=1; // 扩展寄存器反应能力
CKCON=0; //提高访问XRAM速度
P0M0=0X00; // 准双向口
P0M1=0X00;
P3M0=0X00;
P3M1=0X00;
P4M0=0X00;
P4M1=0X00;
usb_init(); //USB CDC 接口配置
IE2 |=1; //EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40=0;
while(1)
{
if (bUsbOutReady) //接收准备
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
printf ("led_state \r\n",(int)led_state);
usb_OUT_done();
}
if (p32=0)
{
Delay20ms(void);
if (p32=0)
{
led_state=!led_state;
P00=led_state; //按一次键状态p00灯改变一次
while(p32=0);
}
}
}
}
上面的程序看是简单,出现几个问题
;;;分号不能在汉字状态下输入,会出错
P32 是大写的P,p32编译出错
(p32=0)应该为 (P32==0),少一个=,
如果变量和函数的命名有个统一规范就好了
第七讲 定时器
THO TL0,TH1TL1,后面的命名就是T2H T2L......
保持了原来51的命名规则,后面是新的命名
isp自动产生定时程序
//任务3:按一下交替灯亮,按一下灯灭
if( P32 == 0 ) //判断P32按钮是否按下
{
Delay20ms(); //延时20ms消抖
if( P32 == 0 )
{
led_state=!led_state;
if(led_state==1) // 状态为1时,交换亮灯
{
Timer0_Init( ); //延时
}
else
{
TR0=0;
P00 = 0;
P01 = 0; //全部关掉
}
while( P32 == 0 ); //等待P32松开
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
led_state = !led_state; //变量取反 0 1 0 1 0 1,3秒P00状态改变一次
P00 = led_state;
P01 = !led_state;
}
课后小练
按键矩阵的学习
行列编程顺序
1.按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。
①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
③第三步:行列组合一下就可以判断出是哪个按键按下了。
void Task_1(void)
{
//①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
COL1 = 0;
COL2 = 0;
COL3 = 0;
COL4 = 0;
ROW1 = 1;
ROW2 = 1;
if(( ROW1 == 0 ) || ( ROW2 == 0 )) //如果行按键有按下
{
if(( ROW1 ==0 ) && ( ROW2 ==0 )) //如果两行都有按键按下,不处理
{
}
else if((( ROW1 ==1 )&&( ROW2 ==0 )) || (( ROW1 ==0 )&&( ROW2 ==1 ))) //如果有按键按下,而且只有一颗
{
if( ROW1 ==0 ) //判断哪一行,输出行开始的序号
key_num = 0;
else if( ROW2 ==0 )
key_num = 4;
//②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
COL1 = 1;
COL2 = 1;
COL3 = 1;
COL4 = 1;
ROW1 = 0;
ROW2 = 0;
if( COL1 ==0 ) //判断哪一列,叠加按键的序号
{
// key_num = key_num ;
}
else if( COL2 ==0 )
{
key_num = key_num + 1;
}
else if( COL3 ==0 )
{
key_num = key_num + 2;
}
else if( COL4 ==0 )
{
key_num = key_num + 3;
}
}
COL1 = 0;
COL2 = 0;
COL3 = 0;
COL4 = 0;
ROW1 = 1;
ROW2 = 1;
}
else
{
key_num = 0xff;
}
//③第三步:行列组合一下就可以判断出是哪个按键按下了。
}
页:
[1]