51单片机如何进行模块化编程

发布者:HarmoniousDream最新更新时间:2023-06-15 来源: elecfans关键字:51单片机  模块化编程  指令系统 手机看文章 扫描二维码
随时随地手机看文章

本文主要是关于51单片机的相关介绍,并着重对51单片机的原理及其模块化编程进行了详尽的阐述。


51单片机

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。


功能

·8位CPU·4kbytes程序存储器(ROM) (52为8K)

·128bytes的数据存储器(RAM) (52有256bytes的RAM)

·32条I/O口线·111条指令,大部分为单字节指令

·21个专用寄存器

·2个可编程定时/计数器·5个中断源,2个优先级(52有6个)

·一个全双工串行通信

·外部数据存储器寻址空间为64kB

·外部程序存储器寻址空间为64kB

·逻辑操作位寻址功能·双列直插40PinDIP封装

·单一+5V电源供电

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出

T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;

五个中断源的中断控制系统;

一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。

功能

·8位CPU·4kbytes程序存储器(ROM) (52为8K)

·128bytes的数据存储器(RAM) (52有256bytes的RAM)

·32条I/O口线·111条指令,大部分为单字节指令

·21个专用寄存器

·2个可编程定时/计数器·5个中断源,2个优先级(52有6个)

·一个全双工串行通信口区别

同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS,和WINBOND等,我们常说的已经停产的89C51指的是ATMEL公司的 AT89C51单片机,同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。

不过在市场化方面,89C51受到了PIC单片机阵营的挑战,89C51最致命的缺陷在于不支持ISP(在线更新程序)功能,必须加上ISP功能等新功能才能更好延续MCS-51的传奇。89S51就是在这样的背景下取代89C51的,89S51已经成为了实际应用市场上新的宠儿,作为市场占有率第一的Atmel公司已经停产AT89C51,将用AT89S51代替。89S51在工艺上进行了改进,89S51采用0.35新工艺,成本降低,而且将功能提升,增加了竞争力。89SXX可以向下兼容89CXX等51系列芯片。同时,Atmel不再接受89CXX的定单,大家在市场上见到的89C51实际都是Atmel前期生产的巨量库存而以。如果市场需要,Atmel当然也可以再恢复生产AT89C51。

89S51相对于89C51增加的新功能包括:

-- 新增加很多功能,性能有了较大提升,价格基本不变,甚至比89C51更低!

-- ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离。是一个强大易用的功能。

-- 最高工作频率为33MHz,大家都知道89C51的极限工作频率是24M,就是说S51具有更高工作频率,从而具有了更快的计算速度。

-- 具有双工UART串行通道。

-- 内部集成看门狗计时器,不再需要像89C51那样外接看门狗计时器单元电路。

-- 双数据指示器。

-- 电源关闭标识。

-- 全新的加密算法,这使得对于89S51的盗版变为不可能,程序的保密性大大加强,这样就可以有效的保护知识产权不被侵犯。

-- 兼容性方面:向下完全兼容51全部字系列产品。比如8051、89C51等等早期MCS-51兼容产品。也就是说所有教科书、网络教程上的程序(不论教科书上采用的单片机是8051还是89C51还是MCS-51等等),在89S51上一样可以照常运行,这就是所谓的向下兼容。

比较结果:就如同INTEL的P3向P4升级一样,虽然都可以跑Windows98,不过速度是不同的。从AT89C51升级到AT89S51 ,也是同理。和S51比起来,C51就要逊色一些,实际应用市场方面技术的进步是永远向前的。

·外部数据存储器寻址空间为64kB

·外部程序存储器寻址空间为64kB

·逻辑操作位寻址功能·双列直插40PinDIP封装

·单一+5V电源供电

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出

T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;

五个中断源的中断控制系统;

一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。

51单片机如何进行模块化编程

分模块的好处

首先,这是我在写万年历和温度传感器的时候,显然这是我经过收缩函数之后的程序

51单片机如何进行模块化编程

由上图可以看出,当我收缩函数的时候,代码已经到达了451行,而当我打开之后,函数就达到了上千行,你们想想,当你看着这一千多行的代码时,你能够方便的从中找出仅仅是一行的错误吗?这显然是不可能的。既然对于自己这个打代码的人都很难看得懂,更别说别人了!

而让我们来看看下面这个同样的程序

51单片机如何进行模块化编程

51单片机如何进行模块化编程

怎么样,是不是看得容易了许多。对于学过51单片机的人来说,他能知道:

第一个模块是主函数模块,第二个模块是液晶显示和数码管显示模块,第三个是时间延时模块,第四个是温度传感器模块。

而对于没学过的人来说呢,看我的模块名称他也能知道第一个是主函数模块,第二个是和显示有关的模块,而第三个是和时间有关的模块,最后一个虽然他不知道,但他可以百度对吧,就可以知道这是和温度传感器有关的模块。

这样一看,整个程序就非常的清晰,每个人都能看懂你的程序在哪定义了些什么。而这对于每个人日后的工作来说是至关重要的。想要让别人能看懂你的代码,就要好好的规划自己程序的模块怎么划分,才能让别人看的简单。对于所有想要从事有关于计算机的职业的人,只要你不是那种万中无一IT大佬,你都不可能独自完成整个软件的程序设计,公司里都会把整个程序分成许多的模块,让每个人完成各自的模块,最后再由专门的人员整合起来。对于现在的我们来说,养成写程序分模块的习惯尤为重要。

接下来讲讲干货

首先你得有主函数的模块,(这个最后整合了之后再讲)然后是其他的模块。

先来讲讲分模块。开始你要建立一个工程,对于单片机来说,只要在工程文件下建立就

51单片机如何进行模块化编程

在自己的工程文件下建立 .c 的文件就可以(名字用小写)。

(对于c语言来说主模块和其它模块是不建到一起的,这个本人用的是VS2017而且学的时间不长,所以就是在这随口提一下。)

(以delay模块为例)

创建好了 .c 文件后,我们把.c文件添加进工程中,之后还需要在创建一个 .h 的文件(假如你的.c文件是delay.c那么你的.h文件必须为delay.h的文件,且这个文件要与.c的文件放在同一个文件夹中)类似以下这样


接下来就先讲讲.c的文件

51单片机如何进行模块化编程

首先要写的就是 #include“delay.h” 记住这个函数必须要有,它所添加的就是我们刚刚建立的那个.h的文件,通过这个函数我们把它们关联起来(其他的学过c语言的应该都知道,添加需要的库,恒定义,创建一些需要使用的函数)

接下来就是重点的.h文件

51单片机如何进行模块化编程

基本的写法就是

#ifndef __(你所定义的.h文件的大写)_H__

#define __(你所定义的.h文件的大写)_H__

这里的东西是你之前在.c文件中定义过的函数(记住不要全部复制,只需复制开头的函数)

#endif

51单片机如何进行模块化编程

大体上就是这样的,只需要复制开头的函数,不过切记,函数后面的分号千万千万千万别忘了

好了这就是一个时间的模块了,其它的模块也一样,接下来就到最重要的一步---整合

51单片机如何进行模块化编程

在main函数也就是主函数当中,当我们需要使用我们之前定义的函数的时候,我们就需要在开头把函数所在的文件添加进去,正如我所写的

#include“display.h” #include“delay.h” #include“de18b20.h”

其余的就是与你的主函数写的程序相关的东西

其它模块的互相关联

其它的模块也可以像主模块那样关联起来的

51单片机如何进行模块化编程

就拿我上面这个ds18b20的.c文件来讲,在它的函数里是需要用到延时的函数的,而延时函数是定义在delay模块里的,因此我们需要添加delay的模块才能使用我们定义延时函数,所以就有了 #include “delay.h”


关键字:51单片机  模块化编程  指令系统 引用地址:51单片机如何进行模块化编程

上一篇:at89s52最小系统图 单片机最小系统介绍与设计
下一篇:80C51单片机内部定时器和计数器的结构及原理解析

推荐阅读最新更新时间:2024-11-11 11:52

51单片机程序——定时器控制LED闪烁
#include reg52.h #define uint unsigned int uint i=0; void delay(uint z) //延迟函数 { uint x,y; for(x=z;x 0;x--) for(y=20;y 0;y--); } void main (void) { TMOD=0x10; //TMOD赋值,以确定T0和T1的工作方式 TH1=(65536-50000)/256; //计算初值,并将其写入TH0、TL0或TH1、TL1 TL1=(65536-50000)%6; EA=1; //打开总中
[单片机]
51单片机UART通信程序
用到的特殊寄存器: SM0 SM1:工作方式控制 01 工作方式1 1起始位 8数据位 1停止位 波特率可变 TI:发送中断位 TI=1 发送完成,软件置0 RI:接收中断位 RI=1 接收完成,软件置0 REN:接收使能 SBUF:缓冲区 PCON最高位SMOD 置1 波特率加倍,0正常 定时器使用模式2 ,10 8位自动增补 代码如下: #include reg52.h typedef unsigned char uint8; typedef unsigned int uint16; sbit left=P1^2; uint8 message; void delay42ms(void) //误差 -0.217013
[单片机]
<font color='red'>51单片机</font>UART通信程序
MCS-51单片机串行口工作方式与波特率计算举例
1)方式0 方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。 实际应用在串行I/O口与并行I/O口之间的转换。 2)方式1 方式1是点对点的通信方式。8位异步串行通信口,TXD为发送端,RXD为 接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。 在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必
[单片机]
利用51单片机实现简单射频无线识别装置系统
1 引言 射频识别是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据。射频识别工作无须人工干预,非接触,阅读速度快,无磨损,不受环境影响,寿命长,便于使用。目前,射频识别技术在国外发展非常迅速,射频识别产品种类繁多,已广泛用于工业自动化、商业自动化、交通运输控制管理等众多领域,如汽车、火车等交通监控;高速公路自动收费系统;停车场管理系统;物品管理;仓储管理;车辆防盗等。由于我国射频识别技术起步较晚,除用于中国铁路的车号自动识别系统外,仅限于射频公交卡的应用。 在此,给出一种实现简单射频识别系统的方式。阅读器和应答器均包含在单片机控制系统中,利用2ASK调制与解调电路以及匹配网络电路,使整个系统的可识别有
[单片机]
利用<font color='red'>51单片机</font>实现简单射频无线识别装置系统
浮点数传送--MCS-51单片机实用子程序
FMOV 功能:浮点数传送 入口条件:源操作数在 中,目标地址为 。 出口信息: = , 不变。 影响资源:A 堆栈需求: 2字节 FMOV: INC R0 INC R0 INC R1 INC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A RET
[单片机]
为什么51单片机晶振使用11.0592
用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的。 所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大
[单片机]
51单片机存储程序和数据
初学51总是会有这样的疑问,从电脑下载程序到开发板后,程序去哪了? C51中,用户或应用程序,系统程序和数据都是存放在哪的? 51单片机从物理结构上,可分为片内,片外程序存储器,片内片外数据存储器。 51单片机从功能上,有程序存储器,片内数据存储器,特殊功能寄存器,位地址空间,片外数据存储器。 程序存储器 51单片机的程序存储器用于存储代码和一些固定表格常数。 可寻址的程序存储器空间为64KB。 51单片机的从物理角度上可分为:片内,片外程序存储器,作为编址空间,编址规律是:先片内,后片外,片内片外连续,不重叠。 如图:为51单片机程序存储器编址图。 单片机如何执行指令? 如图: 无论片内程序存储器,还是片外程
[单片机]
<font color='red'>51单片机</font>存储程序和数据
51单片机中断心得整理
如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题: 1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。 2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组, 在ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。用reentranr指明可重入函数。 3、如果不用 using 指定,在 ISR 的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令: MOV PSW #0 这点保证了,没使用 using 指定的高优先级中断。可以
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved