Polaris 发表于 2024-12-22 18:29:55

通过学习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>

Polaris 发表于 2024-12-23 10:08:13

<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>

Polaris 发表于 2024-12-23 10:53:38

<h3>第三节 点亮第一个led灯</h3>
<p><strong>1.进行芯片选型</strong></p>
<p><strong>2.新建一个工程,先建立一个Project,建立几个空白的main.c添加到文件夹里,并双击添加进去,并根据手册进行一些配置,如果代码超过64k,要重新设置一些地址并且output——hex-386</strong></p>
<p><strong>3.添加头文件 #include&lt;文件名.h&gt; 或 #include“文件名,h”(现在文件夹内进行搜索),用下载器保存头文件到文件路径,学习一些基础语法</strong></p>
<p><strong>4.学习寄存器配置引脚口的模式根据手册,设置为准双向口。 还可以用下载器生成引脚口配置程序。</strong></p>
<p>5.程序</p>
<p>#include&quot;AI8051U.h&quot;//调用头文件</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>

Polaris 发表于 2024-12-23 11:34:03

<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&quot;AI8051U.h&quot;//调用头文件<br />
#include&quot;stc32_stc8_usb.h&quot; //调用有文件</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;<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>

Polaris 发表于 2024-12-23 18:56:43

<h3>第五节 C语言基础</h3>
<ol>
<li><strong>printf函数的使用 #define 替换名和被替换名 printf(&quot;XXXX\r\n&quot;) 、\n\r换行</strong></li>
<li>**打开编译器,找到CDC/HID-串口助手,检测一下写的代码 printf(&quot;今天是%d年%d月%d日\r\n&quot;,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&amp;&amp;B)左右两边都真 则为真 (A||B)两个有一个为真,就为真(A&amp;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&quot;AI8051U.h&quot;//调用头文件<br />
#include&quot;stc32_stc8_usb.h&quot; //调用有文件</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 = &quot;@STCISP#&quot;;<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 &amp;&amp; y ) //如果条件为真,输出什么
                       {
                                     printf(&quot;条件为真\r\n&quot;);
                       }
                       else
                       {
                                     printf(&quot;条件为假\r\n&quot;);
                       }
               
               //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                //        printf(&quot;x / y =%d\r\n&quot;,(u16)(x/y)); //强制转换为一个整数
                        // printf(&quot;x %% y =%d\r\n&quot;,(u16)(x%y)); //强制转换为一个整数
               usb_OUT_done();
          }

        }
</code></pre>
<p>}</p>

Polaris 发表于 2024-12-25 14:11:52

<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&quot;AI8051U.h&quot;//调用头文件
#include&quot;stc32_stc8_usb.h&quot; //调用有文件
#include&quot;intrins.h&quot;

#define u8 unsigned char//8位无符号定义(0~255)

u8 state = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;

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:12:14

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:12:49

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);
          }
          }
         

Polaris 发表于 2024-12-25 15:54:23

<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 />

Polaris 发表于 2025-2-4 19:02:13

第八节
①学习函数的定义声明调用
②学习了结构体的基本内容
③创建.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
查看完整版本: 通过学习AI8051入门单片机