找回密码
 立即注册
查看: 541|回复: 16

通过学习AI8051入门单片机

[复制链接]

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-22 18:29:55 | 显示全部楼层 |阅读模式

第一节

了解AI8051U的

1.可以刷新屏幕,帧率挺高。

2.可以兼容89C52

3.拥有16位PWM,12位ADC,接口多

回复

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-23 10:08:13 | 显示全部楼层

第二节

1.了解AI8051U试验箱

有非常多的功能,各种串口,示波器输入、TF卡、音频输入输出、OLED屏、TFT屏、流水灯、数码管、红外发接装置、矩阵键盘和ACD键盘(省引脚)AI8H2K12U(可转双串口)

2.安装Keil

3.学习了用下载器,下载第一个程序

回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-23 10:53:38 | 显示全部楼层

第三节 点亮第一个led灯

1.进行芯片选型

2.新建一个工程,先建立一个Project,建立几个空白的main.c添加到文件夹里,并双击添加进去,并根据手册进行一些配置,如果代码超过64k,要重新设置一些地址并且output——hex-386

3.添加头文件 #include<文件名.h> 或 #include“文件名,h”(现在文件夹内进行搜索),用下载器保存头文件到文件路径,学习一些基础语法

4.学习寄存器配置引脚口的模式根据手册,设置为准双向口。 还可以用下载器生成引脚口配置程序。

5.程序

#include"AI8051U.h" //调用头文件

void main(void)
{
P0M1 = 0x00;
P0M0 = 0x00; //P0端口为准双向口
P4M1 = 0x00;
P4M0 = 0x00; //P4端口为准双向口

	while(1)
	{
	 P40 = 0;
	 P00 = 0;
	 P01 = 0;
	 P02 = 0;
	}

}

回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-23 11:34:03 | 显示全部楼层

第四节 USB不停电下载

1.下载usb库函数,了解查询模式和中断模式,并按照生一节课学的,添加lib(c+h文件)到main.c目录下,添加.h文件。并添加到Group里。

2.按照示例代码,复制一些代码进main.c.P_SW2 第七位是EAXFR 0:禁止访问 1:使能访问P_SW2 = 全部覆盖 P_SW2 |= 改某一位1,其他位置1不变 IE寄存器第七位赋值为1()usb允许中断

3.第一次下载还是要按按键,后面就不需要了

4.代码

#include"AI8051U.h" //调用头文件
#include"stc32_stc8_usb.h" //调用有文件

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
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;

	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;
	}
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-23 18:56:43 | 显示全部楼层

第五节 C语言基础

  1. printf函数的使用 #define 替换名 和被替换名 printf("XXXX\r\n") 、\n\r换行
  2. **打开编译器,找到CDC/HID-串口助手,检测一下写的代码 printf("今天是%d年%d月%d日\r\n",24,11,16) 最后面逗号内会替换%d(%d:以十进制整数输出;%S输出字符串) **
  3. 了解各种变量的长度 unsigned char ~ 0-255; unsigned short int ~ 0-+65535;signed int ~ -32768~32767 如何定义变量?#define u8 unsigned char ~用u8来代替unsighed char、
  4. 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
  5. 代码

#include"AI8051U.h" //调用头文件
#include"stc32_stc8_usb.h" //调用有文件

#define u8 unsigned char //8位无符号定义(0~255)
u8 x = 20;
u8 y = 11;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
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;

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

	}

}

回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-25 14:11:52 | 显示全部楼层

第六节

**1. GPIO-输入输出端口 如果VCC接3.3 IO最高 3.6 注意输入电压最小值 IO口四种模式(1.准双向口 灌入20mA 拉电流270~150uA2.推挽输出20mA3.高阻输入 电流不灌入也不输出4.开漏模式) 试验箱单片机是3.3v电源 对于这个单片机来说 低电平不能高于0.99 高电平不能低于1.18 **

2.用按键要注意消抖,延时的一用法

3.代码

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

}
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-25 14:12:14 | 显示全部楼层
Pola*** 发表于 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);
          }
          }
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-25 14:12:49 | 显示全部楼层
Pola*** 发表于 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);
          }
          }
         
回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 2024-12-25 15:54:23 | 显示全部楼层

第七节 定时器

1.认识定时器(1,可实现软件计时,周期的完一项工作。2.代替长时间Delay,提高程序的效率和处理速度)可打断主循环

2./xfd 的用法 过 三 驱 数 等字

3。学习了定时器的原理,如何用公式计算看看定时器多久进一次

4.函数的定义内容和声明 调用

函数定义:包含返回值,函数名,入口参数,并定义了具体功能

声明:在头文件或被调用之前使用,注意末尾加分号

调用:在需要调用的地方直接使用函数名,加上括号和分号。如果有入口的参数,需要在括号的多个参数之间加逗号隔开

函数声明:void Delay20ms(void)

{

** unsigned long edate i;**

** _nop_();**

** _nop_();**

** i = 119998UL; //执行119998次-- 实现20ms定时**

** while (1) i--;**

}

返回值类型 函数名(入口参数);void Delay20ms(void);

函数名(入口参数); Delay20ms();


回复 支持 反对

使用道具 举报 送花

2

主题

20

回帖

82

积分

注册会员

积分
82
发表于 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;   
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 04:08 , Processed in 0.168597 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表