通过学习AI8051入门单片机
<h3>第一节</h3><p><strong>了解AI8051U的</strong></p>
<p><strong>1.可以刷新屏幕,帧率挺高。</strong></p>
<p><strong>2.可以兼容89C52</strong></p>
<p><strong>3.拥有16位PWM,12位ADC,接口多</strong></p>
<h3>第二节</h3>
<p><strong>1.了解AI8051U试验箱</strong></p>
<p><strong>有非常多的功能,各种串口,示波器输入、TF卡、音频输入输出、OLED屏、TFT屏、流水灯、数码管、红外发接装置、矩阵键盘和ACD键盘(省引脚)AI8H2K12U(可转双串口)</strong></p>
<p><strong>2.安装Keil</strong></p>
<p><strong>3.学习了用下载器,下载第一个程序</strong></p>
<h3>第三节 点亮第一个led灯</h3>
<p><strong>1.进行芯片选型</strong></p>
<p><strong>2.新建一个工程,先建立一个Project,建立几个空白的main.c添加到文件夹里,并双击添加进去,并根据手册进行一些配置,如果代码超过64k,要重新设置一些地址并且output——hex-386</strong></p>
<p><strong>3.添加头文件 #include<文件名.h> 或 #include“文件名,h”(现在文件夹内进行搜索),用下载器保存头文件到文件路径,学习一些基础语法</strong></p>
<p><strong>4.学习寄存器配置引脚口的模式根据手册,设置为准双向口。 还可以用下载器生成引脚口配置程序。</strong></p>
<p>5.程序</p>
<p>#include"AI8051U.h"//调用头文件</p>
<p>void main(void)<br />
{<br />
P0M1 = 0x00;<br />
P0M0 = 0x00; //P0端口为准双向口<br />
P4M1 = 0x00;<br />
P4M0 = 0x00; //P4端口为准双向口</p>
<pre><code> while(1)
{
P40 = 0;
P00 = 0;
P01 = 0;
P02 = 0;
}
</code></pre>
<p>}</p>
<p><strong>第四节 USB不停电下载</strong></p>
<p><strong>1.下载usb库函数,了解查询模式和中断模式,并按照生一节课学的,添加lib(c+h文件)到main.c目录下,添加.h文件。并添加到Group里。</strong></p>
<p><strong>2.按照示例代码,复制一些代码进main.c.P_SW2 第七位是EAXFR 0:禁止访问 1:使能访问P_SW2 = 全部覆盖P_SW2 |= 改某一位1,其他位置1不变 IE寄存器第七位赋值为1()usb允许中断</strong></p>
<p><strong>3.第一次下载还是要按按键,后面就不需要了</strong></p>
<p>4.代码</p>
<p>#include"AI8051U.h"//调用头文件<br />
#include"stc32_stc8_usb.h" //调用有文件</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = "@STCISP#";<br />
void main(void)<br />
{<br />
P_SW2 |= 0x80; //B7位写1,使能访问XFR<br />
P0M1 = 0x00; P0M0 = 0x00;<br />
P1M1 = 0x00; P1M0 = 0x00;<br />
P2M1 = 0x00; P2M0 = 0x00;<br />
P3M1 = 0x00; P3M0 = 0x00;<br />
P4M1 = 0x00; P4M0 = 0x00;<br />
P5M1 = 0x00; P5M0 = 0x00;<br />
P6M1 = 0x00; P6M0 = 0x00;<br />
P7M1 = 0x00; P7M0 = 0x00;<br />
usb_init(); //usb函数初始化<br />
IE2 |= 0x80; //使能USB中断<br />
EA = 1; //IE |= 0X80;</p>
<pre><code> while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P40 = 0;
P00 = 0;
P01 = 0;
P02 = 0;
P03 = 0;
P04 = 0;
}
</code></pre>
<h3>第五节 C语言基础</h3>
<ol>
<li><strong>printf函数的使用 #define 替换名和被替换名 printf("XXXX\r\n") 、\n\r换行</strong></li>
<li>**打开编译器,找到CDC/HID-串口助手,检测一下写的代码 printf("今天是%d年%d月%d日\r\n",24,11,16) 最后面逗号内会替换%d(%d:以十进制整数输出;%S输出字符串) **</li>
<li><strong>了解各种变量的长度 unsigned char ~ 0-255; unsigned short int ~ 0-+65535;signed int ~ -32768~32767 如何定义变量?#define u8 unsigned char ~用u8来代替unsighed char、</strong></li>
<li><strong>C语言常用运算符 x++自加1 x--自减1关系运算符 == 检查两个变量是否相等(x=y)为假 if(真) (A&&B)左右两边都真 则为真 (A||B)两个有一个为真,就为真(A&B)只有两个都是1才是1 (A|B)AB两个有1就是1 (A^B)相同为1不同为0 (~A)取反符号0变1 1变0</strong></li>
<li><strong>代码</strong></li>
</ol>
<p>#include"AI8051U.h"//调用头文件<br />
#include"stc32_stc8_usb.h" //调用有文件</p>
<p>#define u8 unsigned char//8位无符号定义(0~255)<br />
u8 x = 20;<br />
u8 y = 11;<br />
char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = "@STCISP#";<br />
void main(void)<br />
{<br />
P_SW2 |= 0x80; //B7位写1,使能访问XFR<br />
P0M1 = 0x00; P0M0 = 0x00;<br />
P1M1 = 0x00; P1M0 = 0x00;<br />
P2M1 = 0x00; P2M0 = 0x00;<br />
P3M1 = 0x00; P3M0 = 0x00;<br />
P4M1 = 0x00; P4M0 = 0x00;<br />
P5M1 = 0x00; P5M0 = 0x00;<br />
P6M1 = 0x00; P6M0 = 0x00;<br />
P7M1 = 0x00; P7M0 = 0x00;<br />
usb_init(); //usb函数初始化<br />
IE2 |= 0x80; //使能USB中断<br />
EA = 1; //IE |= 0X80;</p>
<pre><code> while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了一些数据
{
if(x && y ) //如果条件为真,输出什么
{
printf("条件为真\r\n");
}
else
{
printf("条件为假\r\n");
}
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// printf("x / y =%d\r\n",(u16)(x/y)); //强制转换为一个整数
// printf("x %% y =%d\r\n",(u16)(x%y)); //强制转换为一个整数
usb_OUT_done();
}
}
</code></pre>
<p>}</p>
<h3>第六节</h3>
<p>**1. GPIO-输入输出端口如果VCC接3.3 IO最高 3.6 注意输入电压最小值 IO口四种模式(1.准双向口 灌入20mA 拉电流270~150uA2.推挽输出20mA3.高阻输入 电流不灌入也不输出4.开漏模式)试验箱单片机是3.3v电源 对于这个单片机来说 低电平不能高于0.99 高电平不能低于1.18 **</p>
<p><strong>2.用按键要注意消抖,延时的一用法</strong></p>
<p>3.代码</p>
<pre><code>#include"AI8051U.h"//调用头文件
#include"stc32_stc8_usb.h" //调用有文件
#include"intrins.h"
#define u8 unsigned char//8位无符号定义(0~255)
u8 state = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void)
{
unsigned long edate i;
_nop_();
_nop_();
i = 119998UL;
while (1) i--;
}
void main(void)
{
WTST = 0;
EAXFR = 1;
CKCON = 0;
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函数初始化
IE2 |= 0x80; //使能USB中断
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了一些数据
{
usb_OUT_done();
}
//任务1.按下P32按钮灯亮,松开灯灭
if(P32 == 0)
{
Delay20ms(); //延时20ms
if( P32 == 0 )
{
state !=state;
P00 = state;
while(P32 == 0);
}
}
}
} usb_OUT_done();
}
//任务1.按下P32按钮灯亮,松开灯灭
if(P32 == 0)
{
Delay20ms(); //延时20ms
if( P32 == 0 )
{
state !=state;
P00 = state;
while(P32 == 0);
}
}
}
</code></pre>
Polaris 发表于 2024-12-25 14:11
第六节
**1. GPIO-输入输出端口如果VCC接3.3 IO最高 3.6 注意输入电压最小值 IO口四种模式( ...
作业1:
if(P32 == 0)
{
Delay20ms(); //延时20ms
if( P32 == 0 )
{
P00 = 0;
while(P32 == 0);
}
}
else if(P33 == 0)
{
Delay20ms(); //延时20ms
if( P33 == 0 )
{
P00 = 1;
while(P33 == 0);
}
} Polaris 发表于 2024-12-25 14:11
第六节
**1. GPIO-输入输出端口如果VCC接3.3 IO最高 3.6 注意输入电压最小值 IO口四种模式( ...
作业2:
if(P32 == 0)
{
Delay20ms(); //延时20ms
if( P32 == 0 )
{i = i++;
Pi = 0;
while(P32 == 0);
}
}
<h3>第七节 定时器</h3>
<p><strong>1.认识定时器(1,可实现软件计时,周期的完一项工作。2.代替长时间Delay,提高程序的效率和处理速度)可打断主循环</strong></p>
<p><strong>2./xfd 的用法 过 三 驱 数 等字</strong></p>
<p><strong>3。学习了定时器的原理,如何用公式计算看看定时器多久进一次</strong></p>
<p><strong>4.函数的定义内容和声明 调用</strong></p>
<p><strong>函数定义:包含返回值,函数名,入口参数,并定义了具体功能</strong></p>
<p><strong>声明:在头文件或被调用之前使用,注意末尾加分号</strong></p>
<p><strong>调用:在需要调用的地方直接使用函数名,加上括号和分号。如果有入口的参数,需要在括号的多个参数之间加逗号隔开</strong></p>
<p><strong>函数声明:void Delay20ms(void)</strong></p>
<p><strong>{</strong></p>
<p>** unsigned long edate i;**</p>
<p>** _nop_();**</p>
<p>** _nop_();**</p>
<p>** i = 119998UL; //执行119998次-- 实现20ms定时**</p>
<p>** while (1) i--;**</p>
<p><strong>}</strong></p>
<p><strong>返回值类型 函数名(入口参数);void Delay20ms(void);</strong></p>
<p><strong>函数名(入口参数);Delay20ms();</strong></p>
<hr />
第八节
①学习函数的定义声明调用
②学习了结构体的基本内容
③创建.c和.h文件,并关联路径
④用结构体方法+定时器 计数控制Led灯
返回值类型 函数名(入口参数)
{
//函数体
//函数执行代码
return 返回值;
}
void Delay20ms(void) //没有返回值 (viod 空)
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while(i)i--;
}
typedef struct //将结构体重命名 为最后面 TASK_COMPONENTS
{
u8 Run; //任务状态:Run/Stop
u16 TIMCount; //定时计数器
u16 TRITime; //重载计数器
void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;
页:
[1]
2