搜索
bottom↓
回复: 18

发一个51单片机编程的基本模板

[复制链接]

出0入0汤圆

发表于 2012-8-17 18:05:44 | 显示全部楼层 |阅读模式

/*********************************************************************************************
程序名:   
编写人:     
编写时间:   年 月 日
硬件支持:  
接口说明:    
修改日志:  
  NO.1-                                                               
/*********************************************************************************************
说明:

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



[单片机SFR定义的头文件]

#include <REG51.h> //通用89C51头文件
#include <REG52.h> //通用89C52头文件
#include <STC11Fxx.H> //STC11Fxx或STC11Lxx系列单片机头文件
#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件
#include <STC12C5A60S2.H> //STC12C5A60S2系列单片机头文件

[更多库函数头定义]

#include <assert.h>    //设定插入点
#include <ctype.h>     //字符处理
#include <errno.h>     //定义错误码
#include <float.h>     //浮点数处理
#include <fstream.h>    //文件输入/输出
#include <iomanip.h>    //参数化输入/输出
#include <iostream.h>   //数据流输入/输出
#include <limits.h>    //定义各种数据类型最值常量
#include <locale.h>    //定义本地化函数
#include <math.h>     //定义数学函数
#include <stdio.h>     //定义输入/输出函数
#include <stdlib.h>    //定义杂项函数及内存分配函数
#include <string.h>    //字符串处理
#include <strstrea.h>   //基于数组的输入/输出
#include <time.h>     //定义关于时间的函数
#include <wchar.h>     //宽字符处理及输入/输出
#include <wctype.h>    //宽字符分类
#include <intrins.h>        //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,M0 ]
        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 3  using 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 1  using 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 2  using 2{ //切换寄存器组到2

        //用户函数内容

}       
/**********************************************************************************************/

/*********************************************************************************************
函数名:外部中断INT0中断处理程序
调  用:[外部引脚INT0中断处理]
参  数:无
返回值:无
结  果:用户处理外部中断信号
备  注:
/**********************************************************************************************/
void INT_0 (void) interrupt 0  using 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 4  using 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(软件清零)
}
/**********************************************************************************************/

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-17 18:39:27 | 显示全部楼层
非常好,收下了

出0入0汤圆

发表于 2012-8-17 18:46:55 | 显示全部楼层
楼主好东西,正发愁对程序的模块化!谢啦!

出0入0汤圆

发表于 2012-8-17 19:28:42 | 显示全部楼层
不错  

出10入10汤圆

发表于 2012-8-17 19:44:39 | 显示全部楼层
支持,挺好的

出0入0汤圆

发表于 2012-8-17 23:36:09 | 显示全部楼层
注释太多了,显得有点乱,还不如把他做注释和语句做成PDF用来写程序是做参考,程序注释留关键的就好了,没必要这样的,个人感觉,,,,,

出0入0汤圆

发表于 2012-8-17 23:53:06 | 显示全部楼层
好!顶学习

出0入0汤圆

发表于 2012-8-18 00:22:27 | 显示全部楼层
感谢分享,学习了

出0入0汤圆

发表于 2012-8-18 00:30:11 | 显示全部楼层
是不是可以整到Excel表格中~ 自动生成

出0入0汤圆

发表于 2012-8-18 06:55:58 | 显示全部楼层
祥子 发表于 2012-8-18 00:30
是不是可以整到Excel表格中~ 自动生成

出0入0汤圆

 楼主| 发表于 2012-8-18 08:44:06 | 显示全部楼层
tianheiGE 发表于 2012-8-17 23:36
注释太多了,显得有点乱,还不如把他做注释和语句做成PDF用来写程序是做参考,程序注释留关键的就好了,没 ...

呵呵~~给初学者看的就尽量注释详细一点

出0入0汤圆

发表于 2012-8-18 09:03:57 | 显示全部楼层
不错

出0入0汤圆

发表于 2012-8-20 13:44:48 | 显示全部楼层
嗯,为初学者考虑,辛苦了。

出0入0汤圆

发表于 2012-8-20 14:31:43 | 显示全部楼层
下来化解~谢谢楼主无私贡献!

出0入0汤圆

发表于 2012-8-20 14:33:30 | 显示全部楼层
还是不错的

出0入0汤圆

发表于 2012-8-20 20:58:48 | 显示全部楼层
mark,感谢分享

出0入0汤圆

发表于 2012-8-23 15:16:30 | 显示全部楼层
总结的非常的棒

出0入0汤圆

发表于 2012-8-30 11:46:15 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2012-8-30 15:02:23 | 显示全部楼层
mark!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表