为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

51单片机C语言编程模板

2017-10-23 22页 doc 49KB 28阅读

用户头像

is_597436

暂无简介

举报
51单片机C语言编程模板51单片机C语言编程模板 [程序开始处的程序说明] /****************************************************************************** *************** 程序名: xxxx 编写人: XXX 编写时间: xx年xx月xx日 硬件支持: 接口说明: 修改日志: NO.1- /**************************************************************************...
51单片机C语言编程模板
51单片机C语言编程 [程序开始处的程序说明] /****************************************************************************** *************** 程序名: xxxx 编写人: XXX 编写时间: xx年xx月xx日 硬件支持: 接口说明: 修改日志: NO.1- /****************************************************************************** *************** 说明: /****************************************************************************** ***************/ [单片机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,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(软件清零) } /****************************************************************************** ****************/ /****************************************************************************** *************** 函数名:用结构体数组实现菜单功能 调 用:GetKeyInput(); /*使用结构体变量(把多个不同类型的变量结合在一起形成的一个组合型变量)实现菜单功能*/ //此结构中共有6个元素,5个字符型和一个函数指针 /*构造一个结构数组:在结构数组中为每一个菜单项编制一个单独的函数 并根据菜单的潜逃顺序排好本菜单项的索引号,以及本级菜单的上下卷动 的索引号和前后级菜单的索引号*/ typedef struct{ uchar KeyStateIndex;//当前菜单索引号 uchar KeyDnState; //向下卷动索引号 uchar KeyUpState; //向上卷动索引号 uchar KeyCrState; //后级菜单索引号 回车键 uchar KeyBaState; //前级菜单索引号 void (*CurrentOperate)(); }KbdTabStruct; #define SIZE.OF.KEYBD.MENU 55 //菜单深度 共55层 KbdTabStruct code KeyTab[SIZE.OF.KEYBD.MENU]={ {0,0,0,1,0,(*Main)}, {1,7,2,8,0,(*DspPoint)}, //第一层 {2,1,3,8,0,(*DspCurre)}, //第二层 {3,2,4,36,0,(*DspKnct)}, // {4,3,5,50,0,(*DisCloseDown)},// {5,4,6,8,0,(*ModifyPoint)},// {6,5,7,52,0,(*SetCloseDown)},// {7,6,1,0,0,(*Cancel)},// ... ... {52,53,53,0,1,(*OkSetCloseDown1)},// {53,52,52,0,1,(*OkSetCloseDown2)},// {54,0,0,0,0,(*Disable)}, } void GetKeyInput(void){ switch(statu & 0xf0){ case 0xe0://回车键,找出新的菜单索引号 ... KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;// ... break; case 0xb0://向下键,找出新的菜单索引号 ... KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState; ... break; case 0xd0://向上键,找出新的菜单索引号 ... KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState; ... break; case 0x70://回退键,找出新的菜单索引号 ... KeyFuncIndex=KeyTab[KeyFuncIndex].KeyBacState; ... break; case 0://错误的处理 return; break; } KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;//函数指针 (*KeyFuncPtr)(); //执行当前按键的操作 } /************************************************************* * 杜洋工作室 DoYoung Studio * 与电子爱好者同行 www.DoYoung.net /*************************************************************/
/
本文档为【51单片机C语言编程模板】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索