完美的8051单片机C语言编程模板

来源:本站
导读:目前正在解读《完美的8051单片机C语言编程模板》的相关信息,《完美的8051单片机C语言编程模板》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《完美的8051单片机C语言编程模板》的详细说明。
简介:单片机SFR定义的头文件定义,UART串口发送函数,UART串口接收CPU查寻语句(非函数体),UART串口接收中断处理函数,UART串口初始化函数,UART串口初始化函数,外部中断中断处理程序等。

[单片机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(软件清零)

}

/*************************************************************************/

提醒:《完美的8051单片机C语言编程模板》最后刷新时间 2024-03-14 01:08:31,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《完美的8051单片机C语言编程模板》该内容的真实性请自行鉴别。