8051(c51)单片机从汇编到C语言,从Boot到应用[开源系列教程]

8051(c51)单片机从汇编到C语言,从Boot到应用开源系列教程

作者将狼才鲸
修改日期2024-07-23

一、仓库介绍

工程名作用
001_点亮一个LED灯从IO口输出高低电平,并使用Keil示波器查看输出,分别用汇编和C语言工程实现
002_延时与函数使用汇编进行精准的us和ms延时,用C语言进行大致的延时,介绍汇编函数传入的参数和返回值位置,C语言如何调用汇编函数,通过Keil示波器查看延时的准确度
…………
001-at89c51-simulator-1Keil 新建Hello world工程
002-at89c51-simulator-2使用汇编展示8051代码是从哪些地址开始运行的
002-at89c51-simulator-3使用汇编让定时器持续产生中断
002-at89c51-simulator-4使用汇编从IO输出波形,并用Keil模拟器查看输出(有图)
002-at89c51-simulator-5使用汇编从串口输出字符串,并通过Keil模拟器查看输出
002-at89c51-simulator-6使用汇编从Keil模拟器IO获取数据并进行响应(有图)
…………
01_Hello_world直接从Keil调试窗口中输出Hello world
02_Keil_boot_annotation对Keil自带的汇编boot源码进行注释
03_Assemble_register展示8051真正的程序入口, 和添加自定义寄存器头文件
04_Macro_func_and_irq展示汇编宏定义函数和中断处理
05_Assemble_hello_world用汇编从Keil调试窗口中输出Hello world
06_uart0_loopbackKeil调试输出窗口串口回环
  • 这是一个8051教学仓库。不使用具体的硬件,直接使用Keil做模拟器,使用虚拟串口做输入输出,直接在电脑上编译运行,保证不被硬件问题卡住,从Keil官网下载Keil软件后再下载此仓库,打开仓库里的工程运行程序后能直接看到结果。重点介绍8051的寄存器、指令集、Keil伪指令、汇编Boot、汇编编程套路、C语言编程套路、软件框架、通信框架。
  • 仓库中有多个Keil工程和源码,每个仓库都是独立的,能够直接打开、编译和运行。
  • 本仓库面向的人员有:
  1. 在学校学过《C51单片机原理(汇编)》、《C语言程序设计》等类似课程,但是并没有使用一款8051的芯片进行过商用的项目开发的。
  2. 使用一款8051芯片做过C语言的商用项目开发,但是对8051从芯片上电开始到main()函数执行前的boot流程不了解的。
  3. 没有进行过8051纯汇编编程的。
  4. 没有使用汇编从头开始写过8051的boot程序的。
  5. 主业是32位CPU的C语言开发,工作中临时接触到了8051芯片的编程,或者只是想复习一下8051相关的知识,特别是汇编逻辑的。
  6. 对Keil C51 C语言编程与一般32位 C语言的区别不清楚,不熟悉8051的数据类型、显式指明数据存放位置、8051大端与ARM小端的区别、8051 RAM和ROM最大容量限制、8051的串口等常用驱动寄存器与ARM差异的人员。

  • 为什么直接使用Keil中的模拟器来运行程序,而不选用一款8051的芯片?
  1. 编程习惯:
    在学习C语言过程中,或者单纯验证C语言纯逻辑功能时,可以直接使用GCC+Makefile、Qt或者VS(Microsoft Visual Studio)编译运行;一条printf就能验证编译环境的正确性。
    而如果使用带8051芯片的硬件,则搭建环境的过程中会遇到各种各样的问题,没有人指导的话经常会遇到瓶颈;购买开发板也需要额外的开支。
    如果是进行32位CPU的嵌入式开发,也有开源的QEMU模拟器可供使用。
  2. 工作习惯:
    在芯片原厂,当一款芯片正在开发中,还不能在FPGA上跑的时候,嵌入式软件工程师的工作也不会等着,往往是直接先用模拟器搭建软件工程,同步编写和测试程序。
  3. 节省时间,方便随时随地调试程序:
    只要不涉及到具体的硬件驱动编写,使用软件模拟器已经能模拟各种通讯驱动的逻辑和业务逻辑,只需要一台电脑,你就可以在家里、在外地都编写和调试代码。
  4. 普适性:
    嵌入式芯片各种各样,五花八门,没有谁能对所有的芯片都熟悉,而芯片的最大公约数:内核,在模拟器中已经能完美运行。如果是32位CPU,QEMU中已经能模拟USB、网络、串口、SPI、I2C、显示屏等各种外设;而Keil C51中也能模拟串口、IO,这对于学习软件逻辑已经够用了。
  5. 简单:
    打开Keil工程,直接运行就能在软件上看到串口输出的结果。

  • 为什么不选用Keil + Proteus的方式来模拟8051硬件?
  1. 的确是有一些单片机开发人员软件硬件都熟悉,能接受这种方式,但是大部分嵌入式软件开发人员,是没有硬件相关软件的使用经验的,Proteus大大增加了学习成本,而且以后的工作中也用不到。
  • 网上能搜到大量8051的教学文章,为什么还要编写这个仓库?
  1. 在网上能搜到的大量8051教程,都很多是学校里的那一套逻辑,分章节描述各种寄存器、汇编指令,没有形成一个完整的工程,不能开箱即用。
  2. 网上有很多8051的文章都是重复的,在查找时浪费时间。
  3. 我自己其实也是在学习8051的过程中,学到哪写到哪加深记忆,也方便以后时间久了以后遇到同样的问题能回来查阅。

二、环境准备及知识储备

  • 开始下一步前,你需要下载并安装Keil软件,并且了解Keil的基本使用。如果你只是看一下源码中的一些写法,并不需要实际运行程序看结果,则忽略此条。Keil软件安装的基本流程如下,其它安装教程的网址会在后面列出:
  1. 从官网下载Keil C51程序,这是一个IDE,集成了编辑器、编译器、链接器、模拟器。
  2. 下载地址 https://www.keil.com/demo/eval/c51.htm 需要注册并填写个人信息,评估版只支持编译2K容量的代码,但本仓库前面一部分的工程在2K范围内,可以直接运行和调试。
  3. 已经用过Keil的可以自行下载Keil破解版并进行破解。
  4. 安装过程中,安装路径不要有空格,不要有中文目录。
  5. 安装完成后打开“Keil uVision5”软件。
  • Keil安装与介绍参考链接
  1. 一是在Keil官网注册账号并下载Keil C51安装,但是安装好的软件只支持编译2K以内的程序。
    https://www.keil.com/demo/eval/c51.htm

  2. 二是安装破解的Keil C51。
    51单片机——如何安装Keil5(保姆级教程)
    【嵌入式学习】单片机入门——1.Keil安装(51版本)


四、工程与源码介绍

1、点亮一个LED灯

2、延时与函数

Passing in Registers

C functions may pass parameters in registers and fixed memory locations. A maximum of 3 parameters may be passed in registers. All other parameters are passed using fixed memory locations. The following tables define which registers are used for passing parameters.

Arg Numberchar, 1-byte ptrint, 2-byte ptrlong, floatgeneric ptr
1R7R6 & R7 (MSB in R6,LSB in R7)R4—R7R1—R3 (Mem type in R3, MSB in R2, LSB in R1)
2R5R4 & R5 (MSB in R4,LSB in R5)R4—R7R1—R3 (Mem type in R3, MSB in R2, LSB in R1)
3R3R2 & R3 (MSB in R2,LSB in R3)R1—R3 (Mem type in R3, MSB in R2, LSB in R1)

The following examples clarify how registers are selected for parameter passing.

DeclarationDescription
func1 ( int a)The first and only argument, a, is passed in registers R6 and R7.
func2 ( int b, int c, int *d)The first argument, b, is passed in registers R6 and R7. The second argument, c, is passed in registers R4 and R5. The third argument, d, is passed in registers R1, R2, and R3.
func3 ( long e, long f)The first argument, e, is passed in registers R4, R5, R6, and R7. The second argument, f, cannot be located in registers since those available for a second parameter with a type of long are already used by the first argument. This parameter is passed using fixed memory locations.
func4 ( float g, char h)The first argument, g, passed in registers R4, R5, R6, and R7. The second parameter, h, cannot be passed in registers and is passed in fixed memory locations.

Copyright © Keil, An ARM Company. All rights reserved.

001-at89c51-simulator-1

  • Keil 新建Hello world工程

002-at89c51-simulator-2

  • 使用汇编展示8051代码是从哪些地址开始运行的

002-at89c51-simulator-3

  • 使用汇编让定时器持续产生中断

002-at89c51-simulator-4

  • 使用汇编从IO输出波形,并用Keil模拟器查看输出

img

002-at89c51-simulator-5

  • 使用汇编从串口输出字符串,并通过Keil模拟器查看输出

002-at89c51-simulator-6

  • 使用汇编从Keil模拟器IO获取数据并进行响应
    img

1)Hello world输出

  • 本工程主要演示使用Keil创建一个R8051XC2的默认工程,使用Keil自带的Boot汇编文件,然后新建一个main.c文件,写一个printf函数 + 简单的串口0驱动,并能从软件窗口上看到printf的结果。

  • 创建工程的步骤详见章节“二、环境准备及知识储备”中“Keil创建工程”小节中的内容,你可以省掉这步,直接打开现有的工程。

  • 工程路径:本文档同级目录/01_proj_and_src/01_Hello_world/

  • 你可以直接双击打开 ./01_proj_and_src/01_Hello_world/01_Hello_world.uvproj工程

  • 然后编译:点击软件上面状态栏第三排左侧两个向下小箭头的图标。看到.\Objects\01_Hello_world" - 0 Error(s)表示编译通过。

  • 然后开始运行:点击软件上面状态栏第二排右侧黑色放大镜+红色“d”的小图标;如果你的软件是官网下载的未破解的评估版,会出现一个弹窗,关掉那个弹窗不管它;程序会停在main()函数的第一行,先不要继续运行。

  • 输出的结果会在Keil Debug状态下的UART #1窗口中;这个窗口Keil不会主动为你打开,你需要点击在软件上面第三排图标中的小串口带一个黑色串口的图标旁边的小三角形,选中里面的UART #1,然后软件右下角就会出现UART #1窗口。

  • 继续运行:点击软件左上角一个向下箭头的图标,UART #1窗口中出现了Hello world!的输出。

  • 额外的知识:

    • Keil输出窗口选项中,除了有UART #1、UART #2和UART #3外,还有一个Debug (Printf) Viewer窗口,这个窗口C51是用不了的,这是Keil MDK为ARM等芯片准备的,例如调试STM32时,不需要写串口驱动,而且直接写串口驱动还有点麻烦,而直接对fputc()函数进行重定向之后,能直接在这个窗口看到printf()的输出;这和在PC上直接写C语言程序有点类似,就更方便了。
  • *参考网址 *
    keil C51 重定向printf到串口

2)Keil自带的汇编boot源码解析注释

  • 本工程主要演示使用Keil创建一个R8051XC2的默认工程,使用Keil自带的Boot汇编文件,然后对这个STARTUP.A51进行注释。
  • 工程路径:本文档同级目录/01_proj_and_src/02_Keil_boot_annotation/
  • 你可以直接双击打开 ./01_proj_and_src/02_Keil_boot_annotation.uvproj/02_Keil_boot_annotation.uvproj工程

3)展示8051真正的程序入口, 和添加自定义寄存器头文件

  • 本工程主要演示使用Keil创建一个空工程,不使用Keil自带的boot汇编文件,也不使用Keil自带的寄存器头文件,而是自己添加一切文件,展示8051真正的程序入口,添加自定义寄存器头文件,顺便对8051的每个寄存器进行注释。
  • 工程文件:本文档同级目录/03_Assemble_register/03_Assemble_register.uvproj

4)展示汇编宏定义函数和中断处理

5)用汇编从Keil调试窗口中输出Hello world

6)Keil调试输出窗口串口回环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值