51单片机头文件reg51.h详解
- 格式:docx
- 大小:130.25 KB
- 文档页数:11
51单片机C语言头文件及其使用2007-05-29 16:33很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这样的问题,看过本文后,就会明白。
其实这个是在头文件中用sfr定义的,现在定义好了的是这样的sfr P1 = 0x90;,也就是说,到底大写,还是小写,就是在这里面决定的。
这就说明,如果你要用小写,就得在头文件中改为小写。
其实它都是为了编程序方便才这样写的,在程序编译时,就会变成相应的地址(如P1就变成了0x90)。
还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。
下面是一个标准的C51头文件:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。
如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。
)/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;/* BIT Registers */ /* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 only/* TCON */sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;/* IE */sbit EA = IE^7;sbit ET2 = IE^5; //8052 onlysbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */sbit PT2 = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/* P3 */sbit RD = P3^7;sbit WR = P3^6;sbit T1 = P3^5;sbit INT1 = P3^3;sbit INT0 = P3^2;sbit TXD = P3^1;sbit RXD = P3^0;/* SCON */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1 */sbit T2EX = P1^1; // 8052 onlysbit T2 = P1^0; // 8052 only/* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。
proteus中编译器头文件Proteus是一款常用的电子电路仿真软件,它提供了丰富的编译器头文件,方便开发者在进行电路设计和仿真时使用。
本文将为您介绍Proteus中常用的编译器头文件。
在Proteus中,编译器头文件是指用于定义和声明各种函数、变量和数据类型的文件。
这些头文件包含了各种电子元件的模型和特性,使得开发者能够方便地使用这些元件进行电路设计和仿真。
下面我们将介绍几个常用的编译器头文件。
1. `reg51.h`:这是Proteus中用于8051单片机的头文件。
它定义了8051单片机的寄存器、位操作函数等,方便开发者进行8051单片机的程序设计和仿真。
2. `avr/io.h`:这是Proteus中用于AVR单片机的头文件。
它定义了AVR单片机的IO端口、寄存器等,方便开发者进行AVR单片机的程序设计和仿真。
3. `pic.h`:这是Proteus中用于PIC单片机的头文件。
它定义了PIC单片机的寄存器、位操作函数等,方便开发者进行PIC单片机的程序设计和仿真。
4. `lcd.h`:这是Proteus中用于液晶显示器的头文件。
它定义了液晶显示器的各种函数和数据类型,方便开发者进行液晶显示器的程序设计和仿真。
5. `adc.h`:这是Proteus中用于模拟转换器的头文件。
它定义了模拟转换器的各种函数和数据类型,方便开发者进行模拟转换器的程序设计和仿真。
6. `spi.h`:这是Proteus中用于串行外设接口的头文件。
它定义了串行外设接口的各种函数和数据类型,方便开发者进行串行外设接口的程序设计和仿真。
以上是Proteus中一些常用的编译器头文件,它们覆盖了多种类型的电子元件和外设接口,方便开发者进行电路设计和仿真。
开发者只需要包含相应的头文件,就可以使用其中定义的函数和数据类型,从而简化了程序设计的过程。
总结一下,Proteus中的编译器头文件为开发者提供了丰富的电子元件模型和外设接口定义,方便开发者进行电路设计和仿真。
Reg51.h是头文件,是对单片机的特殊寄存器的定义。
另外,#include <reg51.h>与#include"reg51.h"是有区别的,使用< >包含头文件时,编译先进入到软件安装文件夹处开始搜索这个头文件,使用“”包含头文件时,编译先进入当前工程所在文件夹处开始搜索这个头文件。
Reg51.h在文件安装文件夹处存在,所以一般用#include<reg51.h>。
头文件具体对特殊寄存器的定义如下:/*--------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* BIT Register *//* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */ sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */ sbit SM0 = 0x9F; sbit SM1 = 0x9E;sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。
关于#include <reg51.h>的解释#include <reg51.h>是c51(用于单片机开发的一种c语言)的头文件。
类似于头文件AT89X51.h。
这两个头文件基本是一样的,只是在使用时对位的定义不一样,at89x51.h文件中对P1.1的操作是写成P1_1;reg51.h文件中的操作则写成P1^1。
表示方法不一样而已。
另外前者是特指ATMEL公司的51系列单片机,后者指所有51系列的单片机。
我们在用c语言编程是往往第一行就是reg51.h或者其他的自定义头文件,我们怎么样来理解呢?1)“文件包含”处理。
程序的第一行是一个“文件包含”处理。
所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。
程序中包含REG51.h 文件的目的是为了要使用P1 (还有其他更多的符号)这个符号,即通知C 编译器,程序中所写的P1 是指80C51 单片机的P1 端口而不是其它变量。
这是如何做到的呢?打开reg51.h 可以看到这样的一些内容:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。
如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。
)/*---------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99; /* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88; /* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8; /* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;#endif熟悉80C51 内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。
我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面内容不多,像飞思卡尔、ARM 系列的单片机头文件往往内容就非常多,尽管如此,对一些初次接触单片机的朋友来说,51的头文件还是搞不太清楚,今天具体来说明一下。
1)“文件包含”处理概念所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。
因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg51.h,然后用#include<reg51.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。
2)寄存器地址及位地址声明的原因reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。
sfr P1 = 0x90这句话表示:P1口所对应的特殊功能寄存器P1在内存中的地址为0x80,sbit EA=0xAF这句话表示EA这一位的地址为0xAF。
注意这里出现了一个使用很频繁的sfr和sbit。
sfr 表示特殊功能寄存器的意思,它并非标准C 语言的关键字,而是Keil 为能直接访问80C51中的SFR 而提供了一个新的关键词,其用法是:sfr 特殊功能寄存器名=地址值(注意对于头文件里“特殊功能寄存器名”,用户实际上也可以修改的,如P1=0x80,也可改为A1=0x80,但sfr 和地址值则不能更改,否者会编译出错。
)sbit表示位的意思,它也是非标准C 语言的关键字,编写程序时如需操作寄存器的某一位(可位寻址的寄存器才能用)时,需定义一个位变量,此时就要要到sbit,如sbit deng=P1^0,sbit EA = 0xAF;需要注意的是,位定义时有些特殊,用法有三种:第一种方法:sbit 位变量名=寄存器位地址值第二种方法:sbit 位变量名=SFR 名称^寄存器位值(0-7)第三种方法:sbit 位变量名=SFR 地址值^寄存器位值如:sbit IT0=0x88 (1)说明:0x88是IT0 的位地址值sbit deng=P1^2 (2)说明:其中P1 必须先用sfr 定义好sbit EA=0xA8^7 (3)说明:0xA8 就是IE寄存器的地址值以上三种定义方法需注意的是 IT0 deng EA可由用户随便定义,但必须满足C语言对变量名的定义规则。
/**********************************51单片机头文件单片机头文件原理及内部接口技术王俊涛整理修改QQ:853210627page页码为郭天祥《新概念51单片机c语言教程》中页码将其复制到文本文档改扩展名为.h***********************************//*--------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */// 四个IO口全部能位寻址sfr P0 = 0x80; //三态双向IO口P0口//低8位地址总线/数据总线sfr P1 = 0x90; //准双向IO口P1口//用户专用sfr P2 = 0xA0; //准双向IO口P2口//高8位地址总线/无外部ram或rom时为用户IO口sfr P3 = 0xB0; //双功能//1.准双向IO口P3口//2.P30 RXD串行数据接受// P31 TXD串行数据发送// P32 外部中断0 信号申请// P33 外部中断1 信号申请// P34 定时/计数器T0 外部计数脉冲输入// P35 定时/计数器T1 外部计数脉冲输入// P36 WR 片外RAM写脉冲信号输入// P37 RD 片外ram读脉冲信号输入sfr PSW = 0xD0; // 可以位寻址//程序状态寄存器Program Status WORD ()程序状态信息//psw.7(CY) 进位标志//psw.6(AC) 辅助进位标志位低四位向高四位进位或借位时AC=1// 主要用于十进制调整//psw.5(F0) 用户可自定义的程序标志位//psw.4(RS1)//psw.3(RS0)// 工作寄存器选择位// 任一时刻只有一组寄存器在工作// 0 0 0区 00H~07H// 0 1 1区 08H~0fH// 1 0 2区 10H~17H// 1 1 3区 18H~1FH////psw.2(OV) 溢出标志位//psw.1( ) 保留为,不可使用//psw.0(P) 奇偶校验位sfr ACC = 0xE0; //累加器A 特殊功能寄存器可位寻址sfr B = 0xF0; //寄存器B 主要用于乘除运算sfr SP= 0x81; //堆栈指针寄存器SP 存放站定栈顶地址sfr DPL = 0x82; //sfr DPH = 0x83; //数据指针寄存器DPTR//对片外RAM及扩展IO进行存取用的地址指针sfr PCON = 0x87; //电源控制寄存器不能位寻址page131//管理单片机的电源部分包括上电复位、掉电模式、空闲模式等//单片机复位时PCON被全部清0//D7 SMOD该位与串口通信波特率有关// SMOD=0 串口方式1 2 3 波特率正常// SMOD=1 串口方式1 2 3 波特率加倍//D6 SMOD0//D5 LVDF//D4 P0F// 这三位STC特有功能//D3 GF1//D2 GF0// 两个通用工作标志位//D1 PD 掉电模式设定位// PD=0;正常工作模式// PD=1;进入掉电模式,// 由外部中断低电平触发或下降沿触发或硬件复位触发// 掉电模式中:外部晶振,cpu,定时器,串行口全部停止工作// 只有外部中断继续工作//D0 IDL 空闲模式设定位// IDL=0;正常工作状态// IDL=1;单片机进入空闲模式// 空闲模式中,除CPU不工作外,其余仍然继续工作// 可由任意个中断或硬件复位唤醒sfr TCON = 0x88; //定时器/计数器控制寄存器可以位寻址page70//D7 TF1 定时器1溢出标志位//D6 TR1 定时器1运行控制位//D5 TF0 定时器0溢出标志位//D4 TR0 定时器0运行控制位//D3 IE1 外部中断1请求标志//D2 IT1 外部中断1 触发方式选择位//D1 IE0 外部中断0请求标志//D0 IT0 外部中断0 触发方式选择位sfr TMOD = 0x89; //定时器/计数器工作方式寄存器不能位寻址//确定工作方式和功能page70//D7 GA TE 门控制位// GA TE=0;定时器/计数器由TRX(x=0,1)来控制// GA TE=1;定时器/计数器由TRX(x=0,1)// 和外部中断引脚(init0,1)来共同控制//D6 C/T 定时器、计数器选择位// 0 选择定时器模式// 1 选择计数器模式//D5 M1//D4 M0// M1 M0 工作方式// 0 0 方式0 13位定时器/计数器// 0 1 方式1 16位定时器/计数器// 1 0 方式2 8位自动重装定时器/计数器// 1 1 方式3 仅适用T0 分成两个8位计数器,T1停止计数//D3 GA TE 门控制位// GA TE=0;定时器/计数器由TRX(x=0,1)来控制// GA TE=1;定时器/计数器由TRX(x=0,1)// 和外部中断引脚(init0,1)来共同控制//D2 C/T 定时器、计数器选择位// 0 选择定时器模式// 1 选择计数器模式//D1 M1//D0 M0// M1 M0 工作方式// 0 0 方式0 13位定时器/计数器// 0 1 方式1 16位定时器/计数器// 1 0 方式2 8位自动重装定时器/计数器// 1 1 方式3 仅适用T0 分成两个8位计数器,T1停止计数sfr TL0 = 0x8A; //定时器/计数器0高8位容器加1 计数器sfr TL1 = 0x8B; //定时器/计数器1高8位容器sfr TH0 = 0x8C; //定时器/计数器0低8位容器sfr TH1 = 0x8D; //定时器/计数器1低8位容器sfr IE = 0xA8; //中断允许寄存器可以位寻址//D7 EA 全局中断允许位//D6 NULL//D5 ET2 定时器/计数器2中断允许位interrupt 5//D4 ES 串行口中断允许位interrupt 4//D3 ET1 定时器/计数器1中断允许位interrupt 3//D2 EX1 外部中断1中断允许位interrupt 2//D1 ET0 定时器/计数器0中断允许位interrupt 1//D0 EX0 外部中断0中断允许位interrupt 0sfr IP= 0xB8; //中断优先级寄存器可进行位寻址//D7 NULL//D6 NULL//D5 NULL//D4 PS 串行口中断定义优先级控制位// 1 串行口中断定义为高优先级中断// 0 串行口中断定义为低优先级中断////D3 PT1// 1 定时器/计数器1中断定义为高优先级中断// 0 定时器/计数器1中断定义为低优先级中断//D2 PX1// 1 外部中断1定义为高优先级中断// 0 外部中断1定义为低优先级中断//D1 PT0// 1 定时器/计数器0中断定义为高优先级中断// 0 定时器/计数器0中断定义为低优先级中断//D0 PX0// 1 外部中断0定义为高优先级中断// 0 外部中断0定义为低优先级中断sfr SCON = 0x98; //串行口控制寄存器可以进行位寻址page134//D7 SM0//D6 SM1// SM0 SM1 串行口工作方式// 0 0 同步移位寄存器方式// 0 1 10位异步收发(8位数据),波特率可变(定时器1溢出率控制)// 1 0 11位异步收发(9位数据),波特率固定// 1 1 11异步收发(9位数据),波特率可变(定时器1溢出率控制)//D5 SM2 多机通信控制位主要用于方式2和方式3//D4 REN 允许串行接收位//D3 TB8 方式2,3中发送数据的第9位//D2 RB8 方式2,3中接受数据的第9位//D1 TI 发送中断标志位//D0 RI 接受中断标志位sfr SBUF = 0x99; //串行数据缓冲区/*****************************************************************************下面是位寻址区上面做过解释的就不在下面一一解释了******************************************************************************/ /* BIT Register *//* PSW */sbit CY= 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */ sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA= 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP*/sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */ sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D;sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。
51单片机定时器 c语言51单片机是目前较为流行的一种单片机芯片,定时器是其重要的功能之一,可以用于实现各种定时任务,而c语言则是51单片机常用的编程语言之一。
下面将结合实例,阐述51单片机定时器在c语言中的使用方法。
一、引入头文件及定义定时器首先需要引入头文件“reg51.h”,然后需要定义一个定时器变量和一个计数变量。
在本文中,我们将使用定时器0,所以定义如下:```c#include<reg52.h>sbit led = P2^0; //定义led信号端口P2.0unsigned char count = 0; //计数变量unsigned char timerVal = 56; //定时器初值```需要注意的是,定时器初值的计算方法如下:$$定时器初值 = 256 - \frac{所需延时时间× 晶振频率}{12}$$在本例中,晶振频率为11.0592MHz,所需延时时间为0.001秒,则计算得到定时器初值为56。
二、设置定时器参数设置定时器参数前,需要先关闭定时器0。
设置完成后,再通过TR0位将定时器0启动。
```cvoid initTimer(){TMOD &= 0xF0; //定时器0, 方式1TMOD |= 0x01;TH0 = timerVal; //定时器初值高位TL0 = timerVal; //定时器初值低位ET0 = 1; //打开定时器0中断EA = 1; //打开总中断}void main(){initTimer(); //初始化定时器0while(1){if(count >= 100){led = !led; //LED翻转count = 0; //计数器清零}}}void timerHandler() interrupt 1{TH0 = timerVal;TL0 = timerVal;count++; //计数器+1}```在上述代码中,通过设置TMOD寄存器,将定时器工作在方式1。
/*--------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* BIT Register *//* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit P = 0xD0; /* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8; /* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0; /* SCON */sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B;sbit TI = 0x99;sbit RI = 0x98;#endif--------------------------------------------------------------/*--------------------------------------------------------------------------REG52.HHeader file for generic 80C52 and 80C32 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG52_H__#define __REG52_H__/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* BIT Registers *//* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 only /* TCON */sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;/* IE */sbit EA = IE^7;sbit ET2 = IE^5; //8052 onlysbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */sbit PT2 = IP^5;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/* P3 */sbit RD = P3^7;sbit WR = P3^6;sbit T1 = P3^5;sbit T0 = P3^4;sbit INT1 = P3^3;sbit INT0 = P3^2;sbit TXD = P3^1;sbit RXD = P3^0;/* SCON */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1 */sbit T2EX = P1^1; // 8052 only sbit T2 = P1^0; // 8052 only /* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;#endif。
我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面内容不多,像飞思卡尔、ARM 系列的单片机头文件往往内容就非常多,尽管如此,对一些初次接触单片机的朋友来说,51的头文件还是搞不太清楚,今天具体来说明一下。
1)“文件包含”处理概念所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。
因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg51.h,然后用#include<reg51.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。
2)寄存器地址及位地址声明的原因reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。
sfr P1 = 0x90这句话表示:P1口所对应的特殊功能寄存器P1在内存中的地址为0x80,sbit EA=0xAF这句话表示EA这一位的地址为0xAF。
注意这里出现了一个使用很频繁的sfr和sbit。
sfr 表示特殊功能寄存器的意思,它并非标准 C 语言的关键字,而是Keil 为能直接访问80C51中的SFR 而提供了一个新的关键词,其用法是:sfr 特殊功能寄存器名=地址值(注意对于头文件里“特殊功能寄存器名”,用户实际上也可以修改的,如P1=0x80,也可改为A1=0x80,但sfr 和地址值则不能更改,否者会编译出错。
)sbit表示位的意思,它也是非标准 C 语言的关键字,编写程序时如需操作寄存器的某一位(可位寻址的寄存器才能用)时,需定义一个位变量,此时就要要到sbit,如sbit deng=P1^0,sbit EA = 0xAF;需要注意的是,位定义时有些特殊,用法有三种:第一种方法:sbit 位变量名=寄存器位地址值第二种方法:sbit 位变量名=SFR 名称^寄存器位值(0-7)第三种方法:sbit 位变量名=SFR 地址值^寄存器位值如:sbit IT0=0x88 (1)说明:0x88是IT0 的位地址值sbit deng=P1^2 (2)说明:其中P1 必须先用sfr 定义好sbit EA=0xA8^7 (3)说明:0xA8 就是IE寄存器的地址值以上三种定义方法需注意的是 IT0 deng EA可由用户随便定义,但必须满足C语言对变量名的定义规则。
我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面内容不多,像飞思卡尔、ARM 系列的单片机头文件往往内容就非常多,尽管如此,对一些初次接触单片机的朋友来说,51的头文件还是搞不太清楚,今天具体来说明一下。
1)“文件包含”处理概念所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。
因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg51.h,然后用#include<reg51.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。
2)寄存器地址及位地址声明的原因reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。
sfr P1 = 0x90这句话表示:P1口所对应的特殊功能寄存器P1在内存中的地址为0x80,sbit EA=0xAF这句话表示EA这一位的地址为0xAF。
注意这里出现了一个使用很频繁的sfr和sbit。
sfr 表示特殊功能寄存器的意思,它并非标准C 语言的关键字,而是Keil 为能直接访问80C51中的SFR 而提供了一个新的关键词,其用法是:sfr 特殊功能寄存器名=地址值(注意对于头文件里“特殊功能寄存器名”,用户实际上也可以修改的,如P1=0x80,也可改为A1=0x80,但sfr 和地址值则不能更改,否者会编译出错。
) sbit表示位的意思,它也是非标准C 语言的关键字,编写程序时如需操作寄存器的某一位(可位寻址的寄存器才能用)时,需定义一个位变量,此时就要要到sbit,如sbit deng=P1^0,sbit EA = 0xAF;需要注意的是,位定义时有些特殊,用法有三种:第一种方法:sbit 位变量名=寄存器位地址值第二种方法:sbit 位变量名=SFR 名称^寄存器位值(0-7)第三种方法:sbit 位变量名=SFR 地址值^寄存器位值如:sbit IT0=0x88 (1)说明:0x88是IT0 的位地址值sbit deng=P1^2 (2)说明:其中P1 必须先用sfr 定义好sbit EA=0xA8^7 (3)说明:0xA8 就是IE寄存器的地址值以上三种定义方法需注意的是IT0 deng EA可由用户随便定义,但必须满足C语言对变量名的定义规则。
我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面内容不多,像飞思卡尔、ARM 系列的单片机头文件往往内容就非常多,尽管如此,对一些初次接触单片机的朋友来说,51的头文件还是搞不太清楚,今天具体来说明一下。
1)“文件包含”处理概念所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。
因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg51.h,然后用#include<reg51.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。
2)寄存器地址及位地址声明的原因reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。
sfr P1 = 0x90这句话表示:P1口所对应的特殊功能寄存器P1在内存中的地址为0x80,sbit EA=0xAF这句话表示EA这一位的地址为0xAF。
注意这里出现了一个使用很频繁的sfr和sbit。
sfr 表示特殊功能寄存器的意思,它并非标准C 语言的关键字,而是Keil 为能直接访问80C51中的SFR 而提供了一个新的关键词,其用法是:sfr 特殊功能寄存器名=地址值(注意对于头文件里“特殊功能寄存器名”,用户实际上也可以修改的,如P1=0x80,也可改为A1=0x80,但sfr 和地址值则不能更改,否者会编译出错。
)sbit表示位的意思,它也是非标准C 语言的关键字,编写程序时如需操作寄存器的某一位(可位寻址的寄存器才能用)时,需定义一个位变量,此时就要要到sbit,如sbit deng=P1^0,sbit EA = 0xAF;需要注意的是,位定义时有些特殊,用法有三种:第一种方法:sbit 位变量名=寄存器位地址值第二种方法:sbit 位变量名=SFR 名称^寄存器位值(0-7)第三种方法:sbit 位变量名=SFR 地址值^寄存器位值如:sbit IT0=0x88 (1)说明:0x88是IT0 的位地址值sbit deng=P1^2 (2)说明:其中P1 必须先用sfr 定义好sbit EA=0xA8^7 (3)说明:0xA8 就是IE寄存器的地址值以上三种定义方法需注意的是 IT0 deng EA可由用户随便定义,但必须满足C语言对变量名的定义规则。
除些外其它的则必须按照上面的格式写,如“名称^变量位地址值”中“^”,它是由keil软件的规定的,不能写成其它的,只能这样能才编译通过。
以上是对寄存器地址和位地址的定义和声明作了解释,大家需要牢牢记住:只有对寄存器及相关位进行声明地址后,我们才能对其进行赋相关的值,keil软件才能编译通过。
至于说为什么,这可能一句话两句话也说不清楚。
3)内存、SFR、位、地址等的通俗解释前面讲到了寄存器地址和位地址(前提能位寻址)声明的目的是为告诉C编译器相应寄存器及其位在内存中的地址,这样我们对寄存器及一些位赋的变量和数值才能正确保存,然后才能供CPU正确的调用,完成相应的功能。
上段文字出现了寄存器(SFR)、位,地址、内存等,单片机学习过程中还会出现ROM、RAM等名词,可能大家觉得不是很好理解,这里可以通俗的解释一下,如下面三个图所示。
我们把内存比作宾馆,ROM、RAM、SFR相当于宾馆里具体的有三种不同功能楼层(具体这个宾馆多少层即多少ROM、RAM、SFR,视各个宾馆或者每种单片机而不同),每层8个房间相当于8位,每个房间要么住男人要么住女人相当于每位要么放入数字1要么放入数字0,keil编译器就相当于宾馆的工作人员,旅客去住旅馆相当写程序的过程,住宾馆的人必须事先要给工作人员说你是哪一层哪一个房间(即声明寄存器地址和位地址,)宾馆工作人员才能把你带到你的房间里去(这里假设这个宾馆可以由旅客自己决定住哪个房间)。
即:只有对寄存器及相关位进行声明地址后,我们才能对其进行赋相关的值,keil软件才能编译通过。
4)REG51.H头文件原文及解释打开reg51.h 可以看到这样的一些内容(此文件一般在C:\KEIL\C51\INC 下 ,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。
如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。
)下面附出头文件的原文,并把注释文件一并附后。
/*--------------------------------------------------------------------------REG51.HHeader generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80; //三态双向 IO口 P0口此句话的意思是:特殊功能寄存器P0地址为0x80 ,可位寻址,下同//低8位地址总线/数据总线(一般不用而只作普通I/O口,注意作I/O口用时,硬件上需接上接电阻)sfr P1 = 0x90; //准双向 IO口 P1口sfr P2 = 0xA0; //准双向 IO口 P2口//高8位地址总线,一般也作普通I/O用sfr P3 = 0xB0; //双功能//1.准双向 IO口 P3口//2. P30 RXD串行数据接受// P31 TXD串行数据发送// P32 外部中断0 信号申请// P33 外部中断1 信号申请// P34 定时/计数器T0 外部计数脉冲输入// P35 定时/计数器T1 外部计数脉冲输入// P36 WR 片外RAM写脉冲信号输入// P37 RD 片外ram读脉冲信号输入sfr PSW = 0xD0; // 可以位寻址(C语言编程时可不考虑此寄存器)//程序状态寄存器Program Status WORD (程序状态信息)//psw.7(CY) 进位标志//psw.6(AC)辅助进位标志位低四位向高四位进位或借位时 AC=1//主要用于十进制调整//psw.5(F0)用户可自定义的程序标志位//psw.4(RS1)//psw.3(RS0)//工作寄存器选择位//任一时刻只有一组寄存器在工作//0 0 0区 00H~07H//0 1 1区 08H~0fH//1 0 2区 10H~17H//1 1 3区 18H~1FH//psw.2(OV) 溢出标志位//psw.1( ) 保留为,不可使用//psw.0(P) 奇偶校验位sfr ACC = 0xE0; //累加器A 特殊功能寄存器可位寻址sfr B = 0xF0; //寄存器B 主要用于乘除运算sfr SP = 0x81; //堆栈指针寄存器SP 存放站定栈顶地址、sfr DPL = 0x82; //sfr DPH = 0x83; //数据指针寄存器DPTR、//对片外RAM及扩展IO进行存取用的地址指针sfr PCON = 0x87; //电源控制寄存器、不能位寻址//管理单片机的电源部分包括上电复位、掉电模式、空闲模式等//单片机复位时PCON被全部清0,编程时一般是用到SMOD位,其它的一般不用//D7 SMOD该位与串口通信波特率有关//SMOD=0 串口方式1 2 3 波特率正常//SMOD=1 串口方式1 2 3 波特率加倍sfr TCON = 0x88; //定时器/计数器控制寄存器可以位寻址//D7 TF1 定时器1溢出标志位//D6 TR1 定时器1运行控制位//D5 TF0 定时器0溢出标志位//D4 TR0 定时器0运行控制位//D3 IE1 外部中断1请求标志//D2 IT1 外部中断1 触发方式选择位//D1 IE0 外部中断0请求标志//D0 IT0 外部中断0 触发方式选择位sfr TMOD = 0x89; //定时器/计数器工作方式寄存器不能位寻址//确定工作方式和功能//D7 GATE 门控制位//GATE=0;定时器/计数器由TRX(x=0,1)来控制//GATE=1;定时器/计数器由TRX(x=0,1)//和外部中断引脚(init0,1)来共同控制//D6 C/T 定时器、计数器选择位// 0 选择定时器模式// 1 选择计数器模式//D5 M1//D4 M0//M1 M0 工作方式//0 0 方式0 13位定时器/计数器//0 1 方式1 16位定时器/计数器//1 0 方式2 8位自动重装定时器/计数器//1 1 方式3 仅适用T0 分成两个8位计数器,T1停止计数 //D3 GATE 门控制位//GATE=0;定时器/计数器由TRX(x=0,1)来控制//GATE=1;定时器/计数器由TRX(x=0,1)//和外部中断引脚(init0,1)来共同控制//D2 C/T 定时器、计数器选择位//0 选择定时器模式//1 选择计数器模式//D1 M1//D0 M0// M1 M0 工作方式// 0 0 方式0 13位定时器/计数器// 0 1 方式1 16位定时器/计数器// 1 0 方式2 8位自动重装定时器/计数器// 1 1 方式3 仅适用T0 分成两个8位计数器,T1停止计数sfr TL0 = 0x8A; //定时器/计数器0高8位容器加1 计数器sfr TL1 = 0x8B; //定时器/计数器1高8位容器sfr TH0 = 0x8C; //定时器/计数器0低8位容器sfr TH1 = 0x8D; //定时器/计数器1低8位容器sfr IE = 0xA8; //中断允许寄存器可以位寻址//D7 EA 全局中断允许位//D6 NULL//D5 ET2 定时器/计数器2中断允许位 interrupt 5 //D4 ES 串行口中断允许位 interrupt 4//D3 ET1 定时器/计数器1中断允许位 interrupt 3 //D2 EX1 外部中断1中断允许位 interrupt 2//D1 ET0 定时器/计数器0中断允许位 interrupt 1//D0 EX0 外部中断0中断允许位 interrupt 0sfr IP = 0xB8; //中断优先级寄存器可进行位寻址//D7 NULL//D6 NULL//D5 NULL//D4 PS 串行口中断定义优先级控制位// 1 串行口中断定义为高优先级中断// 0 串行口中断定义为低优先级中断////D3 PT1// 1 定时器/计数器1中断定义为高优先级中断 // 0 定时器/计数器1中断定义为低优先级中断 //D2 PX1// 1 外部中断1定义为高优先级中断// 0 外部中断1定义为低优先级中断//D1 PT0// 1 定时器/计数器0中断定义为高优先级中断 // 0 定时器/计数器0中断定义为低优先级中断 //D0 PX0// 1 外部中断0定义为高优先级中断// 0 外部中断0定义为低优先级中断sfr SCON = 0x98; //串行口控制寄存器可以进行位寻址//D7 SM0//D6 SM1// SM0 SM1 串行口工作方式// 0 0 同步移位寄存器方式// 0 1 10位异步收发(8位数据),波特率可变(定时器1溢出率控制)// 1 0 11位异步收发(9位数据),波特率固定// 1 1 11异步收发(9位数据),波特率可变(定时器1溢出率控制)//D5 SM2 多机通信控制位主要用于方式2和方式3//D4 REN 允许串行接收位//D3 TB8 方式2,3中发送数据的第9位//D2 RB8 方式2,3中接受数据的第9位//D1 TI 发送中断标志位//D0 RI 接受中断标志位sfr SBUF = 0x99; //串行数据缓冲区/*****************************************************************************下面是位寻址区上面做过解释的就不在下面一一解释了******************************************************************************/ /* BIT Register *//* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit OV = 0xD2;sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。