AI8051U单片机,从入门到精通(2):单片机C语言main函数的基本程序结构与编程方法
本帖最后由 杨为民 于 2024-8-14 15:00 编辑本文首先介绍了单片机C语言的main函数的基本程序结构,然后介绍了C语言无限循环程序的面向过程和面向结构两种不同的编程方法,最后给出了检验自己是否掌握知识点的测试程序。一、STC单片机入门基础(1)下图是学习STC8051U单片机的最小系统:
它由一片STC8051U单片机、8个连接在P1或者P0端口上的8个下拉LED管和一个STC自动烧录器组成。(2)烧录器同时也是串口1转电脑USB的转换器,通过电脑上的STC-ISP单片机辅助开发系统(MCU Assisted DevelopmentSystem)软件中的串口助手,STC单片机可以实现“scanf”和“printf”等C语言人机交互语句。这样,几乎全部的大学C语言教材和C语言等级考试的内容都可以在STC单片机上实现,这就为初学者开启了一扇学习单片机C语言的大门。(3)单片机最大的特点是可以按端口和按位直接控制各种机电外部设备,最小系统中的发光二极管可以用直观的视觉来模拟控制效果,这一部分内容是PC机上C语言所没有的,也是单片机学习者重点要关注的内容。(4)STC-ISP软件是学习STC单片机必须掌握的的开发工具。STC-ISP的功能不仅只是将HEX或BIN格式的机器码烧录文件烧录的STC单片机中,并且还包括了一系列的辅助用户学习、研究和开发STC单片机的功能。(5)笔者认为Keil的C51编译器和集成开发环境软件未来很长一段时间仍然是STC的以8051内核为基础的8位单片机的主要软件开发工具。STC8位单片机系列包括从经典的STC89系列单片机到最新的STC8H系列单片机。(6)STC8051U单片机有两种工作模式:32位指令和8位指令。不过STC8051U即使工作在8-bit的CPU指令模式,由于其已经加入了MDU32和TFPU的32位运算器,已经不是传统的8位8051单片机了,而是具有16位地址总线和32位运算寄存器的80351-L1类型的32位单片机了。由于STC8051U的32位运算扩展部分采用了巧妙的驱动方式,通过添加STC8051U的MCU驱动程序的方法,Keil的C251/C51编译器就可以支持这些新的32位功能,使其继续作为STC8051U单片机的主流开发软件。(7)学习STC8051U编程从入门到精通,分为三个层次:C语言编程、汇编语言编程和RTOS编程。C语言编程主要使用C51/C251编译器,汇编语言编程主要使用长缨编译器,RTOS编程则两种编译器都会涉及。
(8)任何入门都是要基础的,下面的视频是本次讲座的第一个程序“电子节拍器”的运行效果:attach://52970.mp4
本系列讲座的入门基础是读者能够将附件中的已经写好的实验1的程序编译通过,然后以33.1776MHz的主频烧录到STC8051U单片机上,显示出视频中的效果。(当然端口不一定是连接在P1上,可以修改程序中的输出端口为读者开发板上的实际的口)二、单片机C语言基本程序结构(9)以“main”为名字的函数被称为单片机的“主程序”或者“主函数”。通常一个完整的、可以运行的、实现某个功能的STC单片机程序都包括多个函数甚至多个源程序文件,就像一个住宅有多个房间,一辆汽车包含多个部分一样。(10)本次学习请读者只关注主程序的内容,本文也只讲解主程序的内容,请忽略其他程序内容。就像某次课堂你学习客厅设计,则就别去看其他房间了,就像你学习上坡起步,就别去打开引擎盖了。
(11)下图是实验1的主程序:
其中驱动程序函数“STC8U_DRV_PX_Init”是将STC8051U的8个端口统统设置为“准双向口模式”,驱动程序函数“STC8U_DRV_QBeat”是延时四分之一个节拍。(12)没有操作系统支持的单片机程序称为“裸机程序”。对于裸机程序,“main”函数是用户程序的入口。STC单片机C语言主程序分为两个部分:程序开始的“系统设置”部分和“任务主循环”部分,这就是“单片机C语言基本程序结构”。(13)单片机裸机主函数main与PC机上操作系统支持的C语言主函数不同,既没有输入参数,也没有返回值。首先单片机的引导程序(BOOT)在对变量区域清零和设置系统堆栈(SP)之后,就跳转到main函数开始处执行,没有提供任何输入参数,因此main函数没有输入参数。其次单片机main函数也不允许退出,所以也就没有返回值。(14)主程序的系统设置部分从main函数入口开始,到主循环开始结束。这部分程序完成对单片机系统的硬件、软件和数据的初始化。本实验1只有第25这一行程序,将STC8051U的8个端口统统设置为“准双向口模式”。(15)主程序的任务主循环部分从图1的第28行开始到第42行程序为止。单片机CPU按照程序次序一行行往下执行:1)首先第30行将P0端口的左半边LED点亮,第31行将P1端口的左半边LED点亮。这两行程序的执行速度很快,一般小于0.1微秒,可以视作是同时发生的。2)然后第32行延时四分之一拍,第33行又延时四分之一拍,左边的LED灯持续亮了半拍。3)再然后第36行将P0端口的右半边LED点亮,第37行将P1端口的右半边LED点亮。这两行程序的执行速度很快,一般小于0.1微秒,可以视作是同时发生的。4)再然后第38行延时四分之一拍,第39行又延时四分之一拍,右边的LED灯持续亮了半拍。5)最后CPU执行第42行程序进行跳转,跳转到标号“Main_Loop”,然后从该标号后一行程序开始执行。(16)上面程序中的第28行标号和第42行的“goto”跳转语句组成的一个无限循环的过程,其中的从第30行到第39行之间的程序被一遍遍地执行,这个结构在C语言中称为“无限循环”(也称无条件循环)程序结构。(17)根据上面一步一步地描述,可以让读者了解CPU执行C语言程序的过程,因此用“标号语句”加“向前跳转的goto语句”组成的无限循环程序的实现方法也称为“面向过程”的程序设计方法。三、C语言无限循环程序结构
(18)在目前流行的C语言程序中,无限循环程序也被写成另外的形式。下图是实验2的主程序:
对比图1和图2,后一个程序是将前面第28行的标号语句换为“while(1) {”语句,或者换为“for(;;) {”语句,然后将第42行的“goto”语言换为右括号“}”。这种无限循环程序的实现方法称为“面向结构”的编程方法。(19)传统的编程方法是面向过程的方法,该方法直观地反映了计算机对程序的执行过程。上世纪80年代后期国内开始流行面向结构的Pascal语言和面向对象的C++语言,面向结构和面向对象的编程方法开始占据程序设计的主要地位。从此后的培养的计算机人才和教科书几乎看不到面向过程的编程方法了。(20)面向结构和面向对象的程序主要特色是在程序中避免使用“goto”语句,比如在C语言中的循环等语法结构中使用“break”和“continue”语句来控制程序流向。因此就出现了“while(1){... }”和“for(;;){ ...}”这样的无限循环语法结构。
(21)C语言中的无限循环这两种编程方法通过C51编译器编译出来的汇编语言都是一样的,没有谁好谁坏的分别。下图是图1程序的编译结果:
下图是图2程序的编译结果:
对比这两个汇编语言程序,区别只是后者C51编译器在第28行程序出内部添加了一个临时标号“?C0001”,使得后面的SJMP(goto语句)指令有一个具体的跳转地址。(22)避免使用goto语句的理由主要是避免程序员无意中将程序流转移到像循环语句这样的结构体中,产生不可预料的系统崩溃。但坚持使用goto理由是让资深程序员用它有意地转移到结构体中实现特殊的程序目标。比如在某个多任务程序中有多个节拍器控制音乐的多个声部,程序员就可以用goto语句将各个任务的程序流跳转到指定的语句,实现各个声部的同步或者错半拍。 四、检验掌握本文知识点的测试程序(23)测试程序1:修改程序,使得奇数LED和偶数LED交替闪烁。
(23)测试程序2:修改程序,使得第1、2与3、4个LED灯交替闪烁,第5、6与7、8个LED灯交替闪烁。
附件:
很多编程教程上都不建议使用goto指令。所以感觉还是不使用goto为上。 之前使用汇编时用过goto,使用c编程没有用过goto。 STC-ISP单片机辅助开发系统,给个链接吧。 zmc419 发表于 2024-11-3 06:28
STC-ISP单片机辅助开发系统,给个链接吧。
就是官方的ISP下载软件,已经具备了很多的功能了。现在版本是:AIapp-ISP V6.94V
见网页顶部的“资源下载”
https://www.stcaimcu.com/plugin.php?id=mdown:index#/
期待后续,谢谢讲解,辛苦了
页:
[1]