结构很规矩,这个程序。
首先单片机上电复位,运行死循环前面的程序(,你这里就是init_timer(); // 应该叫初始化定时器,才合适,让定时器按照你需要的定时长度工作,或叫产生中断 )
接下来单片机主程序就是一直在死循环了。我们的主要任务一般在这里处理。
中断,就是在处理一些特殊任务,比如按键,或定时处理的程序,或外部一个不知道什么时间发生的任务,或通信任务等等。你在主循环的时候,无论在什么时候,中断请求来了(可以理解为需要处理比较紧急任务,优先处理的任务),就会暂停主循环,进入对应中断服务程序。运行完,在回主循环的暂停地方,继续执行死循环的任务。
定时器中断,就是每过一定时间,运行一下中断服务程序。常用来计时和产生脉冲信号。
初始化定时器,就是给定时器的寄存器,设置工作模式,时钟源,溢出的计数值。设置好了,定时器就能根据每个时钟源的频率,进行计数,直至溢出,然后产生一个中断请求。如果不饿能自动加载计数初值的定时器,在中断处理函数(服务函数)必须手动加载初值。
电源模块、片内功能模块、外部存储模块、键盘输入模块、LCD显示模块、串口通信模块、USB通信模块、远程通信模块、A\D、D\A模块、电机控制模块、近距离无线通讯模块、频率信号发生模块、传感器模块、语音处理模块、系统安全模块等
1:C51编译器如何区分位地址和字节地址
是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P00位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:
C51语句: P0 = 1;
P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P00脚将输出高电平(其实是呈现高阻态,P0口独有的),其他1-7脚输出低电平。
C51语句: P0_0 = 1;
P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P00将输出高阻态。而P01-7不会变化。
2:C51为什么要嵌套汇编
51单片机一个显著优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:
汇编程序单独保存一个文件,加入到工程中,函数如下:
_proc_a:
mov a, r7
inc a
mov r7, a
ret
用c语言在h文件中声明: extern unsigned char proc_a(unsigned char val);
调用时形如: retvalue = proc_a(0x11);
说明:
a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。
b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。
d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。
这应该是与该产品产量相关,产量大了价格就下来了。另外单片机上的WiFi模块需要提供源程序也要代价的,成品WiFi只提供驱动,不提供调试接口和示例程序以及技术支持。
5km这样比较远的视频图像传输,需要对图像进行必要的压缩,可选用有线或WiFi连接的互联网进行传输,这样距离就不是问题了。比如有产品就是通过局域网或国际互联网实现远程视频监控(老美监控伊拉克核设施、朝鲜核设施等),隔壁婴儿睡觉情况通过手机查看,等等。
WiFi的优势在于传输距离可达到百米范围且支持多用户端互联,蓝牙距离短、单设备接入,但连接比较便捷。
随着单片机硬件性能的提高,编写应用程序更着重于程序本身的效率。
Franklin或KEIIC51交叉编译器是专为51系列单片机设计的一种高效的C语言编译器,用其开发的应用程序易于维护,可移植性好,是目前较流行的51系列单片机的开发工具。
一、C51语言程序设计的基本技巧
首先,C51语言程序设计要尽可能采用结构化的设计方法。可将整个程序按功能分成若干个模块,不同的模块完成不同的功能。对于不同的功能模块,分别指定相应的入口参数和出口参数,而经常使用的一些程序最好编成函数,这样既不会引起整个程序管理的混乱,还可使程序的可读性、移植性增强。
C51语言的主程序结构:
#include
main0{while(1);}
这是最小的C程序,包括头部文件和程序主体。头部文件为引用的外部资源文件,包括硬件信息和外部模块提供的可使用的函数和变量的说明。
语句定义后,就可以在C语言程序中像汇编一样使用这些硬件设备。
在C5l中常用项目来管理,项目一般分为C文件块和头部文件块,常把不同的功能写在不同的C文件中,依靠项目的管理,最后把所有文件连接起来,这样就可以得到烧录的HEX文件或BIN文件。没有在头部文件中列出的文件,可以算是该C文件的内部函数和变量,外部C不能使用。另外,在程序设计过程中要充分利用C51语言的预处理命令。
对于一些常用的常数,如TRUE、FAlSE、PI,以及各种特殊功能寄存器,或程序中一些重要的依据外界条件可变的常量,可采用宏定义(#de-fine)或集中起来放在一个头文件中进行定义,再采用文件包含命令(#in-elude)将其加入到程序中,这样当需要修改某个参量时,只需修改相应的包含文件或宏定义,而不必对使用它们的每个程序文件都进行修改,有利于文件的维护和更新。
举例:利用宏定义和条件编译,源程序不作任何修改就可适用于不同时钟频率的单片机系统,并可根据情况的不同取不同的delay值,完成不同的目的。程序如下:
#define flag 1#ifdef flag==l#define fose 6Mdelay=10;#elif flag==0#define fose 8Mdelay=12;#else#define fosc 12Mdelay=20;#endiFMain0{ for(I=O;l
关键字
用 途
说 明
auto
存储种类说明
用以说明局部变量,缺省值为此
break
程序语句
退出最内层循环
case
程序语句
Switch语句中的选择项
char
数据类型说明
单字节整型数或字符型数据
const
存储类型说明
在程序执行过程中不可更改的常量值
continue
程序语句
转向下一次循环
default
程序语句
Switch语句中的失败选择项
do
程序语句
构成dowhile循环结构
double
数据类型说明
双精度浮点数
else
程序语句
构成ifelse选择结构
enum
数据类型说明
枚举
extern
存储种类说明
在其他程序模块中说明了的全局变量
flost
数据类型说明
单精度浮点数
for
程序语句
构成for循环结构
goto
程序语句
构成goto转移结构
if
程序语句
构成ifelse选择结构
int
数据类型说明
基本整型数
long
数据类型说明
长整型数
register
存储种类说明
使用CPU内部寄存的变量
return
程序语句
函数返回
short
数据类型说明
短整型数
signed
数据类型说明
有符号数,二进制数据的最高位为符号位
sizeof
运算符
计算表达式或数据类型的字节数
static
存储种类说明
静态变量
struct
数据类型说明
结构类型数据
swicth
程序语句
构成switch选择结构
typedef
数据类型说明
重新进行数据类型定义
union
数据类型说明
联合类型数据
unsigned
数据类型说明
无符号数数据
void
数据类型说明
无类型数据
volatile
数据类型说明
该变量在程序执行中可被隐含地改变
while
程序语句
构成while和dowhile循环结构
附表1-1 ANSIC标准关键字
关键字
用 途
说 明
bit
位标量声明
声明一个位标量或位类型的函数
sbit
位标量声明
声明一个可位寻址变量
Sfr
特殊功能寄存器声明
声明一个特殊功能寄存器
Sfr16
特殊功能寄存器声明
声明一个16位的特殊功能寄存器
data
存储器类型说明
直接寻址的内部数据存储器
bdata
存储器类型说明
可位寻址的内部数据存储器
idata
存储器类型说明
间接寻址的内部数据存储器
pdata
存储器类型说明
分页寻址的外部数据存储器
xdata
存储器类型说明
外部数据存储器
code
存储器类型说明
程序存储器
interrupt
中断函数说明
定义一个中断函数
reentrant
再入函数说明
定义一个再入函数
using
寄存器组定义
定义芯片的工作寄存器
附表1-2 C51编译器的扩展关键字
附录二 AT89C51特殊功能寄存器列表(适用于同一架构的芯片)
符 号
地 址
注 释
ACC
E0H
累加器
B
F0H
乘法寄存器
PSW
D0H
程序状态字
SP
81H
堆栈指针
DPL
82H
数据存储器指针低8位
DPH
83H
数据存储器指针高8位
IE
A8H
中断允许控制器
IP
D8H
中断优先控制器
P0
80H
端口0
P1
90H
端口1
P2
A0H
端口2
P3
B0H
端口3
PCON
87H
电源控制及波特率选择
SCON
98H
串行口控制器
SBUF
99H
串行数据缓冲器
TCON
88H
定时器控制
TMOD
89H
定时器方式选择
TL0
8AH
定时器0低8位
TL1
8BH
定时器1低8位
TH0
8CH
定时器0低8位
TH1
8DH
定时器1高8位
带号的特殊功能寄存器都是可以位寻址的寄存器
单片机到底是什么呢?就是一个电脑,只不过是微型的,麻雀虽小,五脏俱全:它内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可用它来做一些控制电器一类不是很复杂的工作足矣了。排烟罩VCD等等的家电里面都可以看到它的身影!它主要是作为控制部分的核心部件。\x0d\单片机是靠程序工作的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!\x0d\由于单片机对成本是敏感的,所以目前占统治地位的软件还是最低级汇编语言(近几年,C语言也开始广泛被应用),它是除了二进制机器码以上最低级的语言了,既然这么低级为什么还要用呢?很多高级的语言已经达到了可视化编程的水平为什么不用呢?原因很简单,就是单片机没有家用计算机那样的CPU,也没有像硬盘那样的海量存储设备。一个可视化高级语言编写的小程序里面即使只有一个按钮,也会达到几十K的尺寸!对于家用PC的硬盘来讲没什么,可是对于单片机来讲是不能接受的。单片机在硬件资源方面的利用率必须很高才行,所以汇编虽然原始却还是在大量使用。一样的道理,如果把巨型计算机上的 *** 作系统和应用软件拿到家用PC上来运行,家用PC也是承受不了的。\x0d\目前最常用的单片机为MCS-51,是由美国INTEL公司(生产CPU的英特尔)生产的,89C51是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生产的,其内核兼容MCS-51单片机。\x0d\单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),\x0d\单片机芯片\x0d\常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。它最早是被用在工业控制领域。\x0d\由于单片机在工业控制领域的广泛应用,单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。\x0d\INTEL的8080是最早按照这种思想设计出的处理器,当时的单片机都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上发展出了MCS51系列单片机系统。因为简单可靠而性能不错获得了很大的好评。尽管2000年以后ARM已经发展出了32位的主频超过300M的高端单片机,直到目前基于8031的单片机还在广泛的使用。在很多方面单片机比专用处理器更适合应用于嵌入式系统,因此它得到了广泛的应用。事实上单片机是世界上数量最多处理器,随着单片机家族的发展壮大,单片机和专用处理器的发展便分道扬镳。\x0d\现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。\x0d\单片机是指芯片本身,而单片机系统是为实现某一个控制应用需要由用户设计的,是一个围绕单片机芯片而组建的计算机应用系统,这是单片机应用系统。单片机开发系统是指单片机开发调试的工具。单片机自问世以来,性能不断提高和完善,其资源又能满足很多应用场合的需要,加之单片机具有集成度高、功能强、速度快、体积小、功耗低、使用方便、价格低廉等特点,正在逐步取代现有的多片微机应用系统。单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种 *** 作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本 *** 作;单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件——存储器中。存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。\x0d\2应用分类\x0d\编辑\x0d\\x0d\单片机作为计算机发展的一个重要分支领域,根据目前发展情况,从不同角度单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。\x0d\通用型/专用型\x0d\\x0d\这是按单片机适用范围来区分的。例如,80C51是通用型单片机,它不是为某种专用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。\x0d\总线/非总线型\x0d\\x0d\这是按单片机是否提供并行总线来区分的。总线型单片机单片机普遍设置有并行地址总线、数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。\x0d\控制型/家电型\x0d\\x0d\这是按照单片机大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高。显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。\x0d\3发展历史\x0d\编辑\x0d\\x0d\单片机诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。\x0d\而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位Soc单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。\x0d\当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式 *** 作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux *** 作系统。\x0d\主要阶段\x0d\\x0d\早期阶段\x0d\SCM即单片微型计算机(SingleChipMicrocomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。\x0d\中期发展\x0d\MCU即微控制器(MicroControllerUnit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。\x0d\Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。\x0d\当前趋势\x0d\SoC嵌入式系统(SystemonChip)式的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决,因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。
c文件是整个程序中的一个或几个函数组成,在别的C文件里可以调用它,不只是在主函数中。这样做可以增强程序的模块化,提高程序的可读性。当编制好一个模块时你可以保存在一个工程下,文件名改为C。这样在另一个C文件中的文件头处只要你对它进行说明就可以调用它。比如#include stringc\x0d\那么你就可以在你说明了的C文件中调用它,这样一个模块可以在很多处调用,使得编程复杂度降低。程序编译时把你所说明的文件复制到你调用处程序就可以运行了。\x0d\H文件是对单片机一些端口及一些常用的程序的库说明,\x0d\比如我们在程序中用到端口一即P1,我们能够用它是因为在库中已对它进行了说明,对P1赋予了一个端口地址,这样程序编译是才不会出错,不然会提示你UNDIFINED\x0d\C文件一般是自己创建的。而H文件是系统自带,不过自己也可以创建H文件,主要对用到的一些标号进行说明,其中也可以包括一些常用的函数\x0d\用户自己创建的C文件是放在工程目录下,H文件一般放在编译器的某个目录下,程序编译的时候从默认目录中搜索,如果找到则复制到程序开头处。
以上就是关于单片机中断程序全部的内容,包括:单片机中断程序、关于单片机设计的几个常用模块有哪些、51单片机的编程问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)