[单片机SFR定义的头文件
#include //通用89C51头文件
#include //通用89C52头文件
#include //STC11Fxx或STC11Lxx系列单片机头文件
#include //STC12Cx052或STC12Cx052AD系列单片机头文件
#include //STC12C5A60S2系列单片机头文件
[更多库函数头定义
#include //设定插入点
#include //字符处理
#include //定义错误码
#include //浮点数处理
#include //文件输入/输出
#include //参数化输入/输出
#include //数据流输入/输出
#include //定义各种数据类型最值常量
#include //定义本地化函数
#include //定义数学函数
#include //定义输入/输出函数
#include //定义杂项函数及内存分配函数
#include //字符串处理
#include //基于数组的输入/输出
#include //定义关于时间的函数
#include //宽字符处理及输入/输出
#include //宽字符分类
#include //51基本运算(包括_nop_空函数)
[常用定义声明
sfr[自定义名] = [SFR地址] ; //按字节定义SFR中的存储器名。例:sfr P1 = 0x90;
sbit[自定义名] = [系统位名] ; //按位定义SFR中的存储器名。例:sbit Add_Key = P3 ^ 1;
bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED;
#define [代替名][原名]//用代替名代替原名。例:#define LED P1 / #define TA 0x25
unsigned char [自定义名] ; //定义一个0~255的整数变量。例:unsigned char a;
unsigned int [自定义名] ; //定义一个0~65535的整数变量。例:unsigned int a;
[定义常量和变量的存放位置的关键字
data 字节寻址片内RAM,片内RAM的128字节(例:data unsigned char a;)
bdata 可位寻址片内RAM,16字节,从0x20到0x2F(例:bdata unsigned char a;)
idata 所有片内RAM,256字节,从0x00到0xFF(例:idata unsigned char a;)
pdata 片外RAM,256字节,从0x00到0xFF(例:pdata unsigned char a;)
xdata 片外RAM,64K字节,从0x00到0xFFFF(例:xdata unsigned char a;)
code ROM存储器,64K字节,从0x00到0xFFFF(例:code unsigned char a;)
[选择、循环语句
if(1){
//为真时语句
}else{
//否则时语句
}
--------------------------
while(1){
//为真时内容
}
--------------------------
do{
//先执行内容
}while(1);
--------------------------
switch (a){
case 0x01:
//为真时语句
break;
case 0x02:
//为真时语句
break;
default:
//冗余语句
break;
}
--------------------------
for(;;){
//循环语句
}
--------------------------
[主函数模板
/**************************************************************************
函数名:主函数
调用:无
参数:无
返回值:无
结果:程序开始处,无限循环
备注:
/*************************************************************************/
void main (void){
//初始程序
while(1){
//无限循环程序
}
}
/*************************************************************************/
[中断处理函数模板
/**************************************************************************
函数名:中断处理函数
调用:无
参数:无
返回值:无
结果:
备注:
/*************************************************************************/
void name (void) interrupt 1 using 1{
//处理内容
}
/*************************************************************************/
[中断入口说明
interrupt 0外部中断0(ROM入口地址:0x03)
interrupt 1定时/计数器中断0(ROM入口地址:0x0B)
interrupt 2外部中断1(ROM入口地址:0x13)
interrupt 3定时/计数器中断1(ROM入口地址:0x1B)
interrupt 4 UART串口中断(ROM入口地址:0x23)
(更多的中断依单片机型号而定,ROM中断入口均相差8个字节)
using 0使用寄存器组0
using 1使用寄存器组1
using 2使用寄存器组2
using 3使用寄存器组3
[普通函数框架
/**************************************************************************
函数名:
调用:
参数:无
返回值:无
结果:
备注:
/*************************************************************************/
void name (void){
//函数内容
}
/*************************************************************************/
/**************************************************************************
函数名:
调用:
参数:0~65535 / 0~255
返回值:0~65535 / 0~255
结果:
备注:
/*************************************************************************/
unsigned int name (unsigned char a,unsigned int b){
//函数内容
return a; //返回值
}
/*************************************************************************/
[延时函数
/**************************************************************************
函数名:毫秒级CPU延时函数
调用:DELAY_MS (?);
参数:1~65535(参数不可为0)
返回值:无
结果:占用CPU方式延时与参数数值相同的毫秒时间
备注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
/*************************************************************************/
[定时/计数器函数
-----------------------------------------------------------------------------
M1 M0 方式 说明
0 0 0 13位T/C,由TL低5位和TH的8位组成13位计数器
0 1 1 16位T/C,TL和TH共16位计数器
1 0 2 8位T/C,TL用于计数,当TL溢出时将TH中的值自动写入TL
1 1 3 两组8位T/C
-----------------------------------------------------------------------------
/**************************************************************************
函数名:定时/计数器初始化函数
调用:T_C_init();
参数:无
返回值:无
结果:设置SFR中T/C1和(或)T/C0相关参数
备注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/*************************************************************************/
void T_C_init (void){
TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,
EA = 1; //中断总开关
TH1 = 0xFF; //16位计数寄存器T1高8位(写入初值)
TL1 = 0xFF; //16位计数寄存器T1低8位
ET1 = 1; //T/C1中断开关
TR1 = 1; //T/C1启动开关
//TH0 = 0x3C; //16位计数寄存器T0高8位
//TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时)
//ET0 = 1; //T/C0中断开关
//TR0 = 1; //T/C0启动开关
}
/*************************************************************************/
/**************************************************************************
函数名:定时/计数器1中断处理函数
调用:[T/C1溢出后中断处理
参数:无
返回值:无
结果:重新写入16位计数寄存器初始值,处理用户程序
备注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致
/*************************************************************************/
void T_C1 (void) interrupt 3using 3{ //切换寄存器组到3
TH1 = 0x3C; //16位计数寄存器T1高8位(重新写入初值)
TL1 = 0xB0; //16位计数寄存器T1低8位(0x3CB0 = 50mS延时)
//函数内容
}
/*************************************************************************/
/**************************************************************************
函数名:定时/计数器0中断处理函数
调用:[T/C0溢出后中断处理
参数:无
返回值:无
结果:重新写入16位计数寄存器初始值,处理用户程序
备注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致
/*************************************************************************/
void T_C0 (void) interrupt 1using 1{ //切换寄存器组到1
TH0 = 0x3C; //16位计数寄存器T0高8位(重新写入初值)
TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时)
//函数内容
}
/*************************************************************************/
[外部中断INT函数
/**************************************************************************
函数名:外部中断INT初始化函数
调用:INT_init();
参数:无
返回值:无
结果:启动外部中断INT1、INT0中断,设置中断方式
备注:
/*************************************************************************/
void INT_init (void){
EA = 1; //中断总开关
EX1 = 1; //允许外部中断1中断
EX0 = 1; //允许外部中断0中断
IT1 = 1; //1:下沿触发0:低电平触发
IT0 = 1; //1:下沿触发0:低电平触发
}
/*************************************************************************/
/**************************************************************************
函数名:外部中断INT1中断处理程序
调用:[外部引脚INT1中断处理
参数:无
返回值:无
结果:用户处理外部中断信号
备注:
/**********************************************************************************************/
void INT_1 (void) interrupt 2using 2{ //切换寄存器组到2
//用户函数内容
}
/*************************************************************************/
/**************************************************************************
函数名:外部中断INT0中断处理程序
调用:[外部引脚INT0中断处理
参数:无
返回值:无
结果:用户处理外部中断信号
备注:
/*************************************************************************/
void INT_0 (void) interrupt 0using 2{ //切换寄存器组到2
//用户函数内容
}
/*************************************************************************/
[UART串口函数
/**************************************************************************
函数名:UART串口初始化函数
调用:UART_init();
参数:无
返回值:无
结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备注:振荡晶体为12MHz,PC串口端设置[ 4800,8,无,1,无
/*************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40时禁止串口接收)
TH1 = 0xF3; //定时器初值高8位设置
TL1 = 0xF3; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
TR1 = 1; //定时器启动
}
/*************************************************************************/
/**************************************************************************
函数名:UART串口初始化函数
调用:UART_init();
参数:无
返回值:无
结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备注:振荡晶体为11.0592MHz,PC串口端设置[ 19200,8,无,1,无
/*************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40时禁止串口接收)
TH1 = 0xFD; //定时器初值高8位设置
TL1 = 0xFD; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为9600)
TR1 = 1; //定时器启动
}
/*************************************************************************/
/**************************************************************************
函数名:UART串口接收中断处理函数
调用:[SBUF收到数据后中断处理
参数:无
返回值:无
结果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备注:过长的处理程序会影响后面数据的接收
/*************************************************************************/
void UART_R (void) interrupt 4using 1{ //切换寄存器组到1
unsigned char UART_data; //定义串口接收数据变量
RI = 0; //令接收中断标志位为0(软件清零)
UART_data = SBUF; //将接收到的数据送入变量UART_data
//用户函数内容(用户可使用UART_data做数据处理)
//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)
//while(TI == 0); //检查发送中断标志位
//TI = 0; //令发送中断标志位为0(软件清零)
}
/*************************************************************************/
/**************************************************************************
函数名:UART串口接收CPU查寻语句(非函数体)
调用:将下面内容放入主程序
参数:无
返回值:无
结果:循环查寻接收标志位RI,如有收到数据则进入if (RI == 1){}
备注:
/*************************************************************************/
unsigned char UART_data; //定义串口接收数据变量
if (RI == 1){ //接收中断标志位为1时
UART_data = SBUF; //接收数据SBUF为单片机的接收发送缓冲寄存器
RI = 0; //令接收中断标志位为0(软件清零)
//用户函数内容(用户可使用UART_data做数据处理)
//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)
//while(TI == 0); //检查发送中断标志位
//TI = 0; //令发送中断标志位为0(软件清零)
}
/*************************************************************************/
/**************************************************************************
函数名:UART串口发送函数
调用:UART_T (?);
参数:需要UART串口发送的数据(8位/1字节)
返回值:无
结果:将参数中的数据发送给UART串口,确认发送完成后退出
备注:
/*************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
/*************************************************************************/