单片机常用芯片头文件

合集下载

单片机C语言常用头文件

单片机C语言常用头文件

下 列函数注意在你调用任意内存分配程序比如.. calloc malloc 和realloc)之前必须调用 _NewHeap 来初始化堆heap int abs(int i) 返回i 的绝对值 int atoi(char *s) 转换字符串s 为整型数并返回它字符串s 起始必须是整型数形式字符否则返回0 double atof(const char *s) 转换转换字符串s 为双精度浮点数并返回它字符串s 起始必须是浮点数形式字符串 long atol(char *s) 转换字符串s 为长整型数并返回它字符串s 起始必须是长整型数形式字符否则返回0 void *calloc(size_t nelem, size_t size) 分配"nelem"个数据项的内存连续空间每个数据项的大小为size 字节并且初始化为0 如果分 配成功返回分配内存单元的首地址否则返回0 void exit(status) 终止程序运行典型的是无限循环它是担任用户main 函数的返回点 void free(void *ptr) 释放ptr 所指向的内存区 void *malloc(size_t size) 分配size 字节的存贮区如果分配成功则返回内存区地址如内存不够分配则返回0 void _NewHeap(void *start, void *end) 初始化内存分配程序的堆一个典型的调用是将符号_bss_end+1 的地址用作"start"值符号 _bss_end 定义为编译器用来存放全局变量和字符串的数据内存的结束加1 的目的是堆栈检 查函数 使用_bss_end 字节存贮为标志字节这个结束值不能被放入堆栈中 extern char _bss_end; _NewHeap(&_bss_end+1, &_bss_end + 201); // 初始化200 字节大小的堆 int rand(void) 返回一个在0 和RAND_MAX 之间的随机数 void *realloc(void *ptr, size_t size) 重新分配ptr 所指向内存区的大小为size 字节size 可比原来大或小返回指向该内存区的地 址指针

51单片机头文件reg51.h详解

51单片机头文件reg51.h详解

我们在用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语言对变量名的定义规则。

单片机头文件

单片机头文件

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。

C51常用头文件

C51常用头文件

C51常用头文件在KEIL 中,对于单片机所使用的头文件,除了reg51 reg52以外,还有一些从各芯片制商的官网下载与reg51,reg52功能类似的头文件,需了解透外,还要对各类型单片机均可通用且相当有用的的头文件,做相应的了解。

因为,内部所包含的函数与宏定义,可以及大的方便我们编写应用程序1字符函数 ctype.h1 extern bit isalpha(char);功能:检查参数字符是否为英文字母,是则返回12 extern bit isalnum(char)功能:检查字符是否为英文字母或数字字符,是则返回13 extern bit iscntrl(char)功能:检查参数值是否在0x00~0x1f 之间或等于0x7f,是则返回14 extern bit isdigit(char)功能:检查参数是否为数字字符,是则返回15 extern bit isgraph(char)功能:检查参数值是否为可打印字符,是则返回1,可打印字符为0x21~0x7e 6 extern bit isprint(char)功能:除了与isgraph相同之外,还接受空格符0x207 extern bit ispunct(char)功能:不做介绍。

8 extern bit islower(char)功能:检查参数字符的值是否为小写英文字母,是则返回19 extern bit isupper(char)功能:检查参数字符的值是否为大写英文字母,是则返回110 extern bit isspace(char)功能:检查字符是否为下列之一,空格,制表符,回车,换行,垂直制表符和送纸。

如果为真则返回111 extern bit isxdigit(char)功能:检查参数字符是否为16进制数字字符,是则返回112 extern char toint(char)功能:将ASCII字符0~9 a~f(大小写无关)转换成对应的16进制数字,返回值00H~0FH13 extern char tolower(char)功能:将大写字符转换成小写形式,如字符变量不在A~Z之间,则不作转换而直接返回该字符14 extern char toupper(char)功能:将小写字符转换成大写形式,如字符变量不在a~z之间,则不作转换而直接返回该字符15 define toascii(c) ((c)&0x7f)功能:该宏将任何整形数值缩小到有效的ASCII范围之内,它将变量和0x7f相与从而去掉第7位以上的所有数位16 #define tolower(c) (c-‘A’+’a’)功能:该宏将字符与常数0x20 逐位相或17 #define toupper(c) ((c)-‘a’+’A’)功能:该宏将字符与常数0xdf 逐位相与2数学函数 math.hextern int abs (int val);extern char cabs (char val);extern long labs (long val);extern float fabs (float val);功能:返回绝对值。

MSP430x14x系列单片机头文件注释

MSP430x14x系列单片机头文件注释

MSP430x14x系列单片机头文件注释MSP430F149单片机的头文件详细的注释#ifndef__msp430x14x_h#define__msp430x14x_h/************************************************************ *STANDARD BITS************************************************************/ #define BIT00x0001#define BIT10x0002#define BIT20x0004#define BIT30x0008#define BIT40x0010#define BIT50x0020#define BIT60x0040#define BIT70x0080#define BIT80x0100#define BIT90x0200#define BITA0x0400#define BITB0x0800#define BITC0x1000#define BITD0x2000#define BITE0x4000#define BITF0x8000/************************************************************ *STATUS REGISTER BITS************************************************************/ #define C0x0001#define Z0x0002#define N0x0004#define V0x0100#define GIE0x0008#define CPUOFF0x0010#define OSCOFF0x0020#define SCG00x0040#define SCG10x0080/*Low Power Modes coded with Bits4-7in SR*/#ifndef__IAR_SYSTEMS_ICC/*Begin#defines for assembler*/ #define LPM0CPUOFF#define LPM1SCG0+CPUOFF#define LPM2SCG1+CPUOFF#define LPM3SCG1+SCG0+CPUOFF#define LPM4SCG1+SCG0+OSCOFF+CPUOFF/*End#defines for assembler*/#else/*Begin#defines for C*/#define LPM0_bits CPUOFF#define LPM1_bits SCG0+CPUOFF#define LPM2_bits SCG1+CPUOFF#define LPM3_bits SCG1+SCG0+CPUOFF#define LPM4_bits SCG1+SCG0+OSCOFF+CPUOFF#include#define LPM0_BIS_SR(LPM0_bits)/*Enter Low Power Mode0*/#define LPM0_EXIT_BIC_SR(LPM0_bits)/*Exit Low Power Mode0*/#define LPM1_BIS_SR(LPM1_bits)/*Enter Low Power Mode1*/#define LPM1_EXIT_BIC_SR(LPM1_bits)/*Exit Low Power Mode1*/#define LPM2_BIS_SR(LPM2_bits)/*Enter Low PowerMode2*/#define LPM2_EXIT_BIC_SR(LPM2_bits)/*Exit Low Power Mode2*/#define LPM3_BIS_SR(LPM3_bits)/*Enter Low Power Mode3*/#define LPM3_EXIT_BIC_SR(LPM3_bits)/*Exit Low Power Mode3*/#define LPM4_BIS_SR(LPM4_bits)/*Enter Low Power Mode4*/#define LPM4_EXIT_BIC_SR(LPM4_bits)/*Exit Low Power Mode4*/#endif/*End#defines for C*//************************************************************ *PERIPHERAL FILE MAP************************************************************/ /************************************************************ *特殊功能寄存器地址和控制位************************************************************/ /*中断使能1*/#define IE1_0x0000sfrb IE1=IE1_;#define WDTIE0x01/*看门狗中断使能*/#define OFIE0x02/*外部晶振故障中断使能*/#define NMIIE0x10/*非屏蔽中断使能*/#define ACCVIE0x20/*可屏蔽中断使能/flash写中断错误*/ #define URXIE00x40/*串口0接收中断使能*/#define UTXIE00x80/*串口0发送中断使能*//*中断标志1*/#define IFG1_0x0002sfrb IFG1=IFG1_;#define WDTIFG0x01/*看门狗中断标志*/#define OFIFG0x02/*外部晶振故障中断标志*/#define NMIIFG0x10/*非屏蔽中断标志*/#define URXIFG00x40/*串口0接收中断标志*/#define UTXIFG00x80/*串口0发送中断标志*//*中断模式使能1*/#define ME1_0x0004sfrb ME1=ME1_;#define URXE00x40/*串口0接收中断模式使能*/#define USPIE00x40/*同步中断模式使能*/#define UTXE00x80/*串口0发送中断模式使能*//*中断使能2*/#define IE2_0x0001sfrb IE2=IE2_;#define URXIE10x10/*串口1接收中断使能*/#define UTXIE10x20/*串口1发送中断使能*//*中断标志2*/#define IFG2_0x0003sfrb IFG2=IFG2_;#define URXIFG10x10/*串口1接收中断标志*/#define UTXIFG10x20/*串口1发送中断标志*//*中断模式使能2*/#define ME2_0x0005sfrb ME2=ME2_;#define URXE10x10/*串口1接收中断模式使能*/ #define USPIE10x10/*同步中断模式使能*/#define UTXE10x20/*串口1发送中断模式使能*//************************************************************ *看门狗定时器的寄存器定义************************************************************/#define WDTCTL_0x0120sfrw WDTCTL=WDTCTL_;#define WDTIS00x0001/*选择WDTCNT的四个输出端之一*/ #define WDTIS10x0002/*选择WDTCNT的四个输出端之一*/ #define WDTSSEL0x0004/*选择WDTCNT的时钟源*/#define WDTCNTCL0x0008/*清除WDTCNT端:为1时从0开始计数*/#define WDTTMSEL0x0010/*选择模式0:看门狗模式;1:定时器模式*/#define WDTNMI0x0020/*选择NMI/RST引脚功能0:为RST;1:为NMI*/#define WDTNMIES0x0040/*WDTNMI=1时.选择触发延0:为上升延1:为下降延*/#define WDTHOLD0x0080/*停止看门狗定时器工作0:启动;1:停止*/#define WDTPW0x5A00/*写密码:高八位*//*SMCLK=1MHz定时器模式*/#defineWDT_MDLY_32WDTPW+WDTTMSEL+WDTCNTCL/* TSMCLK*2POWER15=32ms复位状态*/#defineWDT_MDLY_8WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0/* TSMCLK*2POWER13=8.192ms"*/#defineWDT_MDLY_0_5WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms"*/#defineWDT_MDLY_0_064WDTPW+WDTTMSEL+WDTCNTCL+WDTI S1+WDTIS0/* TSMCLK*2POWER6=0.512ms"*//*ACLK=32.768KHz定时器模式*/#defineWDT_ADLY_1000WDTPW+WDTTMSEL+WDTCNTCL+WDTSS EL/* TACLK*2POWER15=1000ms"*/#defineWDT_ADLY_250WDTPW+WDTTMSEL+WDTCNTCL+WDTSSE L+WDTIS0/* TACLK*2POWER13=250ms"*/#defineWDT_ADLY_16WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL +WDTIS1/* TACLK*2POWER9=16ms"*/#defineWDT_ADLY_1_9WDTPW+WDTTMSEL+WDTCNTCL+WDTSSE L+WDTIS1+WDTIS0/* TACLK*2POWER6=1.9ms"*//*SMCLK=1MHz看门狗模式*/#defineWDT_MRST_32WDTPW+WDTCNTCL/*TSMCLK*2POWER15=32ms复位状态*/#defineWDT_MRST_8WDTPW+WDTCNTCL+WDTIS0/*TSMCLK*2POWER13=8.192ms"*/#defineWDT_MRST_0_5WDTPW+WDTCNTCL+WDTIS1/* TSMCLK*2POWER9=0.512ms"*/#defineWDT_MRST_0_064WDTPW+WDTCNTCL+WDTIS1+WDTIS0/ * TSMCLK*2POWER6=0.512ms"*//*ACLK=32KHz看门狗模式*/#defineWDT_ARST_1000WDTPW+WDTCNTCL+WDTSSEL/* TACLK*2POWER15=1000ms"*/#defineWDT_ARST_250WDTPW+WDTCNTCL+WDTSSEL+WDTIS0/* TACLK*2POWER13=250ms"*/#defineWDT_ARST_16WDTPW+WDTCNTCL+WDTSSEL+WDTIS1/* TACLK*2POWER9=16ms"*/#defineWDT_ARST_1_9WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+ WDTIS0/* TACLK*2POWER6=1.9ms"*//************************************************************ 硬件乘法器的寄存器定义************************************************************/ #define MPY_0x0130/*无符号乘法*/sfrw MPY=MPY_;#define MPYS_0x0132/*有符号乘法*/sfrw MPYS=MPYS_;#define MAC_0x0134/*无符号乘加*/sfrw MAC=MAC_;#define MACS_0x0136/*有符号乘加*/sfrw MACS=MACS_;#define OP2_0x0138/*第二乘数*/sfrw OP2=OP2_;#define RESLO_0x013A/*低6位结果寄存器*/sfrw RESLO=RESLO_;#define RESHI_0x013C/*高6位结果寄存器*/sfrw RESHI=RESHI_;#define SUMEXT_0x013E/*结果扩展寄存器*/const sfrw SUMEXT=SUMEXT_;/************************************************************ *DIGITAL I/O Port1/2寄存器定义有中断功能************************************************************/#define P1IN_0x0020/*P1输入寄存器*/const sfrb P1IN=P1IN_;#define P1OUT_0x0021/*P1输出寄存器*/sfrb P1OUT=P1OUT_;#define P1DIR_0x0022/*P1方向选择寄存器*/sfrb P1DIR=P1DIR_;#define P1IFG_0x0023/*P1中断标志寄存器*/sfrb P1IFG=P1IFG_;#define P1IES_0x0024/*P1中断边沿选择寄存器*/ sfrb P1IES=P1IES_;#define P1IE_0x0025/*P1中断使能寄存器*/sfrb P1IE=P1IE_;#define P1SEL_0x0026/*P1功能选择寄存器*/sfrb P1SEL=P1SEL_;#define P2IN_0x0028/*P2输入寄存器*/const sfrb P2IN=P2IN_;#define P2OUT_0x0029/*P2输出寄存器*/sfrb P2OUT=P2OUT_;#define P2DIR_0x002A/*P2方向选择寄存器*/sfrb P2DIR=P2DIR_;#define P2IFG_0x002B/*P2中断标志寄存器*/sfrb P2IFG=P2IFG_;#define P2IES_0x002C/*P2中断边沿选择寄存器*/ sfrb P2IES=P2IES_;#define P2IE_0x002D/*P2中断使能寄存器*/sfrb P2IE=P2IE_;#define P2SEL_0x002E/*P2功能选择寄存器*/sfrb P2SEL=P2SEL_;/************************************************************ *DIGITAL I/O Port3/4寄存器定义无中断功能************************************************************/ #define P3IN_0x0018/*P3输入寄存器*/const sfrb P3IN=P3IN_;#define P3OUT_0x0019/*P3输出寄存器*/sfrb P3OUT=P3OUT_;#define P3DIR_0x001A/*P3方向选择寄存器*/sfrb P3DIR=P3DIR_;#define P3SEL_0x001B/*P3功能选择寄存器*/sfrb P3SEL=P3SEL_;#define P4IN_0x001C/*P4输入寄存器*/const sfrb P4IN=P4IN_;#define P4OUT_0x001D/*P4输出寄存器*/sfrb P4OUT=P4OUT_;#define P4DIR_0x001E/*P4方向选择寄存器*/sfrb P4DIR=P4DIR_;#define P4SEL_0x001F/*P4功能选择寄存器*/sfrb P4SEL=P4SEL_;/************************************************************ *DIGITAL I/O Port5/6I/O口寄存器定义PORT5和6无中断功能************************************************************/ #define P5IN_0x0030/*P5输入寄存器*/const sfrb P5IN=P5IN_;#define P5OUT_0x0031/*P5输出寄存器*/sfrb P5OUT=P5OUT_;#define P5DIR_0x0032/*P5方向选择寄存器*/sfrb P5DIR=P5DIR_;#define P5SEL_0x0033/*P5功能选择寄存器*/sfrb P5SEL=P5SEL_;#define P6IN_0x0034/*P6输入寄存器*/const sfrb P6IN=P6IN_;#define P6OUT_0x0035/*P6输出寄存器*/sfrb P6OUT=P6OUT_;#define P6DIR_0x0036/*P6方向选择寄存器*/sfrb P6DIR=P6DIR_;#define P6SEL_0x0037/*P6功能选择寄存器*/sfrb P6SEL=P6SEL_;/************************************************************ *USART串口寄存器"UCTL","UTCTL","URCTL"定义的各个位可串口1串口2公用************************************************************/ /*UCTL串口控制寄存器*/#define PENA0x80/*校验允许位*/#define PEV0x40/*偶校验为0时为奇校验*/#define SPB0x20/*停止位为2为0时停止位为1*/#define CHAR0x10/*数据位为8位为0时数据位为7位*/#define LISTEN0x08/*自环模式(发数据同时在把发的数据接收回来)*/#define SYNC0x04/*同步模式为0异步模式*/#define MM0x02/*为1时地址位多机协议(异步)主机模式(同步);为0时线路空闲多机协议(异步)从机模式(同步)*/#define SWRST0x01/*控制位*//*UTCTL串口发送控制寄存器*/#define CKPH0x80/*时钟相位控制位(只同步方式用)为1时时钟UCLK延时半个周期*/#define CKPL0x40/*时钟极性控制位为1时异步与UCLK 相反;同步下降延有效*/#define SSEL10x20/*时钟源选择位:与SSEL0组合为0,1,2,3四种方式*/#define SSEL00x10/*"0"选择外部时钟,"1"选择辅助时钟,"2","3"选择系统子时钟*/#define URXSE0x08/*接收触发延控制位(只在异步方式下用)*/ #define TXWAKE0x04/*多处理器通信传送控制位(只在异步方式下用)*/#define STC0x02/*外部引脚STE选择位为0时为4线模式为1时为3线模式*/#define TXEPT0x01/*发送器空标志*//*URCTL串口接收控制寄存器同步模式下只用两位:FE和OE*/ #define FE0x80/*帧错标志*/#define PE0x40/*校验错标志位*/#define OE0x20/*溢出标志位*/#define BRK0x10/*打断检测位*/#define URXEIE0x08/*接收出错中断允许位*/#define URXWIE0x04/*接收唤醒中断允许位*/#define RXWAKE0x02/*接收唤醒检测位*/#define RXERR0x01/*接收错误标志位*//************************************************************ *USART0串口0寄存器定义************************************************************/ #define U0CTL_0x0070/*串口0基本控制寄存器*/sfrb U0CTL=U0CTL_;#define U0TCTL_0x0071/*串口0发送控制寄存器*/sfrb U0TCTL=U0TCTL_;#define U0RCTL_0x0072/*串口0接收控制寄存器*/sfrb U0RCTL=U0RCTL_;#define U0MCTL_0x0073/*波特率调整寄存器*/sfrb U0MCTL=U0MCTL_;#define U0BR0_0x0074/*波特率选择寄存器0*/sfrb U0BR0=U0BR0_;#define U0BR1_0x0075/*波特率选择寄存器1*/sfrb U0BR1=U0BR1_;#define U0RXBUF_0x0076/*接收缓存寄存器*/const sfrb U0RXBUF=U0RXBUF_;#define U0TXBUF_0x0077/*发送缓存寄存器*/sfrb U0TXBUF=U0TXBUF_;/*改变的寄存器名定义*/#define UCTL0_0x0070/*UART0Control*/sfrb UCTL0=UCTL0_;#define UTCTL0_0x0071/*UART0Transmit Control*/ sfrb UTCTL0=UTCTL0_;#define URCTL0_0x0072/*UART0Receive Control*/ sfrb URCTL0=URCTL0_;#define UMCTL0_0x0073/*UART0Modulation Control*/ sfrb UMCTL0=UMCTL0_;#define UBR00_0x0074/*UART0Baud Rate0*/sfrb UBR00=UBR00_;#define UBR10_0x0075/*UART0Baud Rate1*/sfrb UBR10=UBR10_;#define RXBUF0_0x0076/*UART0Receive Buffer*/ const sfrb RXBUF0=RXBUF0_;#define TXBUF0_0x0077/*UART0Transmit Buffer*/ sfrb TXBUF0=TXBUF0_;#define UCTL_0_0x0070/*UART0Control*/sfrb UCTL_0=UCTL_0_;#define UTCTL_0_0x0071/*UART0Transmit Control*/ sfrb UTCTL_0=UTCTL_0_;#define URCTL_0_0x0072/*UART0Receive Control*/ sfrb URCTL_0=URCTL_0_;#define UMCTL_0_0x0073/*UART0Modulation Control*/ sfrb UMCTL_0=UMCTL_0_;#define UBR0_0_0x0074/*UART0Baud Rate0*/sfrb UBR0_0=UBR0_0_;#define UBR1_0_0x0075/*UART0Baud Rate1*/sfrb UBR1_0=UBR1_0_;#define RXBUF_0_0x0076/*UART0Receive Buffer*/ const sfrb RXBUF_0=RXBUF_0_;#define TXBUF_0_0x0077/*UART0Transmit Buffer*/sfrb TXBUF_0=TXBUF_0_;/************************************************************ *USART1串口1寄存器定义************************************************************/ #define U1CTL_0x0078/*串口1基本控制寄存器*/sfrb U1CTL=U1CTL_;#define U1TCTL_0x0079/*串口1发送控制寄存器*/sfrb U1TCTL=U1TCTL_;#define U1RCTL_0x007A/*串口1接收控制寄存器*/sfrb U1RCTL=U1RCTL_;#define U1MCTL_0x007B/*波特率调整控制寄存器*/sfrb U1MCTL=U1MCTL_;#define U1BR0_0x007C/*波特率选择寄存器0*/sfrb U1BR0=U1BR0_;#define U1BR1_0x007D/*波特率选择寄存器1*/sfrb U1BR1=U1BR1_;#define U1RXBUF_0x007E/*接收缓存*/const sfrb U1RXBUF=U1RXBUF_;#define U1TXBUF_0x007F/*发送缓存*/sfrb U1TXBUF=U1TXBUF_;/*改变的寄存器名定义*/#define UCTL1_0x0078/*UART1Control*/sfrb UCTL1=UCTL1_;#define UTCTL1_0x0079/*UART1Transmit Control*/ sfrbUTCTL1=UTCTL1_;#define URCTL1_0x007A/*UART1Receive Control*/ sfrb URCTL1=URCTL1_;#define UMCTL1_0x007B/*UART1Modulation Control*/ sfrb UMCTL1=UMCTL1_;#define UBR01_0x007C/*UART1Baud Rate0*/sfrb UBR01=UBR01_;#define UBR11_0x007D/*UART1Baud Rate1*/sfrb UBR11=UBR11_;#define RXBUF1_0x007E/*UART1Receive Buffer*/ const sfrb RXBUF1=RXBUF1_;#define TXBUF1_0x007F/*UART1Transmit Buffer*/ sfrb TXBUF1=TXBUF1_;#define UCTL_1_0x0078/*UART1Control*/sfrb UCTL_1=UCTL_1_;#define UTCTL_1_0x0079/*UART1Transmit Control*/sfrb UTCTL_1=UTCTL_1_;#define URCTL_1_0x007A/*UART1Receive Control*/sfrb URCTL_1=URCTL_1_;#define UMCTL_1_0x007B/*UART1Modulation Control*/sfrb UMCTL_1=UMCTL_1_;#define UBR0_1_0x007C/*UART1Baud Rate0*/sfrb UBR0_1=UBR0_1_;#define UBR1_1_0x007D/*UART1Baud Rate1*/sfrb UBR1_1=UBR1_1_;#define RXBUF_1_0x007E/*UART1Receive Buffer*/const sfrb RXBUF_1=RXBUF_1_;#define TXBUF_1_0x007F/*UART1Transmit Buffer*/sfrb TXBUF_1=TXBUF_1_;/*************************************************************Timer A定时器A寄存器定义************************************************************/ #define TAIV_0x012E/*Timer A中断向量寄存器*/sfrw TAIV=TAIV_;#define TACTL_0x0160/*Timer A控制寄存器*/sfrw TACTL=TACTL_;#define TACCTL0_0x0162/*Timer A捕获/比较控制寄存器0*/ sfrw TACCTL0=TACCTL0_;#define TACCTL1_0x0164/*Timer A捕获/比较控制寄存器1*/ sfrw TACCTL1=TACCTL1_;#define TACCTL2_0x0166/*Timer A捕获/比较控制寄存器2*/ sfrw TACCTL2=TACCTL2_;#define TAR_0x0170/*Timer A16位计数器内容*/sfrw TAR=TAR_;#define TACCR0_0x0172/*Timer A捕获/比较寄存器0*/sfrw TACCR0=TACCR0_;#define TACCR1_0x0174/*Timer A捕获/比较寄存器1*/sfrw TACCR1=TACCR1_;#define TACCR2_0x0176/*Timer A捕获/比较寄存器2*/sfrw TACCR2=TACCR2_;/*改变的寄存器名定义*/#define CCTL0_0x0162/*Timer A Capture/Compare Control0*/sfrw CCTL0=CCTL0_;#define CCTL1_0x0164/*Timer A Capture/Compare Control1*/sfrw CCTL1=CCTL1_;#define CCTL2_0x0166/*Timer A Capture/Compare Control2*/sfrw CCTL2=CCTL2_;#define CCR0_0x0172/*Timer A Capture/Compare0*/ sfrw CCR0=CCR0_;#define CCR1_0x0174/*Timer A Capture/Compare1*/ sfrw CCR1=CCR1_;#define CCR2_0x0176/*Timer A Capture/Compare2*/ sfrw CCR2=CCR2_;/*TACTL控制寄存器16个位寄存器定义*/#define TASSEL20x0400/*未用*/#define TASSEL10x0200/*时钟输入源控制位1*/#define TASSEL00x0100/*时钟输入源控制位0*/#define ID10x0080/*分频系数选择位1*/#define ID00x0040/*分频系数选择位0*/#define MC10x0020/*计数模式控制位1*/#define MC00x0010/*计数模式控制位0*/#define TACLR0x0004/*置1位清除定时器*/#define TAIE0x0002/*定时器中断允许*/#define TAIFG0x0001/*定时器中断标志*/#define MC_000*0x10/*停止模式*/#define MC_101*0x10/*增计数模式*/#define MC_202*0x10/*连续计数模式*/#define MC_303*0x10/*增/减计数模式*/#define ID_000*0x40/*直通*/#define ID_101*0x40/*2分频*/#define ID_202*0x40/*4分频*/#define ID_303*0x40/*8分频*/#define TASSEL_000*0x100/*时钟源为TACLK*/#define TASSEL_101*0x100/*时钟源为ACLK*/#define TASSEL_202*0x100/*时钟源为SMCLK*/#define TASSEL_303*0x100/*时钟源为INCLK*//*Timer A,Timer B可公用捕获/比较控制寄存器X*/#define CM10x8000/*捕获模式选择位1*/#define CM00x4000/*捕获模式选择位0*/#define CCIS10x2000/*捕获输入信号源选择位1*/#define CCIS00x1000/*捕获输入信号源选择位0*/#define SCS0x0800/*信号同步位0:异步捕获;1:同步捕获*/#define SCCI0x0400/*锁存输入信号*/#define CAP0x0100/*模式选择:0:比较模式;1:捕获模式*/#define OUTMOD20x0080/*输出模式选择位2*/#define OUTMOD10x0040/*输出模式选择位1*/#define OUTMOD00x0020/*输出模式选择位0*/#define CCIE0x0010/*中断允许位*/#define CCI0x0008/*读出输入信号源位ccis0\1*/#define OUT0x0004/*输出信号(选择输出模式0)*/#define COV0x0002/*捕获溢出标志*/#define CCIFG0x0001/*中断标志*/#define OUTMOD_00*0x20/*输出模式*/#define OUTMOD_11*0x20/*置位模式*/#define OUTMOD_22*0x20/*翻转/复位模式*/#define OUTMOD_33*0x20/*置位/复位模式*/#define OUTMOD_44*0x20/*翻转模式*/#define OUTMOD_55*0x20/*复位模式*/#define OUTMOD_66*0x20/*翻转/置位模式*/#define OUTMOD_77*0x20/*复位/置位模式*/#define CCIS_00*0x1000/*选择CCIXA为捕获事件的输入信号源*/#define CCIS_11*0x1000/*选择CCIXB为捕获事件的输入信号源*/#define CCIS_22*0x1000/*选择GND为捕获事件的输入信号源*/#define CCIS_33*0x1000/*选择VCC为捕获事件的输入信号源*/#define CM_00*0x4000/*禁止捕获模式*/#define CM_11*0x4000/*上升延捕获模式*/#define CM_22*0x4000/*下降沿捕获模式*/#define CM_33*0x4000/*上升沿和下降沿都捕获模式*//************************************************************ *Timer B定时器B寄存器定义************************************************************/ #define TBIV_0x011E/*中断向量寄存器:BIT1-BIT3有效*/ sfrw TBIV=TBIV_;#define TBCTL_0x0180/*定时器B控制寄存器:全部控制都集中在这*/sfrw TBCTL=TBCTL_;#define TBCCTL0_0x0182/*定时器B捕获/比较控制寄存器0*/ sfrw TBCCTL0=TBCCTL0_;#define TBCCTL1_0x0184/*定时器B捕获/比较控制寄存器1*/ sfrw TBCCTL1=TBCCTL1_;#define TBCCTL2_0x0186/*定时器B捕获/比较控制寄存器2*/ sfrw TBCCTL2=TBCCTL2_;#define TBCCTL3_0x0188/*定时器B捕获/比较控制寄存器3*/ sfrw TBCCTL3=TBCCTL3_;#define TBCCTL4_0x018A/*定时器B捕获/比较控制寄存器4*/ sfrw TBCCTL4=TBCCTL4_;#define TBCCTL5_0x018C/*定时器B捕获/比较控制寄存器5*/ sfrw TBCCTL5=TBCCTL5_;#define TBCCTL6_0x018E/*定时器B捕获/比较控制寄存器6*/ sfrw TBCCTL6=TBCCTL6_;#define TBR_0x0190/*计数器*/sfrw TBR=TBR_;#define TBCCR0_0x0192/*定时器B捕获/比较寄存器0*/sfrw TBCCR0=TBCCR0_;#define TBCCR1_0x0194/*定时器B捕获/比较寄存器1*/sfrw TBCCR1=TBCCR1_;#define TBCCR2_0x0196/*定时器B捕获/比较寄存器2*/sfrw TBCCR2=TBCCR2_;#define TBCCR3_0x0198/*定时器B捕获/比较寄存器3*/sfrw TBCCR3=TBCCR3_;#define TBCCR4_0x019A/*定时器B捕获/比较寄存器4*/sfrw TBCCR4=TBCCR4_;#define TBCCR5_0x019C/*定时器B捕获/比较寄存器5*/sfrw TBCCR5=TBCCR5_;#define TBCCR6_0x019E/*定时器B捕获/比较寄存器6*/sfrw TBCCR6=TBCCR6_;/*定时器B控制寄存器:全部控制都集中在这*/#define SHR10x4000/*装载比较锁存器控制位1:受TBCCTLx 中的CCLDx位控制*/#define SHR00x2000/*装载比较锁存器控制位0:受TBCCTLx 中的CCLDx位控制*/#define TBCLGRP10x4000/*装载比较锁存器控制位1:受TBCCTLx 中的CCLDx位控制*/#define TBCLGRP00x2000/*装载比较锁存器控制位0:受TBCCTLx 中的CCLDx位控制*/#define CNTL10x1000/*定时器位数长度控制位1*/#define CNTL00x0800/*定时器位数长度控制位0*/#define TBSSEL20x0400/*未用*/#define TBSSEL10x0200/*时钟输入源控制位1*/#define TBSSEL00x0100/*时钟输入源控制位0*/#define TBCLR0x0004/*置1清除定时器*/#define TBIE0x0002/*中断允许*/#define TBIFG0x0001/*中断标志*/#define TBSSEL_00*0x0100/*时钟源为:TBCLK*/#define TBSSEL_11*0x0100/*时钟源为:ACLK*/#define TBSSEL_22*0x0100/*时钟源为:SMCLK*/#define TBSSEL_33*0x0100/*时钟源为:INCLK*/#define CNTL_00*0x0800/*16位计数模式*/#define CNTL_11*0x0800/*12位计数模式*/#define CNTL_22*0x0800/*10位计数模式*/#define CNTL_33*0x0800/*8位计数模式*/#define SHR_00*0x2000/*单独装载(初始值)*/#define SHR_11*0x2000/*分三组装载:1-3groups(1-2,3-4, 5-6)*/#define SHR_22*0x2000/*分二组装载:2-2groups(1-3, 4-6)*/#define SHR_33*0x2000/*不分组装载:3-1group(all)*/#define TBCLGRP_00*0x2000/*单独装载(初始值)*/#define TBCLGRP_11*0x2000/*分三组装载:1-3groups(1-2,3-4, 5-6)*/#define TBCLGRP_22*0x2000/*分二组装载:2-2groups(1-3, 4-6)*/#define TBCLGRP_33*0x2000/*不分组装载:3-1group(all)*/ /*Additional Timer B Control Register bits are defined in Timer A*/#define SLSHR10x0400/*Compare latch load source1*/#define SLSHR00x0200/*Compare latch load source0*/#define CLLD10x0400/*定义比较锁存器TBCLx的装载方式控制位1*/#define CLLD00x0200/*定义比较锁存器TBCLx的装载方式控制位0*/#define SLSHR_00*0x0200/*立即装载*/#define SLSHR_11*0x0200/*TBR计数到0时装载*/#define SLSHR_22*0x0200/*在增减模式下,计数到TBCLx或0时装载;在连续计数模式下,计数到0时装载*/#define SLSHR_33*0x0200/*当计数到TBCL0时装载*/#define CLLD_00*0x0200/*立即装载*/#define CLLD_11*0x0200/*TBR计数到0时装载*/#define CLLD_22*0x0200/*在增减模式下,计数到TBCLx或0时装载;在连续计数模式下,计数到0时装载*/#define CLLD_33*0x0200/*当计数到TBCL0时装载*//************************************************************ *Basic Clock Module************************************************************/ #define DCOCTL_0x0056/*DCO时钟频率控制寄存器:复位后的值位060h*/sfrb DCOCTL=DCOCTL_;#define BCSCTL1_0x0057/*系统时钟控制寄存器1:复位后的值位084h*/sfrb BCSCTL1=BCSCTL1_;#define BCSCTL2_0x0058/*系统时钟控制寄存器2:复位后的值位000h*/sfrb BCSCTL2=BCSCTL2_;/*DCO时钟频率控制寄存器*/#define MOD00x01/*DCO插入周期控制位0*/#define MOD10x02/*DCO插入周期控制位1*/#define MOD20x04/*DCO插入周期控制位2*/#define MOD30x08/*DCO插入周期控制位3*/#define MOD40x10/*DCO插入周期控制位4*/#define DCO00x20/*8种频率控制位0*/#define DCO10x40/*8种频率控制位1*/#define DCO20x80/*8种频率控制位2*//*系统时钟控制寄存器1:复位后的值位084h*/#define RSEL00x01/*选择内部电阻控制位0*/#define RSEL10x02/*选择内部电阻控制位1*/#define RSEL20x04/*选择内部电阻控制位2*/#define XT5V0x08/*必须为0*/#define DIVA00x10/*ACLK分频系数控制位0*/#define DIVA10x20/*ACLK分频系数控制位1*/#define XTS0x40/*LFXT1工作模式控制位0:低频模式./ 1:高频模式.*/#define XT2OFF0x80/*XT2CLK使能控制位0:开启;1:关闭*/#define DIVA_00x00/*ACLK分频系数为:1*/#define DIVA_10x10/*ACLK分频系数为:2*/#define DIVA_20x20/*ACLK分频系数为:4*/#define DIVA_30x30/*ACLK分频系数为:8*//*系统时钟控制寄存器2:复位后的值位000h*/#define DCOR0x01/*内外电阻选择控制位*/#define DIVS00x02/*SMCLK分频控制位0*/#define DIVS10x04/*SMCLK分频控制位1*/#define SELS0x08/*SMCLK时钟源选择位t0COCLK/1:XT2CLK/LFXTCLK*/#define DIVM00x10/*MCLK分频控制位0*/#define DIVM10x20/*MCLK分频控制位1*/#define SELM00x40/*MCLK时钟输入源选择位0*/#define SELM10x80/*MCLK时钟输入源选择位1*/#define DIVS_00x00/*SMCLK分频系数为:1*/#define DIVS_10x02/*SMCLK分频系数为:2*/#define DIVS_20x04/*SMCLK分频系数为:4*/#define DIVS_30x06/*SMCLK分频系数为:8*/#define DIVM_00x00/*MCLK分频系数为:1*/#define DIVM_10x10/*MCLK分频系数为:2*/#define DIVM_20x20/*MCLK分频系数为:4*/#define DIVM_30x30/*MCLK分频系数为:8*/#define SELM_00x00/*MCLK时钟输入源:DCOCLK*/#define SELM_10x40/*MCLK时钟输入源:DCOCLK*/#define SELM_20x80/*MCLK时钟输入源:XT2CLK/LFXTCLK*/ #define SELM_30xC0/*MCLK时钟输入源:LFXTCLK*//************************************************************* *Flash Memory FLASH操作寄存器定义*************************************************************/ #define FCTL1_0x0128/*FLASH控制寄存器1:控制编程、擦除*/ sfrw FCTL1=FCTL1_;#define FCTL2_0x012A/*FLASH控制寄存器2:控制时钟分频*/ sfrw FCTL2=FCTL2_;#define FCTL3_0x012C/*FLASH控制寄存器3:状态标志*/ sfrw FCTL3=FCTL3_;#define FRKEY0x9600/*读FLASH密码*/#define FWKEY0xA500/*写FLASH密码*/#define FXKEY0x3300/*for use with XOR instruction*/ /*FLASH控制寄存器1:控制编程、擦除*/#define ERASE0x0002/*擦除段使能*/#define MERAS0x0004/*主存擦除使能*/#define WRT0x0040/*编程使能*/#define BLKWRT0x0080/*段编程使能*//*FLASH控制寄存器2:控制时钟分频*/#define FN_00x0000/*直通*/#define FN_20x0002/*3分频*/ #define FN_30x0003/*4分频*/ #define FN_40x0004/*5分频*/ #define FN_50x0005/*6分频*/ #define FN_60x0006/*7分频*/ #define FN_70x0007/*8分频*/ #define FN_80x0008/*9分频*/ #define FN_90x0009/*10分频*/ #define FN_100x000A/*11分频*/ #define FN_110x000B/*12分频*/ #define FN_120x000C/*13分频*/ #define FN_130x000D/*14分频*/ #define FN_140x000E/*15分频*/ #define FN_150x000F/*16分频*/ #define FN_160x0010/*17分频*/ #defineFN_170x0011/*18分频*/ #define FN_180x0012/*19分频*/ #define FN_190x0013/*20分频*/ #define FN_200x0014/*21分频*/ #define FN_210x0015/*22分频*/ #define FN_220x0016/*23分频*/ #define FN_230x0017/*24分频*/ #define FN_240x0018/*25分频*/ #define FN_250x0019/*26分频*/ #define FN_260x001A/*27分频*/ #define FN_270x001B/*28分频*/ #define FN_280x001C/*29分频*/ #define FN_290x001D/*30分频*/ #define FN_300x001E/*31分频*/ #define FN_310x001F/*32分频*/ #define FN_320x0020/*33分频*/ #define FN_330x0021/*34分频*/ #define FN_340x0022/*35分频*/ #define FN_350x0023/*36分频*/ #define FN_360x0024/*37分频*/ #define FN_370x0025/*38分频*/ #define FN_380x0026/*39分频*/ #define FN_390x0027/*40分频*/ #define FN_400x0028/*41分频*/ #define FN_410x0029/*42分频*/ #define FN_420x002A/*43分频*/ #define FN_430x002B/*44分频*/ #define FN_440x002C/*45分频*/#define FN_460x002E/*47分频*/#define FN_470x002F/*48分频*/#define FN_480x0030/*49分频*/#define FN_490x0031/*50分频*/#define FN_500x0032/*51分频*/#define FN_510x0033/*52分频*/#define FN_520x0034/*53分频*/#define FN_530x0035/*54分频*/#define FN_540x0036/*55分频*/#define FN_550x0037/*56分频*/#define FN_560x0038/*57分频*/#define FN_570x0039/*58分频*/#define FN_580x003A/*59分频*/#define FN_590x003B/*60分频*/#define FN_600x003C/*61分频*/#define FN_610x003D/*62分频*/#define FN_620x003E/*63分频*/#define FN_630x003F/*64分频*/#define FSSEL_00x0000/*Flash时钟选择:ACLK*/#define FSSEL_10x0040/*Flash时钟选择:MCLK*/#define FSSEL_20x0080/*Flash时钟选择:SMCLK*/ #define FSSEL_30x00C0/*Flash时钟选择:SMCLK*/ /*FLASH控制寄存器3:状态标志*/#define BUSY0x0001/*Flash忙标志*/#define KEYV0x0002/*Flash安全键值出错标志*/ #define ACCVIFG0x0004/*Flash非法访问中断标志*/ #define WAIT0x0008/*等待指示信号位*/#define LOCK0x0010/*锁定位*/#define EMEX0x0020/*紧急退出位*//************************************************************ *Comparator A比较器A寄存器定义************************************************************/ #define CACTL1_0x0059/*比较器A控制寄存器1*/ sfrb CACTL1=CACTL1_;#define CACTL2_0x005A/*比较器A控制寄存器2*/ sfrb CACTL2=CACTL2_;#define CAPD_0x005B/*比较器A端口禁止寄存器*/ sfrb CAPD=CAPD_;/*比较器A控制寄存器1*/#define CAIFG0x01/*比较器A中断标志*/#define CAIE0x02/*比较器A中断使能*/。

51单片机常用头文件(LCD1602)

51单片机常用头文件(LCD1602)

自制51单片机常用头文件(LCD1602)C51 2008-09-24 20:11:05 阅读946 评论0 字号:大中小订阅/*--------------------------------------------------------------------------LCD1602.HThe user function is C51.Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun All rights reserved.--------------------------------------------------------------------------*/#ifndef __LCD1602_H__#define __LCD1602_H__/*连接线图:---------------------------------------------------| LCM-----51 | LCM-----51 | LCM------51 || ----------------------------------------------- || DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 || DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 || DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 || DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |---------------------------------------------------*//****************** LCD1602指令 ***********************************///输入方式设置#define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一#define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一#define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动#define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位//设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON 0x0C // 显示开#define LCD_DISPLAY_OFF 0x08 // 显示关#define LCD_CURSOR_ON 0x0A // 光标显示#define LCD_CURSOR_OFF 0x08 // 光标不显示#define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁#define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁//光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE 0x18 // LCD显示左移一位#define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位#define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位//工作方式设置#define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示#define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示#define LCD_CLEAR_SCREEN 0x01 // 清屏/***********************LCD1602地址相关******************************/#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址#define LINE1 0 // 第一行#define LINE2 1 // 第二行#define LINE_LENGTH 8 // 每行的最大字符长度/***********************LCD1602接线引脚定义**************************/#define LCM_RS P2_0 // 数据/命令选择信号#define LCM_RW P2_1 // 读/写选择信号#define LCM_E P2_2 // 使能信号#define LCM_Data P0 // 显示数据端口#define Busy 0x80 // 用于检测LCM状态字中的Busy标识#define uchar unsigned char#define uint unsigned int//================================ LCM1602控制部分========================================================= /*****************************************************函数名:void Delay_LCD(void)功能:5ms延时说明:LCD显示延时入口参数:无返回值:无*****************************************************/ void Delay_LCD(void){uint TempCyc = 5552; // 放入延时数据while(TempCyc--){;}/*****************************************************函数名:uchar ReadStatusLCM()功能:读忙状态说明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替入口参数:无返回值:LCM_Data*****************************************************///读状态uchar ReadStatusLCM(void){LCM_Data = 0xFF; // LCM数据口先置1LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy) // 检测忙信号.如果忙,则不执行{}return (LCM_Data); // 不忙返回读取数据}/***************************************************** 函数名:void WriteDataLCM()功能:向LCM1602中写入数据说明:将形参WDLCM中的数据写入LCM中入口参数:WDLCM返回值:无*****************************************************/ //写数据void WriteDataLCM(uchar WDLCM){ReadStatusLCM(); // 检测忙LCM_Data = WDLCM; // 写入数据到LCMLCM_RS = 1;LCM_RW = 0;LCM_E = 0; // 若晶振速度太高可以在这后加小的延时 LCM_E = 0; // 延时}/*****************************************************函数名:void WriteCommandLCM()功能:向LCM1602中写入指令说明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测入口参数:WCLCM,BuysC返回值:无*****************************************************///写指令void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测{if (BuysC){ReadStatusLCM(); // 根据需要检测忙}LCM_Data = WCLCM; // 写入指令LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 1;}/*****************************************************函数名:void LCMInit()功能:初始化LCM1602说明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作入口参数:无返回值:无*****************************************************///LCM初始化void LCMInit(void){LCM_Data = 0;WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 三次显示模式设置,不检测忙信号Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 0x38指令表示:8位数据显示模式,俩行多显示Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1); // 显示模式设置,开始要求每次检测忙信号WriteCommandLCM(LCD_DISPLAY_OFF,1); // 关闭显示WriteCommandLCM(LCD_CLEAR_SCREEN,1); // 显示清屏WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1); // 显示光标移动设置WriteCommandLCM(LCD_DISPLAY_ON,1); // 显示开及光标设置}/*****************************************************函数名:void DisplayOneChar()功能:按指定坐标中写入数据说明:X-横坐标,Y-纵坐标,DData为ASCII值入口参数:X,Y,DData返回值:无*****************************************************///按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x01;X &= 0x0F; // 限制X不能大于15,Y不能大于1 if (Y){X |= LINE2_HEAD; // 当要显示第二行时地址码:0xc0}X |= LINE1_HEAD; // 第一行的地址码:0x80WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码WriteDataLCM(DData);}/*在LCD1602中使用此函数,在DIPS082中使用下面的函数/*****************************************************函数名:void DisplayListChar(uchar x,uchar y,uchar *DData) 功能:向指定坐标中写入字符串(在LCD1602中使用此函数) 说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:无*****************************************************//按指定位置显示字符串void DisplayListChar(uchar x,uchar y,uchar *DData){if (y == LINE1) // 判断是否写入第1行{if (x < LINE_LENGTH) // 写入位数{WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址for (; x<LINE_LENGTH&&*DData!='\0'; x++){WriteDataLCM(*(DData++)); // 写入数据}if(*DData != '\0') // 判断数据是否写完{x = 0; // 没写完写入第2行y = LINE2;}}}if (y == LINE2) // 判断是否写入第2行{WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址for (; x<LINE_LENGTH&&*DData!='\0'; x++) // 判断数据是否写完{WriteDataLCM(*(DData++)); // 写入数据}}}*//*****************************************************函数名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)功能:向指定坐标中写入字符串(在DIPS082中使用此的函数) 说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:无*****************************************************///按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***void DisplayListChar(uchar X, uchar Y, uchar code *DData) {uchar ListLength,j;ListLength = strlen(DData); // strlen:读取字符串的长度Y &= 0x1;X &= 0xF; // 限制X不能大于15,Y不能大于1if (X <= 0x0F) // X坐标应小于0xF{for(j=0; j<ListLength; j++){DisplayOneChar(X, Y, DData[j]); // 显示单个字符X++; // 横坐标加1,纵坐标不变}}}/***************************************************** 函数名:void Mychar()功能:自定义字符--CGRAM说明:LCM1602字符库中没有温度符号,自定义温度符号入口参数:无返回值:无/*****************************************************/ void Mychar(void){//---------自定义字符代码--00H------闹铃符号------------- WriteCommandLCM(0x40,1); //第1行WriteDataLCM(0x01);//WriteCommandLCM(0x41,1); //第2行WriteDataLCM(0x1b);//WriteCommandLCM(0x42,1); //第3行WriteDataLCM(0x1d);//WriteCommandLCM(0x43,1); //第4行WriteDataLCM(0x19);//WriteCommandLCM(0x44,1); //第5行WriteDataLCM(0x1d);//WriteCommandLCM(0x45,1); //第6行WriteDataLCM(0x1b);//WriteCommandLCM(0x46,1); //第7行WriteDataLCM(0x01);//WriteCommandLCM(0x47,1); //第8行WriteDataLCM(0x00);////---------自定义字符代码--01H-------温度符号------------ WriteCommandLCM(0x48,1); //第1行WriteDataLCM(0x02);//WriteCommandLCM(0x49,1); //第2行WriteDataLCM(0x05);//WriteCommandLCM(0x4a,1); //第3行 1------**--WriteDataLCM(0x05);// 2----**--**WriteCommandLCM(0x4b,1); //第4行 3----**--**WriteDataLCM(0x02);// 4------**--WriteCommandLCM(0x4c,1); //第5行 5----------WriteDataLCM(0x00);// 6----------WriteCommandLCM(0x4d,1); //第6行 7----------WriteDataLCM(0x00);// 8----------WriteCommandLCM(0x4e,1); //第7行WriteDataLCM(0x00);//WriteCommandLCM(0x4f,1); //第8行WriteDataLCM(0x00);////---------自定义字符代码--02H-------当前时间------------WriteCommandLCM(0x50,1); //第1行WriteDataLCM(0x1f);//WriteCommandLCM(0x51,1); //第2行WriteDataLCM(0x11);//WriteCommandLCM(0x52,1); //第3行WriteDataLCM(0x15);//WriteCommandLCM(0x53,1); //第4行WriteDataLCM(0x11);//WriteCommandLCM(0x54,1); //第5行WriteDataLCM(0x1b);//WriteCommandLCM(0x55,1); //第6行WriteDataLCM(0x0a);//WriteCommandLCM(0x56,1); //第7行WriteDataLCM(0x1f);//WriteCommandLCM(0x57,1); //第8行WriteDataLCM(0x00);////----------------------------------------------- }#endif。

自制51单片机常用头文件

自制51单片机常用头文件

自制51单片机常用头文件
#ifndef __COM_H__
#define __COM_H__
#define uchar unsigned char
#define uint unsigned int
#define XTAL 11059200 // CUP 晶振频率
#define baudrate 9600 // 通信波特率
void sendmsg(uint ps)
{
SBUF = ps; // 要发送的字符放入缓冲区
while(TI == 0); // 一直等等,直到发送完数据为止
TI = 0;
}
uint rcvmsg(void) //调用此函数前,要先调用RI,查看是否收到数据,确定已收到的话,再调用此函数
{
RI=0; //要先将RI=0再返回,否则,返回后,RI=0这句就不执行了。

return SBUF;
}
void initcom(void)
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器1赋初值
SM0 = 0; //串口工作方式控制
SM1 = 1; //串口工作方式控制 //这两个共同控制了串口工作方式为 0;
REN = 1; //串口接收允许
PCON = 0x00;
TR1 = 1; //允许串口接收
ES = 0; //关闭串口中断
}
#endif。

单片机头文件

单片机头文件

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。

430单片机应用nRF24L01头文件

430单片机应用nRF24L01头文件

#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char//POW_UP通过配置子写入#define CSN BIT0 //每次SPI前一个下降沿,SPI后上升沿#define MOSI BIT1#define MISO BIT2#define SCK BIT3#define CE BIT4#define IRQ BIT5//SPI 命令命令字#define R_REGISTER 0x00 //0x00 + Register address#define W_REGISTER 0x20 //0x20 + Register address#define R_RX_PAYLOAD 0x61#define W_TX_PAYLOAD 0xA0#define FLUSH_TX 0xE1#define FLUSH_RX 0xE2#define REUSE_TX_PL 0xE3#define NOP 0xFF//寄存器定义// 名称地址#define CONFIG 0x00 //0x1e:TX_DS IRQ、EN CRC、PWR_UP、TX#define EN_AA 0x01 //0x00:禁止自动应答#define EN_RXADDR 0x02 //0X01:使能接收通道0#define SETUP_AW 0x03 //0X03:默认5字节的地址宽度#define SETUP_RETR 0x04 //0X00: 禁止自动重发#define RF_CH 0x05 //0X00: Sets the frequency channel nRF24L01 operates on #define RF_SETUP 0x06 //0X06:1M、0dBm、no LNA#define STATUS 0x07 //read and中断服务程序后清标志#define OBSERVE_TX 0x08 //read only#define CD 0x09 //用在Enhanced ShockBurst#define RX_ADDR_P0 0x0A //接收通道0的地址(低字节先写)#define RX_ADDR_P1 0x0B //0x00:不使用#define RX_ADDR_P2 0x0C //0x00:不使用#define RX_ADDR_P3 0x0D //0x00:不使用#define RX_ADDR_P4 0x0E //0x00:不使用#define RX_ADDR_P5 0x0F //0x00:不使用#define TX_ADDR 0x10 //0XE7E7E7E7E7:默认发送通道的地址5字节#define RX_PW_P0 0x11 //0X03:接收通道0的数据宽度为3字节#define RX_PW_P1 0x12 //0X00:该接收通道不使用#define RX_PW_P2 0x13 //0X00:该接收通道不使用#define RX_PW_P3 0x14 //0X00:该接收通道不使用#define RX_PW_P4 0x15 //0X00:该接收通道不使用#define RX_PW_P5 0x16 //0X00:该接收通道不使用#define FIFO_STATUS 0x17//read onlyuchar Tx_Address[5]={0x09,0x87,0x65,0x43,0x21};//设置发送端的地址uchar Rx_Address[5]={0x09,0x87,0x65,0x43,0x21};//设置发送端的地址uchar Tx_date=0; //要发送的数据变量uchar Rx_date=0; //收到的数据uchar read_date[5]={0};//度寄存器数据变量/**********以下为函数声明**********************/void clk_sys_init(); //MCLK = SMCLK = 4Mvoid io_nrf_init(); //无线端口初始化(P2)void wr_spi_byte(uchar date);uchar rd_spi_byte(); //从寄存器读取一字节void wr_spi(uchar command_address,uchar config_date);void tx_nrf_init(); //初始化发射配置字void rx_nrf_init(); //初始化接收配置字void Set_Tx_Address(); //设置发送端的地址void Set_Rx_Address(); //设置接收端地址void tx_payload(); //将要发送的数据写入FIFOvoid CE_pulse(); //CE 不低于10us 的上升沿,触发数据发送void CE_up(); //CE 高电平,接收模式void Reset_Tx_DS(); //清除发射中断标志位void Reset_Rx_DS(); //清除接收中断标志位void rd_fifo(); //读FIFOvoid Flush_TX_FIFO(); // 清空发射FIFOvoid flush_RX_FIFO(); //清空接收FIFOvoid read_register(uchar register_adds); //读寄存器的内容void delay_us(); //进入函数需8条指令的时间,2 usvoid delay_1_5ms(); //1.5msvoid delay(uint time);//短延时void delay_130us(); //需要520 * (1/4M)=130us/****************************系统时钟初始化函数************************/ void clk_sys_init(){uint i;BCSCTL1 &= ~XT2OFF;do{IFG1 &=~OFIFG;for(i=0;i<0xff;i++);}while(!(IFG1 & OFIFG));BCSCTL2 |= SELM_2+DIVM_1 + SELS; //MCLK = SMCLK = 4M}/************************I/o口初始化函数************************/void io_nrf_init(){P2DIR |= CSN + MOSI + SCK + CE; //SOMI , IRQ INPUT端口默认为输入P2OUT=0;P2OUT |= CSN;P1DIR |= BIT4;}/***********************写SPI函数*************************/void wr_spi(uchar command_address,uchar config_date){P2OUT |=CSN;P2OUT &=~CSN;wr_spi_byte(command_address);wr_spi_byte(config_date);P2OUT |= CSN;}/************************无线模块发射模式函数*************************/ void tx_nrf_init(){wr_spi(W_REGISTER + CONFIG,0x0e); //TX_DS IRQ允许wr_spi(W_REGISTER + EN_AA,0x00); //禁止自动应答wr_spi(W_REGISTER + EN_RXADDR,0x01);//使能接收通道0wr_spi(W_REGISTER + SETUP_AW,0x03);//地址宽度5字节wr_spi(W_REGISTER + SETUP_RETR,0x00);//禁止自动重发wr_spi(W_REGISTER + RF_CH,0x00); //无线发射频率设定wr_spi(W_REGISTER + RF_SETUP,0x06); //发射功率设定wr_spi(W_REGISTER + RX_PW_P0,0x01); //一字节有效数据//wr_spi(W_REGISTER + RX_PW_P1,0x00);//wr_spi(W_REGISTER + RX_PW_P2,0x00);// wr_spi(W_REGISTER + RX_PW_P3,0x00);//wr_spi(W_REGISTER + RX_PW_P4,0x00);//wr_spi(W_REGISTER + RX_PW_P5,0x00);}/************************无线模块接收模式函数*************************/ void rx_nrf_init(){wr_spi(W_REGISTER + CONFIG,0x3F); //只允许rx_dr 中断wr_spi(W_REGISTER + EN_AA,0x00); //禁止自动应答wr_spi(W_REGISTER + EN_RXADDR,0x01);//使能接收通道0wr_spi(W_REGISTER + SETUP_AW,0x03);//地址宽度5字节wr_spi(W_REGISTER + SETUP_RETR,0x00); //禁止自动重发wr_spi(W_REGISTER + RF_CH,0x00); //无线发射频率设定wr_spi(W_REGISTER + RF_SETUP,0x06); //发射功率设定wr_spi(W_REGISTER + RX_PW_P0,0x01); //一字节有效数据//wr_spi(W_REGISTER + RX_PW_P1,0x00); //写不写无所谓,通道没允许//wr_spi(W_REGISTER + RX_PW_P2,0x00);//wr_spi(W_REGISTER + RX_PW_P3,0x00);//wr_spi(W_REGISTER + RX_PW_P4,0x00);//wr_spi(W_REGISTER + RX_PW_P5,0x00);}/*********************地址设置函数************************/void Set_Tx_Address() //设置发送端的地址{uchar i=0;P2OUT |= CSN;P2OUT &=~ CSN;_NOP();wr_spi_byte(W_REGISTER + TX_ADDR);for(i=0;i<5;i++){wr_spi_byte(Tx_Address[i]);}P2OUT |= CSN;}void Set_Rx_Address() //设置发送端的地址{uchar i=0;P2OUT |= CSN;P2OUT &=~ CSN;_NOP();wr_spi_byte(W_REGISTER + RX_ADDR_P0);for(i=0;i<5;i++){wr_spi_byte(Rx_Address[i]);}P2OUT |= CSN;}/**********************装在待发射数据函数**************************/ void tx_payload() //将要发送的数据写入FIFO{P2OUT |= CSN;P2OUT &=~ CSN;_NOP();wr_spi_byte(W_TX_PAYLOAD);wr_spi_byte(Tx_date);P2OUT |= CSN;}/*************************启动发射函数***********************/ void CE_pulse() //CE 不低于10us 的上升沿,触发数据发送{delay(800);P2OUT |= CE;delay(800);P2OUT &=~ CE;}/*************************启动接收函数***********************/ void CE_up() //CE 高电平,接收模式{delay(800);P2OUT |= CE;}/************************清除发射中断标志位函数*****************/ void Reset_Tx_DS(){wr_spi(W_REGISTER + STATUS,0x2e);}/************************清除接收中断标志位函数*****************/ void Reset_Rx_DS(){wr_spi(W_REGISTER + STATUS,0x4e);}/***********************清空发射缓存函数************************/ void Flush_TX_FIFO() // 清空FIFO{P2OUT |= CSN;P2OUT &=~ CSN;wr_spi_byte(FLUSH_TX);P2OUT |= CSN;}/************************清空接收缓存函数************************/ void flush_RX_FIFO(){P2OUT |= CSN;P2OUT &=~ CSN;wr_spi_byte(FLUSH_RX);P2OUT |= CSN;}/**********************读取接收数据函数*************************/ void rd_fifo() //读FIFO{P2OUT |= CSN;P2OUT &=~ CSN;wr_spi_byte(R_RX_PAYLOAD);Rx_date=rd_spi_byte();P2OUT |= CSN;}/***********************SPI写字节函数*****************************/ void wr_spi_byte(uchar date){uchar bit;P2OUT &=~ SCK; //时钟低电平delay(1);for(bit=0;bit<8;bit++){ //先高位,后低位if(date & BIT7)P2OUT |= MOSI;elseP2OUT &=~ MOSI;//_NOP();_NOP();_NOP();_NOP(); //数据建立时间1usP2OUT |= SCK;delay(2);date <<= 1; //一条指令的时间//_NOP();_NOP();_NOP(); //数据保持时间1usP2OUT &=~ SCK;delay(2);}delay(1);}/************************SPI读字节函数************************/ uchar rd_spi_byte(){uchar buf=0,i=0;P2OUT &=~ SCK;delay(1);for(i=0;i<8;i++){P2OUT |= SCK;buf<<=1;if(P2IN & MISO)buf |= 1;P2OUT &=~ SCK;delay(2);}delay(2);return buf;}/**************读寄存器函数,仅用于调试之用**********************/ void read_register(uchar register_adds) //读指定寄存器的内容{uchar i=0;P2OUT |= CSN;P2OUT &=~ CSN;wr_spi_byte(R_REGISTER + register_adds);for(i=0;i<5;i++){read_date[i]=rd_spi_byte(); //将read_date[i]加入到watch}P2OUT |= CSN;}/***************************延时函数**************************/ void delay_us(){;}void delay_1_5ms(){uint i=0,j=0;for(i=0;i<50;i++)for(j=0;j<50;j++);}void delay(uint time){uint i;for(i=0;i<time;i++);}void delay_130us(){for(i=0;i<100;i++); }。

8脚51单片机介绍及头文件-STC15F104E

8脚51单片机介绍及头文件-STC15F104E

8脚51单片机介绍及头文件STC15F104ESTC的8脚单片机有直插和SOP两种形式的封装,其中有6个IO口,剩下2个是VCC和GND ,不需要带晶振内部自带有时钟发生电路,在此要说明这种型号的单片机有专用的烧录软件,在宏晶官网都有下载。

这6个IO口实际上是我们普通单片机上的P3口,实际编程时也是使用P3.X来实现IO口操作。

唯一的不同就是没有硬件的串口,需要用到定时器来模拟(这点不好),但是下载电路和STC的串口下载电路时一样的。

不做修改。

这个有点费解?下载时用到的是串口形式的下载电路,硬件上使用时却没有串口。

杯具啊!关于IO口的复用功能,除P3.1没有复用功能外,其他引脚均有复用功能。

分别是5个外部中断,3个时钟输出,一个复位输入。

芯片默认是不需要复位电路的,上电自复位的。

可以通过软件来选择引脚作为复位脚。

同时在烧录软件上可以选择低压复位。

手册上说的是8种。

软件上只显示了6种-不解???让人惊喜的是烧录软件上提供硬件开启看门狗功能。

还可以选择看门狗分频级数。

还是蛮方便的嘛。

程序又少了几句话。

最后要说一点的是该种单片机以E结尾的都有EEPROM喔。

例如我买的STC15F104E。

有了这种小的单片机,大家以后做点简单的玩意也不拍浪费了。

好东西。

支持一下!特附上修改过的STC15F04E 头文件/*STC15F104E单片机特殊功能寄存器头文件*/#ifndef __REG52_H__#define __REG52_H__/* BYTE Registers */sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;/*BIT5 LVDF 低压检测标记位只要VCC小于芯片门槛电压自动置1 需软件清0 同时也是低压检测中断标记位BIT1 PD 为1进入掉电模式硬件清0BIT0 IDL 为1进入空闲模式硬件清0*/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;/* 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 ELVD = IE^6; //低压检测中断sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */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;/*IO口的设置寄存器四种模式P3M0 P1M10 0 与普通的IO口一样0 1 设置为强推挽模式1 0 设置为高阻输入模式1 1 设置为高漏输出模式*/sfr P3M0=0XB2;sfr P3M1=0XB1;/*AUXR寄存器BIT7 T0X12 定时器0速度为传统12倍BIT6 T1X12 定时器1速度为传统12倍*/sfr AUXR=0X8E;//不可以位寻址的/*CLK_DIV时钟分频寄存器控制系统时钟的分频数。

stc12c5a60s2单片机头文件

stc12c5a60s2单片机头文件

文件下载完成后,文件格式改为.h后保存到头文件库中,如keil软件,找到keil安装文件:keil—>c51—>INC头文件如下//--------------------------------------------------------------------------------//新一代1T 8051系列单片机内核特殊功能寄存器C51 Core SFRs// 7 6 5 4 3 2 1 0 Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------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;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//--------------------------------------------------------------------------------//新一代1T 8051系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0 Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000/*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1*///-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_W AKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒powerdown。

单片机常用芯片的头文件

单片机常用芯片的头文件
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR = ADC_POWER | ADC_SPEEDHH | chan | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待完成
Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/
delay_Nus(72);
Send(0,0x02); /*DDRAM地址归位*/
delay_Nus(72);
Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
delay_Nus(72);
Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
函数名称:delay_Nms
功能:延时N个ms的时间
参数:无
返回值:无
********************************************/
void delay_Nms(INT16U n)
{
INT16U i = 0;
for(i = n;i > 0;i--)
delay_1ms();
ADC_RES = 0; //清除高8位缓冲数据
ADC_RESL = 0; //清除低2位缓冲数据
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | chan;
_nop_();
_nop_();//打开ADC
}
*/
//----------------------------

C51单片机头文件INTRINS.H的作用

C51单片机头文件INTRINS.H的作用

C51单片机头文件INTRINS.H的作用在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便.内部函数描述_crol_ 字符循环左移_cror_ 字符循环右移_irol_ 整数循环左移_iror_ 整数循环右移_lrol_ 长整数循环左移_lror_ 长整数循环右移_nop_ 空操作8051 NOP 指令_testbit_ 测试并清零位8051 JBC 指令函数名:_crol_,_irol_,_lrol_原型:unsigned char _crol_(unsigned char val,unsigned char n);unsigned int _irol_(unsigned int val,unsigned char n);unsigned int _lrol_(unsigned int val,unsigned char n);举例:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。

_chkfloat_:测试并返回源点数状态。

就是汇编中的子函数。

_crol_,_cror_:如国二进制数为01010101 那么_crol_(1) 左移1位后将高位补低位。

结果10101010。

功能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令相关,上面几个函数不同于参数类型。

例:#i nclude{unsigned int y;C-5 1 程序设计37y=0x00ff;y=_irol_(y,4);}函数名:_cror_,_iror_,_lror_原型:unsigned char _cror_(unsigned char val,unsigned char n);unsigned int _iror_(unsigned int val,unsigned char n);unsigned int _lror_(unsigned int val,unsigned char n);功能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。

单片机C语言常用头文件

单片机C语言常用头文件

函数原形的头文件读者可参考返回非整型值的函数assert.h-assert(),声明宏ctype.h–字符类型函数float.h–浮点数原形limits.h–数据类型的大小和范围math.h–浮点运算函数stdarg.h–变量参数表.stddef.h–标准定义stdio.h–标准输入输出IO函数stdlib.h–包含内存分配函数的标准库string.h–字符串处理函数3字符类型库下列函数按照输入的ACS II字符集字符分类使用这些函数之前应当用"#include<ctype.h>"包含int isalnum(int c)如果c是数字或字母返回非零数值否则返回零int isalpha(int c)如果c是字母返回非零数值否则返回零int iscntrl(int c)如果c是控制字符如FF,BELL,LF..等返回非零数值否则返回零int isdigit(int c)如果c是数字返回非零数值否则返回零int isgraph(int c)如果c是一个可打印字符而非空格返回非零数值否则返回零int islower(int c)如果c是小写字母返回非零数值否则返回零int isprint(int c)如果c是一个可打印字符返回非零数值否则返回零int ispunct(int c)如果c是一个可打印字符而不是空格数字或字母返回非零数值否则返回零int isspace(int c)如果c是一个空格字符返回非零数值包括空格CR,FF,HT,NL,和VT否则返回零int isupper(int c)如果c是大写字母返回非零数值否则返回零int isxdigit(int c)如果c是十六进制数字返回非零数值否则返回零int tolower(int c)如果c是大写字母则返回c对应的小写字母其它类型仍然返回cint toupper(int c)如果c是小写字母则返回c对应的大写字母其它类型仍然返回c4浮点运算库下列函数支持浮点数运算使用这些函数之前必须用#include<math.h>包含float asin(float x)以弧度形式返回x的反正弦值float acos(float x)以弧度形式返回x的反余弦值float atan(float x)以弧度形式返回x的反正切值float atan2(float x,float y)返回y/x的反正切其范围在-~+之间float ceil(float x)返回对应x的一个整型数小数部分四舍五入float cos(float x)返回以弧度形式表示的x的余弦值float cosh(float x)返回x的双曲余弦函数值float exp(float x)返回以e为底的x的幂即e xfloat exp10(float x)返回以10为底的幂即10xfloat fabs(float x)返回x的绝对值float floor(float x)返回不大于x的最大整数float fmod(float x,float y)返回x/y的余数float frexp(float x,int*pexp)把浮点数x分解成数字部分y尾数和以2为底的指数n两个部分即x=y2n y的范围为0.5y1y值被函数返回而n值存放到pexp指向的变量中float fround(float x)返回最接近x的整型数float ldexp(float x,int exp)返回x2e x pfloat log(float x)返回x的自然对数float log10(float x)返回以10为底的x的对数float modf(float x,float*pint)把浮点数分解成整数部分和小数部分整数部分存放到pint指向的变量小数部分应当大于或等于0而小于1并且作为函数返回值返回float pow(float x,float y)返回x y值float sqrt(float x)返回x的平方根float sin(float x)返回以弧度形式表示的x的正弦值float sinh(float x)返回x的双曲正弦函数值float tan(float x)返回以弧度形式表示的x的正切值float tanh(float x)返回x的双曲正切函数值5标准输入输出库标准的文件输入输出是不能真正植入微控制器MCU的标准stdio.h的许多内容不可以使用不过有一些IO函数是被支持的同样使用之前应用"#include<stdio.h>"预处理并且需要初始化输出端口最低层的IO程序是单字符的输入(getchar)和输出(putchar)程序如果你针对不同的装置使用高层的IO函数例如用printf输出LCD你需要全部重新定义最底层的函数为在ATMEL的AVR Studio模拟器终端IO窗口使用标准IO函数应当在编译选项中选中相应的单选钮注意作为缺省单字符输出函数putchar是输出到UART装置没有修改无论如何为使输出能如期望的那样出现在程序终端窗口中'\n'字符必须被映射为成对的回车和换行CR/LFint getchar()使用查寻方式从UART返回一个字符int printf(char*fmt,..)按照格式说明符输出格式化文本frm字符串格式说明符是标准格式的一个子集%d--输出有符号十进制整数%o--输出无符号八进制整数%x-输出无符号十六进制整数%X–除了大写字母使用'A'-'F'外同%x%u-输出无符号十进制整数%s–输出一个以C中空字符NULL结束的字符串%c–以ASCII字符形式输出只输出一个字符%f–以小数形式输出浮点数%S–输出在FLASH存贮器中的字符串常量printf支持三个版本取决于你的特别需要和代码的大小越高的要求代码越大基本形:只有%c,%d,%x,%u,和%s格式说明符是承认的长整形:针对长整形数的修改%ld,%lu,%lx被支持,以适用于精度要求较高的领域浮点形:全部格式包括%f被支持你使用编译选项对话框来选择版本代码大小的增加是值得关注的int putchar(int c)输出单个字符这个库程序使用了UART以查寻方式输出单个字符注意输出’\n’字符至程序终端窗口int puts(char*s)输出以NL结尾的字符串int sprintf(char*buf,char*fmt)按照格式说明符输出格式化文本frm字符串到一个缓冲区格式说明符同printf()"const char*"支持功能cprintf和csprintf是将FLASH中的格式字符串分别以prinf和sprinf形式输出6标准库和内存分配函数标准库头文件<stdlib.h>定义了宏NULL和RAND_MAX和新定义的类型size_t并且描述了下列函数注意在你调用任意内存分配程序比如..calloc malloc和realloc)之前必须调用_NewHeap 来初始化堆heapint abs(int i)返回i的绝对值int atoi(char*s)转换字符串s为整型数并返回它字符串s起始必须是整型数形式字符否则返回0double atof(const char*s)转换转换字符串s为双精度浮点数并返回它字符串s起始必须是浮点数形式字符串long atol(char*s)转换字符串s为长整型数并返回它字符串s起始必须是长整型数形式字符否则返回0void*calloc(size_t nelem,size_t size)分配"nelem"个数据项的内存连续空间每个数据项的大小为size字节并且初始化为0如果分配成功返回分配内存单元的首地址否则返回0void exit(status)终止程序运行典型的是无限循环它是担任用户main函数的返回点void free(void*ptr)释放ptr所指向的内存区void*malloc(size_t size)分配size字节的存贮区如果分配成功则返回内存区地址如内存不够分配则返回0void_NewHeap(void*start,void*end)初始化内存分配程序的堆一个典型的调用是将符号_bss_end+1的地址用作"start"值符号_bss_end定义为编译器用来存放全局变量和字符串的数据内存的结束加1的目的是堆栈检查函数使用_bss_end字节存贮为标志字节这个结束值不能被放入堆栈中extern char_bss_end;_NewHeap(&_bss_end+1,&_bss_end+201);//初始化200字节大小的堆int rand(void)返回一个在0和RAND_MAX之间的随机数void*realloc(void*ptr,size_t size)重新分配ptr所指向内存区的大小为size字节size可比原来大或小返回指向该内存区的地址指针void srand(unsigned seed)初始化随后调用的随机数发生器的种子数long strtol(char*s,char**endptr,int base)按照"base."的格式转换"s"中起始字符为长整型数如果"endptr"不为空*endptr将设定"s"中转换结束的位置unsigned long strtoul(char*s,char**endptr,int base)除了返回类型为无符号长整型数外其余同"strtol"7字符串函数用"#include<string.h>"预处理后编译器支持下列函数<string.h>定义了NULL类型size_t和下列字符串及字符阵列函数void*memchr(void*s,int c,size_t n)在字符串s中搜索n个字节长度寻找与c相同的字符如果成功返回匹配字符的地址指针否则返回NULLint memcmp(void*s1,void*s2,size_t n)对字符串s1和s2的前n个字符进行比较如果相同则返回0如果s1中字符大于s2中字符则返回1如果s1中字符小于s2中字符则返回-1void*memcpy(void*s1,void*s2,size_t n)拷贝s2中n个字符至s1但拷贝区不可以重迭void*memmove(void*s1,void*s2,size_t n)拷贝s2中n个字符至s1返回s1其与memcpy基本相同但拷贝区可以重迭void*memset(void*s,int c,size_t n)在s中填充n个字节的c它返回schar*strcat(char*s1,char*s2)拷贝s2到s1的结尾返回s1char*strchr(char*s,int c)在s1中搜索第一个出现的c包括结束NULL字符如果成功返回指向匹配字符的指针如果没有匹配字符找到返回空指针int strcmp(char*s1,char*s2)比较两个字符串如果相同返回0如果s1>s2则返回1如果s1<s2则返回-1char*strcpy(char*s1,char*s2)拷贝字符串s2至字符串s1返回s1size_t strcspn(char*s1,char*s2)在字符串s1搜索与字符串s2匹配的第一个字符包括结束NULL字符其返回s1中找到的匹配字符的索引size_t strlen(char*s)返回字符串s的长度不包括结束NULL字符char*strncat(char*s1,char*s2,size_t n)拷贝字符串s2不含结束NULL字符中n个字符到s1如果s2长度比n小则只拷贝s2返回s1int strncmp(char*s1,char*s2,size_t n)基本和strcmp函数相同但其只比较前n个字符char*strncpy(char*s1,char*s2,size_t n)基本和strcpy函数相同但其只拷贝前n个字符char*strpbrk(char*s1,char*s2)基本和strcspn函数相同但它返回的是在s1匹配字符的地址指针否则返回NULL指针char*strrchr(char*s,int c)在字符串s中搜索最后出现的c并返回它的指针否则返回NULL.size_t strspn(char*s1,char*s2)在字符串s1搜索与字符串s2不匹配的第一个字符包括结束NULL字符其返回s1中找到的第一个不匹配字符的索引char*strstr(char*s1,char*s2)在字符串s1中找到与s2匹配的子字符串如果成功它返回s1中匹配子字符串的地址指针否则返回NULL"const char*"支持函数这些函数除了它的操作对象是在FLASH中常数字符串外其余同c中的函数size_t cstrlen(const char*s)char*cstrcpy(char*dst,const char*src);int cstrcmp(const char*s1,char*s2);8变量参数函数<stdarg.h>提供再入式函数的变量参数处理它定义了不确定的类型va_list和三个宏va_start(va_list foo,<last-arg>)初始化变量foova_arg(va_list foo,<promoted type>)访问下一个参数分派指定的类型注意那个类型必须是高级类型如int long或double小的整型类型如"char"不能被支持va_end(va_list foo)结束变量参数处理例如printf()可以使用vfprintf()来实现#include<stdarg.h>int printf(char*fmt,...){va_list ap;va_start(ap,fmt);vfprintf(fmt,ap);va_end(ap);}9堆栈检查函数有几个库函数是用于检查堆栈是否溢出内存图如下如果硬件堆栈增长到软件堆栈中那么软件堆栈的内容将会被改变也就是说局部变量和别的堆栈项目被改变硬件堆栈是用作函数的返回地址如果你的函数调用层次太深偶然会发生这种情况同样地软件堆栈溢出进数据区域将会改变全局变量或其它静态分配的项目如果你使用动态分配内存还会改变堆项目这种情况在你定义了太多的局部变量或一个局部集合变量太大也会偶然发生高端地址硬件堆栈区警戒线软件堆栈区警戒线数据区低端地址警戒线启动代码写了一个正确的关于数据区的地址字节和一个类似的正确的关于软件堆栈的地址字节作为警戒线[注意如果你使用了你自己的启动文件而其又是以6.20版本之前的启动文件为基础的你将需要额外改造为新的启动文件]注意如果你使用动态分配内存你必须跳过警戒线字节_bss_end来分配你的堆参考内存分配函数堆栈检查你调用_StackCheck(void)函数来检查堆栈溢出如果警戒线字节仍然保持正确的值那么函数检查通过如果堆栈溢出那么警戒线字节将可能被破坏注意当你的程序堆栈溢出的时候你的程序将可能运行不正常或偶然崩溃当_StackCheck检查错误条件时它调用了带一个参数的函数_StackOverflowed(char c)如果参数是1那么硬件堆栈有过溢出如果参数是0那么软件堆栈曾经溢出在那个例子中制造了两个功能调用它是两个堆栈都可能溢出的无论如何在_StackOverflowed执行起作用时第二个调用不可以出现作为例子如果函数复位了CPU那么将不能返回_StackCheck函数缺省的_StackOverflowed函数当它被调用时库会用一个缺省的_StackOverflowed函数来跳转到0的位置因此复位CPU和程序你可能希望用一个函数来代替它以指示更多的错__。

STC89系列单片机头文件

STC89系列单片机头文件

/*************************************************文件名: STC89.h**创建人: 动车组**日期: •2012-8-24**功能描述: STC89系列单片机的特殊功能寄存器***********************************************/#ifndef __STC89_H__#define __STC89_H__#include <REG52.H>sfr WDT_CONTR = 0xe1;//看门狗定时器控制器Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - EN_WDT CLR_WDT IDL_WDT PS2 PS1 PS0#define EN_WDT 0x20 //软件使能看门狗,打开后不能用软件的方式关闭为什么??#define CLR_WDT 0x10 //清看门狗定时器#define IDLE_WDT 0x08 //IDLE模式下,看门狗定时器是否继续计时/****************************************************************************** *******PS2 PS1 PS0 看门狗定时器预分频值= 2^(PS2 PS1 PS0+1)看门狗溢出时间= (N x Pre-scale x 32768) / Oscillator frequency当在12 clock mode时,N = 12; 当在6 clock mode时,N = 6例如PS2 PS1 PS0=111,N=12,系统晶振12M 看门狗溢出时间=12*256*32768/12000000=8.3886s******************************************************************************* ******/sfr AUXR = 0x8e; //辅助寄存器Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - - - - - EXTRAM S1BRS#define EXTRAM 0x02 //内部扩展RAM禁能位,0:内部扩展RAM有效1:禁用内部扩展RAM#define ALEOFF 0x01 //禁止ALE信号输出,0:使能ALE信号输出1:关闭ALE信号输出sfr AUXR1 = 0xa2; //辅助寄存器Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - - - GF2 - - DPS#define GF2 0x08 //通用标志位#define DPS 0x01 //DPTR0/DPTR1选择位,0:DPTR0 1:DPTR1sfr IPH = 0xb7; //中断优先级寄存器高位Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述PX3H PX2H PT2H PSH PT1HPX1H PT0H PX0H#define PX3H 0x80 //外部中断3中断优先级控制高位#define PX2H 0x40 //外部中断2中断优先级控制高位#define PT2H 0x20 //定时器2中断优先级控制高位#define PSH 0x10 //串口中断优先级控制高位#define PT1H 0x08 //定时器1中断优先级控制高位#define PX1H 0x04 //外部中断1中断优先级控制高位#define PT0H 0x02 //定时器0中断优先级控制高位#define PX0H 0x01 //外部中断0中断优先级控制高位sfr XICON = 0xe8; //辅助中断使能寄存器Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述PX3 EX3 IE3 IT3 PX2 EX2 IE2 IT2sbit PX3 = XICON^7; //外部中断3中断优先级控制低位sbit EX3 = XICON^6; //使能外部中断3sbit IE3 = XICON^5; //外部中断3的中断请求位,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit IT3 = XICON^4; //外部中断3的触发类型,0:低电平触发外部中断1:下降沿触发外部中断sbit PX2 = XICON^3; //外部中断2中断优先级控制低位sbit EX2 = XICON^2; //使能外部中断2sbit IE2 = XICON^1; //外部中断2的中断请求位,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit IT2 = XICON^0; //外部中断2的触发类型,0:低电平触发外部中断1:下降沿触发外部中断#define X0_INTNO 0 //外部中断中断号,入口地址为H#define T0_INTNO 1 //定时器中断号,入口地址为BH#define X1_INTNO 2 //外部中断中断号,入口地址为H#define T1_INTNO 3 //定时器中断号,入口地址为BH#define UART_INTNO 4 //串口中断号,入口地址为H#define T2_INTNO 5 //定时器中断号,入口地址为BH#define X2_INTNO 6 //外部中断中断号,入口地址为H#define X3_INTNO 7 //外部中断中断号,入口地址为BHsfr SADDR = 0xa9; //串口设备从地址寄存器sfr SADEN = 0xb9; //串口设备从地址屏蔽位/****************************************************************************** ****//*****************以下是ISP有关的寄存器**********************/sfr ISP_DATA = 0xe2; //ISP数据寄存器sfr ISP_ADDRH = 0xe3; //ISP地址高位寄存器sfr ISP_ADDRL = 0xe4; //ISP地址低位寄存器sfr ISP_CMD = 0xe5; //ISP命令寄存器---- --MS1 MS0/****************************************************************************** ****MS1 MS0:IAP命令/操作模式选择00:待机模式,无ISP操作01:从用户的应用程序区对"Data Flash/EEPROM区"进行字节读10:从用户的应用程序区对"Data Flash/EEPROM区"进行字节编程11:从用户的应用程序区对"Data Flash/EEPROM区"进行扇区擦除程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除******************************************************************************* **/#define ISP_IDLE 0x00 //ISP待机命令#define ISP_READ 0x01 //ISP读字节数据命令#define ISP_PROGRAM 0x02 //ISP字节编程命令#define ISP_ERASE 0x03 //ISP扇区擦除命令(每扇区字节))sfr ISP_TRIG = 0xe6; //ISP命令触发寄存器#define ISP_TRIG0 0x46 //ISP功能触发命令#define ISP_TRIG1 0xb9 //ISP功能触发命令sfr ISP_CONTR = 0xe7; //ISP控制寄存器Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述ISPEN SWBS SWRST - - WT2 WT1 WT0/****************************************************************************** *************IAPEN: ISP功能允许位。

51单片机头文件reg51.h详解

51单片机头文件reg51.h详解

我们在用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语言头文件

单片机C语言头文件

单片机C语言编程头文件解析一,C51内存结构深度剖析二,reg51.头文件剖析三,浅淡变量类型及其作用域四,C51常用头文件五,浅谈中断六,C51编译器的限制七,小淡C51指针*************************************我们平时写单片机应用程序的时候,所使用的头文件大多都是用的的reg51.h或是用reg52.h。

会写C51的人都会用,但对其头文件内部的定义有所了解的人确并不多。

下面对其内部做详细解释,方便读者作进一步的了解,并能运用各类型号的单片机。

因为增强型号的单片机的增强功能都是通过特殊功能寄存器(SFR)控制。

打开reg52.h 头文件,会发现是由大量的sfr ,sbit的声明组成,甚至于还有sfr16.其实这样的声明都是与单片机内部功能寄存器(特殊功能寄存器)联系起来的,下面对其做出详细解释SFR 声明一个变量,它的声明与其它的C变量声明基本相同,唯一的区别,SFR在声明的同时为其指定特殊功能寄存器作为存储地址,而不同于C变量声明的整型,字符型等等由编译器自动分配存储空间。

(sfr只用于特殊功能寄存器的声明)如reg52.h头文件,第一条声明就是sfr P0 = 0x80;此处声明一个变量P0,并指定其存储地址为特殊功能寄存器0x80;,在加入reg52.h 头文件后。

编写应用程序时P0就可以直接使用而无需定义,对P0的操作就是,对内部特殊功能寄存器(0x80对应用MCU的P0口)的操作,可进行读写操作。

如果将第一条声明改为sfr K0 = 0x80; 那么,如果要把单片机的P0口全部拉低,则不能写P0=0x00;而应保存后再在应用程序中写成K0=0x00;否则编译器会提示“P0为未定义标识符”使用方法:sfr [variable] = [address] //为变量分配一个特殊功能寄存器。

1、等号右边,只能是十进制,十六进制整型的数据常量,不允许带操作符的表达式。

单片机stc89(STC89C52,C51)系列头文件.doc

单片机stc89(STC89C52,C51)系列头文件.doc

/*------------------------------------------------*//* --- 宏晶科技STCMCU ---------------------------*//* --- Mobile: (86) -------------------*//* --- Fax: 86- ----------------------*//* --- Tel: 86- ----------------------*//* --- Web: -----------------------*//* 适用于: STC89C5xRC STC89LE5xRC --------------*//* ------- STC89C5xRD+ STC89LE5xRD+ --------------*//*------------------------------------------------*/#ifndef __STC89_H__#define __STC89_H__////////////////////////////////////////////////////////////////////////////////////////////////////////////////sfr PSW = 0xd0; //程序状态字 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述CY AC F0 RS1 RS0 OV F1 P//初始值=0000,0000 0 0 0 0 0 0 0 0sbit 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; //ACC的偶校验位/////////////////////////////////sfr ACC = 0xe0; //累加器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0sbit ACC7 = ACC^7; //累加器第位sbit ACC6 = ACC^6; //累加器第位sbit ACC5 = ACC^5; //累加器第位sbit ACC4 = ACC^4; //累加器第位sbit ACC3 = ACC^3; //累加器第位sbit ACC2 = ACC^2; //累加器第位sbit ACC1 = ACC^1; //累加器第位sbit ACC0 = ACC^0; //累加器第位/////////////////////////////////sfr B = 0xf0; //B寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr SP = 0x81; //堆栈指针 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0111 0 0 0 0 0 1 1 1/////////////////////////////////sfr DPL = 0x82; //数据指针低字节 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0sfr DPH = 0x83; //数据指针高字节 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0////////////////////////////////////////////////////////////////////////////////////////////////////////////////sfr PCON = 0x87; //电源控制寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 SMOD SMOD0 - POF GF1 GF0 PD IDL//初始值=00x1,0000 0 0 x 1 0 0 0 0#define SMOD 0x80 //串口波特率倍速位,置可使波特率快倍#define SMOD0 0x40 //FE/SM0选择位,0:为SM0 1:为FE#define POF 0x10 //上电复位标志位,上电时由硬件置,需由软件清#define GF1 0x08 //通用标志位#define GF0 0x04 //通用标志位#define PD 0x02 //掉电控制位,写可以使MCU进入PowerDown模式#define IDL 0x01 //空闲控制位,写可以使MCU进入Idle模式/////////////////////////////////sfr WDT_CONTR = 0xe1; //看门狗定时器控制器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - EN_WDT CLR_WDT IDL_WDT PS2 PS1 PS0//初始值=xx00,0000 x x 0 0 0 0 0 0#define EN_WDT 0x20 //软件使能看门狗,打开后不能用软件的方式关闭#define CLR_WDT 0x10 //清看门狗定时器#define IDLE_WDT 0x08 //IDLE模式下,看门狗定时器是否继续计时////////////////////////////////////////////////////////////////////////////////////////////////////////////////sfr AUXR = 0x8e; //辅助寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - - - - - EXTRAM S1BRS//初始值=xxxx,xx00 xx x x x x 0 0#define EXTRAM 0x02 //内部扩展RAM禁能位,0:内部扩展RAM有效1:禁用内部扩展RAM#define ALEOFF 0x01 //禁止ALE信号输出,0:使能ALE信号输出1:关闭ALE信号输出/////////////////////////////////sfr AUXR1 = 0xa2; //辅助寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - - - GF2 - - DPS//初始值=xxxx,0xx0 x x x x 0 x x 0#define GF2 0x08 //通用标志位#define DPS 0x01 //DPTR0/DPTR1选择位,0:DPTR01:DPTR1////////////////////////////////////////////////////////////////////////////////////////////////////////////////sfr P0 = 0x80; //I/O端口 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述//初始值=1111,1111 1 1 1 1 1 1 1 1sbit P07 = P0^7; //I/O口sbit P06 = P0^6; //I/O口sbit P05 = P0^5; //I/O口sbit P04 = P0^4; //I/O口sbit P03 = P0^3; //I/O口sbit P02 = P0^2; //I/O口sbit P01 = P0^1; //I/O口sbit P00 = P0^0; //I/O口/////////////////////////////////sfr P1 = 0x90; //I/O端口 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述//初始值=1111,1111 1 1 1 1 1 1 1 1sbit P17 = P1^7; //I/O口sbit P15 = P1^5; //I/O口sbit P14 = P1^4; //I/O口sbit P13 = P1^3; //I/O口sbit P12 = P1^2; //I/O口sbit P11 = P1^1; //I/O口sbit P10 = P1^0; //I/O口sbit T2 = P1^0; //定时器的外部信号输入口sbit T2CLKO = P1^0; //定时器定的时钟溢出脉冲输出脚sbit T2EX = P1^1; //定时器的中断控制源/////////////////////////////////sfr P2 = 0xa0; //I/O端口 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述//初始值=1111,1111 1 1 1 1 1 1 1 1sbit P27 = P2^7; //I/O口sbit P26 = P2^6; //I/O口sbit P24 = P2^4; //I/O口sbit P23 = P2^3; //I/O口sbit P22 = P2^2; //I/O口sbit P21 = P2^1; //I/O口sbit P20 = P2^0; //I/O口/////////////////////////////////sfr P3 = 0xb0; //I/O端口 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述//初始值=1111,1111 1 1 1 1 1 1 1 1sbit P37 = P3^7; //I/O口sbit P36 = P3^6; //I/O口sbit P35 = P3^5; //I/O口sbit P34 = P3^4; //I/O口sbit P33 = P3^3; //I/O口sbit P32 = P3^2; //I/O口sbit P31 = P3^1; //I/O口sbit RXD = P3^0; //串口的数据接收口sbit TXD = P3^1; //串口的数据发送口sbit INT0 = P3^2; //外部中断的信号输入口sbit INT1 = P3^3; //外部中断的信号输出口sbit T0 = P3^4; //定时器的外部信号输入口sbit T1 = P3^5; //定时器的外部信号输入口sbit WR = P3^6; //外部数据存储器的写信号sbit RD = P3^7; //外部数据存储器的读信号/////////////////////////////////sfr P4 = 0xc0; //I/O端口 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 -//初始值=xxxx,1111 xx x x 1 1 1 1sbit P43 = P4^3; //I/O口sbit P42 = P4^2; //I/O口sbit P41 = P4^1; //I/O口sbit P40 = P4^0; //I/O口////////////////////////////////////////////////////////////////////////////////////////////////////////////////sfr IE = 0xa8; //中断使能寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述EA - ET2 ES ET1 EX1 ET0 EX0//初始值=0x00,0000 0 x 0 0 0 0 0 0sbit EA = IE^7; //总中断开关sbit ET2 = IE^5; //定时器中断使能位sbit ES = IE^4; //串口中断使能位sbit ET1 = IE^3; //定时器中断使能位sbit EX1 = IE^2; //外部中断中断使能位sbit ET0 = IE^1; //定时器中断使能位sbit EX0 = IE^0; //外部中断中断使能位/////////////////////////////////sfr IPH = 0xb7; //中断优先级寄存器高位 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 PX3H PX2H PT2H PSH PT1H PX1H PT0H PX0H//初始值=0000,0000 0 0 0 0 0 0 0 0#define PX3H 0x80 //外部中断中断优先级控制高位#define PX2H 0x40 //外部中断中断优先级控制高位#define PT2H 0x20 //定时器中断优先级控制高位#define PSH 0x10 //串口中断优先级控制高位#define PT1H 0x08 //定时器中断优先级控制高位#define PX1H 0x04 //外部中断中断优先级控制高位#define PT0H 0x02 //定时器中断优先级控制高位#define PX0H 0x01 //外部中断中断优先级控制高位/////////////////////////////////sfr IP = 0xb8; //中断优先级寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - PT2 PS PT1 PX1 PT0 PX0//初始值=xx00,0000 x x 0 0 0 0 0 0sbit PT2 = IP^5; //定时器中断优先级控制低位sbit PS = IP^4; //串口中断优先级控制低位sbit PT1 = IP^3; //定时器中断优先级控制低位sbit PX1 = IP^2; //外部中断中断优先级控制低位sbit PT0 = IP^1; //定时器中断优先级控制低位sbit PX0 = IP^0; //外部中断中断优先级控制低位/////////////////////////////////sfr XICON = 0xe8; //辅助中断使能寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 PX3 EX3 IE3 IT3 PX2 EX2 IE2 IT2//初始值=0000,0000 0 0 0 0 0 0 0 0sbit PX3 = XICON^7; //外部中断中断优先级控制低位sbit EX3 = XICON^6; //使能外部中断sbit IE3 = XICON^5; //外部中断的中断请求位,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit IT3 = XICON^4; //外部中断的触发类型,0:低电平触发外部中断1:下降沿触发外部中断sbit PX2 = XICON^3; //外部中断中断优先级控制低位sbit EX2 = XICON^2; //使能外部中断sbit IE2 = XICON^1; //外部中断的中断请求位,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit IT2 = XICON^0; //外部中断的触发类型,0:低电平触发外部中断1:下降沿触发外部中断#define X0_INTNO 0 //外部中断中断号,入口地址为H#define T0_INTNO 1 //定时器中断号,入口地址为BH#define X1_INTNO 2 //外部中断中断号,入口地址为H#define T1_INTNO 3 //定时器中断号,入口地址为BH#define UART_INTNO 4 //串口中断号,入口地址为H#define T2_INTNO 5 //定时器中断号,入口地址为BH#define X2_INTNO 6 //外部中断中断号,入口地址为H#define X3_INTNO 7 //外部中断中断号,入口地址为BH////////////////////////////////////////////////////////////////////////////////////////////////////////////////sfr TCON = 0x88; //定时器/1控制寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0//初始值=0000,0000 0 0 0 0 0 0 0 0sbit TF1 = TCON^7; //定时器溢出标志,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit TR1 = TCON^6; //定时器的启动控制位,1:启动定时器0:停止定时器sbit TF0 = TCON^5; //定时器溢出标志,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit TR0 = TCON^4; //定时器的启动控制位,1:启动定时器0:停止定时器sbit IE1 = TCON^3; //外部中断的中断请求位,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit IT1 = TCON^2; //外部中断的触发类型,0:低电平触发外部中断1:下降沿触发外部中断sbit IE0 = TCON^1; //外部中断的中断请求位,由硬件置,可由软件清或者在中断处理程序完成后由硬件自动清sbit IT0 = TCON^0; //外部中断的触发类型,0:低电平触发外部中断1:下降沿触发外部中断/////////////////////////////////sfr TMOD = 0x89; //定时器/1模式寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 GATEC/T# M1 M0 GATE C/T# M1 M0//初始值=0000,0000 0 0 0 0 0 0 0 0#define GATE1 0x80 //定时器启动控制位,0:TR1为时启动定时器1:TR1为且INT1为高电平时才启动定时器#define C_T1 0x40 //定时器/计数器选择位,0:定时器(时钟源为内部时钟) 1:计数器(时钟源为T1引脚的外部时钟)#define T1_M0 0x00 //定时器操作模式:13位定时器#define T1_M1 0x10 //定时器操作模式:16位定时器#define T1_M2 0x20 //定时器操作模式:8位自动重载定时器#define T1_M3 0x30 //定时器操作模式:定时器停止#define GATE0 0x08 //定时器启动控制位,0:TR0为时启动定时器1:TR0为且INT0为高电平时才启动定时器#define C_T0 0x04 //定时器/计数器选择位,0:定时器(时钟源为内部时钟) 1:计数器(时钟源为T0引脚的外部时钟)#define T0_M0 0x00 //定时器操作模式:13位定时器#define T0_M1 0x01 //定时器操作模式:16位定时器#define T0_M2 0x02 //定时器操作模式:8位自动重载定时器#define T0_M3 0x03 //定时器操作模式:TL0和TH0为两组独立位定时器/////////////////////////////////sfr TL0 = 0x8a; //定时器的低位计数值 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr TL1 = 0x8b; //定时器的低位计数值 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr TH0 = 0x8c; //定时器的高位计数值 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr TH1 = 0x8d; //定时器的高位计数值 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr T2CON = 0xc8; //定时器控制寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2# CP/RL#//初始值=0000,0000 0 0 0 0 0 0 0 0sbit TF2 = T2CON^7; //定时器溢出标志,由硬件置,必须由软件清sbit EXF2 = T2CON^6; //定时器的外部标志,由硬件置,必须由软件清sbit RCLK = T2CON^5; //接收时钟标志,0:使用定时器作为串口接收发生器1:使用定时器作为串口接收发生器sbit TCLK = T2CON^4; //发送时钟标志,0:使用定时器作为串口发送发生器1:使用定时器作为串口发送发生器sbit EXEN2 = T2CON^3; //定时器的外部使能标志sbit TR2 = T2CON^2; //启动定时期sbit C_T2 = T2CON^1; //定时器/计数器选择位,0:定时器(时钟源为内部时钟) 1:计数器(时钟源为T2引脚的外部时钟)sbit CP_RL2 = T2CON^0; //捕获/重载标志/////////////////////////////////sfr T2MOD = 0xc9; //定时器/1模式寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述- - - - - - T2OE DCEN//初始值=xxxx,xx00 x x x x x x 0 0#define T2OE 0x02 //定时器输出使能,输出溢出率到T2脚#define DCEN 0x01 //定时器向下计数,0:向上计数1:向下计数/////////////////////////////////sfr RCAP2L = 0xca; //定时器重载/捕获低位Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr RCAP2H = 0xcb; //定时器重载/捕获高位Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr TL2 = 0xcc; //定时器的低位计数值 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr TH2 = 0xcd; //定时器的高位计数值 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr SCON = 0x98; //串口控制寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 SM0/FESM1 SM2 REN TB8 RB8 TI Ri//初始值=0000,0000 0 0 0 0 0 0 0 0sbit FE = SCON^7; //帧错误检测位,当串口模块在接收数据时没有检测到正确的停止位时,FE被硬件置,需要由软件来清(当SMOD0为时,FE有效)sbit SM0 = SCON^7; //串口模式设置位sbit SM1 = SCON^6; //SM0/SM1=0/0:移位寄存器0/1:8位可变波特率1/0:9位固定波特率1/1:9位可变波特率sbit SM2 = SCON^5; //自动地址识别使能位sbit REN = SCON^4; //使能串口接收模块sbit TB8 = SCON^3; //发送的第位数据sbit RB8 = SCON^2; //接收的第位数据sbit TI = SCON^1; //发送完成中断标志sbit RI = SCON^0; //接收完成中断标志/////////////////////////////////sfr SBUF = 0x99; //串口接收/发送数据 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=xxxx,xxxx x x x x x x x x/////////////////////////////////sfr SADDR = 0xa9; //串口设备从地址寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr SADEN = 0xb9; //串口设备从地址屏蔽位 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0////////////////////////////////////////////////////////////////////////////////////////////////////////////////sfr ISP_DATA = 0xe2; //ISP数据寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=1111,1111 1 1 1 1 1 1 1 1/////////////////////////////////sfr ISP_ADDRH = 0xe3; //ISP地址高位寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr ISP_ADDRL = 0xe4; //ISP地址低位寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=0000,0000 0 0 0 0 0 0 0 0/////////////////////////////////sfr ISP_CMD = 0xe5; //ISP命令寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=xxxx,xx00 x x x x x 0 0 0#define ISP_IDLE 0x00 //ISP待机命令#define ISP_READ 0x01 //ISP读字节数据命令#define ISP_PROGRAM 0x02 //ISP字节编程命令#define ISP_ERASE 0x03 //ISP扇区擦除命令(每扇区字节))/////////////////////////////////sfr ISP_TRIG = 0xe6; //ISP命令触发寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//初始值=xxxx,xxxx x x x x x x x x#define ISP_TRIG0 0x46 //ISP功能触发命令#define ISP_TRIG1 0xb9 //ISP功能触发命令/////////////////////////////////sfr ISP_CONTR = 0xe7; //ISP控制寄存器 Bit7Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0//位描述 ISPEN SWBS SWRST - - WT2 WT1 WT0//初始值=000x,x000 0 0 0 x x 0 0 0#define ISPEN 0x80 //ISP使能开关#define SWBS 0x40 //软启动选择,0:从用户AP启动1:从ISP启动#define SWRST 0x20 //触发软件复位////////////////////////////////////////////////////////////////////////////////////////////////////////////////#endif。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//STC 单片机内部ADC转换程序//可选择查询和中断方式//H文件#ifndef __ADC_H__#define __ADC_H__#define ADC_POWER 0x80 //ADC 电源控制位#define ADC_FLAG 0x10 //ADC 完成标志#define ADC_START 0x08 //ADC 启动控制位//ADC转换速度选择#define ADC_SPEEDLL 0x00 //420 clocks#define ADC_SPEEDL 0x20 //280 clocks#define ADC_SPEEDH 0x40 //140 clocks#define ADC_SPEEDHH 0x60 //70 clocksunsigned int AD_Result_Temp;unsigned int GetADCResult (unsigned char chan); //ADC 转换处理,查询方式#endif//C文件#ifndef __ADC_C__#define __ADC_C__#include <adc.h>//#include <cbit.h>/*----------------------------初始化ADC 寄存器中断方式----------------------------void InitADC(){unsigned unsigned char chan=0;P1ASF = 0xff; //设置P1口全部为ADC通道ADC_RES = 0; //清除高8位缓冲数据ADC_RESL = 0; //清除低2位缓冲数据ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | chan;_nop_();_nop_(); //打开ADC}*///----------------------------//ADC 中断处理//----------------------------/*void adc_isr() interrupt 5 using 1{unsigned unsigned int AD_Result_TempADC_CONTR &= !ADC_FLAG; //清除ADC 中断标志位return (((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL); //返回10位ADC转换结果if (++ch > 7) ch = 0; //却换到下一个通道ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | chan;}*/unsigned int GetADCResult(unsigned char chan){AD_Result_Temp=0;ADC_RES=0;ADC_RESL=0;ADC_CONTR = ADC_POWER | ADC_SPEEDHH | chan | ADC_START;_nop_(); //Must wait before inquiry_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待完成ADC_CONTR &= ~ADC_FLAG; //关闭ADC转换AD_Result_Temp=(((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL);return AD_Result_Temp;}#endif//74HC595//发送完一个8位数据,就锁存一次// 8个数码管,可以这样做// for(i=0;i<8;i++)// {// Send_HC595(....//要发送的8为数据);// Show_595();// }/********************************************************//* *//*将显示数据送入74HC595内部移位寄存器*//* *//********************************************************/void Send_HC595(INT16U LED_DATA){INT8U i;for(i=0;i<8;i++){HC595_DS=LED_DATA&0x80;HC595_SHCP=1; //上升沿发生移位_nop_();_nop_();HC595_SHCP=0;LED_DATA=LED_DATA<<1;}}/********************************************************//* *//*将移位寄存器内的数据锁存到输出寄存器并显示*//* *//********************************************************/void Show_595(void){HC595_STCP=0;_nop_();_nop_();HC595_STCP=1; //上升沿将数据送到输出锁存器_nop_();_nop_();HC595_STCP=0;}//74HC164#ifndef __74LS164_H__#define __74LS164_H__extern void Write_Bit8(unsigned char bit_8){unsigned char i;for(i=8;i>0;i--) //数码管段8位数据{Data=bit_8&0x80; //传送一位数据CLK=0;CLK=1;bit_8=bit_8<<1;}}#endif20位串口A/D转换器CS5513 20位串口A/D转换器CS5513 接口程序2010-03-22 14:56//cs5513接口的C51官方程序//cs5513返回长整型数据//CS=0时表示片选有效,当然可以直接接地,这样可以节省一个I/O口sbit ADCS=P2^0;sbit ADCLK=P2^1;sbit ADDO=P2^2;unsigned long int ADConv(void){uchar i;unsigned long int Result=0;ADCLK=0;ADCS=0;_nop_();_nop_();_nop_();ADCLK=0;while(ADDO);ADCLK=1;_nop_();for(i=0;i<3;i++){ADCLK=0;_nop_();ADCLK=1;}for (i=0;i<20;i++){ADCLK=0;Result=Result<<1;if (ADDO)Result=Result+1;ADCLK=1;}ADCS=1;return Result;}//LCD SMC12864-05#ifndef _CRYFUCNS_H_#define _CRYFUCNS_H_void Send(unsigned char type,unsigned char transdata);void Init_LCD(void);void Clear_GDRAM(void);void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num); void Draw_PM(const unsigned char *ptr);void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ; void Disp_SZ(unsigned char addr,unsigned char shuzi);#endif#include <cryfucns.h>#include <STC12C5A.H>#include<intrins.h>#include <types.h>extern const INT8U shuzi_table[];void Send(INT8U type,INT8U transdata);/**********液晶控制IO的宏定义*************/sbit RS_CS = P0^0;sbit RW_SDI = P0^1;sbit E_CLK = P0^2;/*******************************************函数名称:delay_Nus功能:延时N个us的时间参数:n--延时长度返回值:无********************************************/void delay_Nus(INT16U n){INT8U i;for(i = n;i > 0;i--)_nop_();}/*******************************************函数名称:delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/void delay_1ms(void){INT8U i;for(i = 150;i > 0;i--) _nop_();}/*******************************************函数名称:delay_Nms功能:延时N个ms的时间参数:无返回值:无********************************************/void delay_Nms(INT16U n){INT16U i = 0;for(i = n;i > 0;i--)delay_1ms();}/*******************************************函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/void Init_LCD(void){delay_Nms(100); //延时等待液晶完成复位Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/delay_Nus(72);Send(0,0x02); /*DDRAM地址归位*/delay_Nus(72);Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/delay_Nus(72);Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/delay_Nus(72);Send(0,0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ delay_Nus(72);}/*******************************************函数名称:Send功能:MCU向液晶模块发送1一个字节的数据参数:type--数据类型,0--控制命令,1--显示数据transdata--发送的数据返回值:无********************************************/void Send(INT8U type,INT8U transdata){INT8U firstbyte = 0xf8;INT8U temp;INT8U i,j = 3;if(type) firstbyte |= 0x02;RS_CS=1;E_CLK=0;while(j > 0){if(j == 3) temp = firstbyte;else if(j == 2) temp = transdata&0xf0;else temp = (transdata << 4) & 0xf0;for(i = 8;i > 0;i--){if(temp & 0x80) RW_SDI=1;else RW_SDI=0;E_CLK=1;temp <<= 1;E_CLK=0;}//三个字节之间一定要有足够的延时,否则易出现时序问题if(j == 3) delay_Nus(600);else delay_Nus(200);j--;}RW_SDI=0;RS_CS=0;}/*******************************************函数名称:Clear_GDRAM功能:清除液晶GDRAM内部的随机数据参数:无返回值:无********************************************/void Clear_GDRAM(void){INT8U i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,0x00);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,0x00);}}Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Disp_HZ功能:显示汉字程序参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示数据的个数返回值:无********************************************/ void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num) {INT8U i;Send(0,addr);for(i = 0;i < (num*2);i++)Send(1,*(pt++));}/*******************************************函数名称:Draw_PM功能:在整个屏幕上画一个图片参数:ptr--指向保存图片位置的指针返回值:无********************************************/ void Draw_PM(const INT8U *ptr){INT8U i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,*ptr++);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,*ptr++);}}Send(0,0x36); //打开绘图显示Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Draw_TX功能:在液晶上描绘一个16*16的图形参数:Yaddr--Y地址,Xaddr--X地址dp--指向保存图形数据的指针返回值:无********************************************/void Draw_TX(INT8U Yaddr,INT8U Xaddr,const INT8U * dp){INT8U j;INT8U k = 0;Send(0,0x34); //使用扩展指令集,关闭绘图显示for(j = 0;j < 16;j++){Send(0,Yaddr++); //Y地址Send(0,Xaddr); //X地址Send(1,dp[k++]); //送两个字节的显示数据Send(1,dp[k++]);}Send(0,0x36); //打开绘图显示Send(0,0x30); //回到基本指令集模式}/*******************************************函数名称:Disp_SZ功能:显示一个两位数字参数:addr--显示地址数字--显示的数字返回值:无********************************************/void Disp_SZ(INT8U addr,INT8U shuzi){INT8U tmp0,tmp1;tmp0 = shuzi / 10;tmp1 = shuzi % 10;Send(0,addr);Send(1,shuzi_table[tmp0]);Send(1,shuzi_table[tmp1]);}//STC 内部EEPROM 操作程序#ifndef _EEPROM_H_#define _EEPROM_H_//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值#define FIRST 0x0000#define SECOND 0x200#define THIRD 0x400#define START_FLAG 0xE1union eeprom_addr{unsigned int temp16;unsigned char temp8[2];}addr16;void IAP_Disable (void); //关闭IAP 功能void Sector_Erase (unsigned int add); //擦除扇区void Byte_Program (unsigned int add, unsigned char ch); //字节编程,调用前需打开IAP 功能extern unsigned char Byte_Read (unsigned int add); //读一字节,调用前需打开IAP 功能#endif#include <eeprom.h>/*********************************************************************************************** 读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节************************************************************************************************ /unsigned char Byte_Read(unsigned int add){EA = 0;IAP_DATA = 0x00;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关EA = 1;return (IAP_DATA);}/*********************************************************************************************** *****字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据************************************************************************************************ *****/void Byte_Program(unsigned int add, unsigned char ch){EA = 0;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash操作等待时间IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/*********************************************************************************************** *******擦除扇区, 入口:DPTR = 扇区地址************************************************************************************************ *******/void Sector_Erase(unsigned int add){EA = 0;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/*********************************************************************************************** *****关闭IAP 功能************************************************************************************************ *****/void IAP_Disable(){//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关IAP_CONTR = 0; //关闭IAP 功能IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0;IAP_ADDRL = 0;}//MAX186 程序#ifndef _MAX186_H_#define _MAX186_H_#include <stc12c5a.h>sbit MAX186_SCLK_1 = P1^0;sbit MAX186_CS_1 = P1^1;sbit MAX186_DIN_1 = P1^2;sbit MAX186_DOUT_1 = P1^3;sbit MAX186_SCLK_2 = P1^4;sbit MAX186_CS_2 = P1^5;sbit MAX186_DIN_2 = P1^6;sbit MAX186_DOUT_2 = P1^7;unsigned int Max186_AD(unsigned char chan);#endif#include <max186.h>unsigned int Max186_AD(unsigned char chan){unsigned char i,kki,ch;unsigned int i_data,i_datatransfer,addata;switch(chan){case 0: ch=0x8E;break;case 1: ch=0xCE;break;case 2: ch=0x9E;break;case 3: ch=0xDE;break;case 4: ch=0xAE;break;case 5: ch=0xEE;break;case 6: ch=0xBE;break;case 7: ch=0xFE;break;default: ch=0xAE;break;}MAX186_CS_2=1;MAX186_SCLK_2=0;MAX186_CS_2=0;MAX186_SCLK_2=0;for(i=0;i<8;i++){unsigned char adaddresstransfer;adaddresstransfer=ch;adaddresstransfer=(adaddresstransfer>>(7-i))&0x01;MAX186_DIN_2=adaddresstransfer;MAX186_SCLK_2=1;for(kki=0;kki<2;kki++);MAX186_SCLK_2=0;}MAX186_CS_2=1;for(i=0;i<6;i++);MAX186_CS_2=0;MAX186_SCLK_2=1;for(i=0;i<12;i++){MAX186_SCLK_2=1;MAX186_SCLK_2=0;i_datatransfer=MAX186_DOUT_2;i_datatransfer=i_datatransfer<<(11-i);i_data=i_data|i_datatransfer;}addata=i_data;for(i=0;i<4;i++){MAX186_SCLK_2=1;MAX186_SCLK_2=0;}MAX186_CS_2=1;i_data=i_datatransfer=0;delay(5);return(addata);}//SMC12864-05.H #ifndef _SMC12864_05_H_#define _SMC12864_05_H_#include<types.h>void Init_LCD();void SetOnOFF(bit Switch);void Clean_LCD();void Check_LCD_Status();void Write_Cmd(INT8U Cmd);void Set_Adrr(INT8U x,INT8U y);void Write_Data(INT8U Data);void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num); #endif#include<SMC12864_05.H>#include<STC12C5A.H>#include<intrins.h>#include<delay.h>sbit RS_CS = P2^7;sbit RW_SDI = P2^6;sbit E_CLK = P2^5;sbit Busy_Bit = P0^7;void Init_LCD(){Write_Cmd(0x30); //基本指令集delay(1);Write_Cmd(0x02); // 地址归位delay(1);Write_Cmd(0x0c); //整体显示打开,游标关闭delay(1);Write_Cmd(0x01); //清除显示delay(1);Write_Cmd(0x06); //游标右移delay(1);Write_Cmd(0x80); //设定显示的起始地址Clean_LCD();SetOnOFF(1);}void Clean_LCD(){RS_CS=0;RW_SDI=0;P0=0x01;E_CLK=1;delay(1);E_CLK=0;}void SetOnOFF(bit Switch){RS_CS=0;RW_SDI=0;if(Switch==1)P0=0x0F;else P0=0x08;E_CLK=1;delay(1);E_CLK=0;}void Write_Cmd(INT8U Cmd){Check_LCD_Status();RS_CS=0;RW_SDI=0;P0=Cmd;E_CLK=1;delay(1);E_CLK=0;}void Write_Data(INT8U Data){Check_LCD_Status();RS_CS=1;RW_SDI=0;P0=Data;E_CLK=1;delay(1);E_CLK=0;}void Check_LCD_Status(){RS_CS=0;RW_SDI=1;P0=0xFF;E_CLK=1;delay(1);E_CLK=0;while(!Busy_Bit);}/*******************************************函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/ void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num) {INT8U i;Write_Cmd(addr);for(i = 0;i < (num*2);i++)Write_Data(*(pt++));}。

相关文档
最新文档