51STC单片机C语言通用万能编程模板_第1页
51STC单片机C语言通用万能编程模板_第2页
51STC单片机C语言通用万能编程模板_第3页
51STC单片机C语言通用万能编程模板_第4页
51STC单片机C语言通用万能编程模板_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、8051单片机C语言编程模板 1.函数头文件22.毫秒级CPU延时函数43.定时/计数器初始化函数54.定时/计数器1中断处理函数65.定时/计数器0中断处理函数76.PWM初始化函数87.PWM0占空比设置函数98.UART串口初始化函数109.UART串口接收中断处理函数1110.UART串口发送函数1211.UART串口发送字符串函数1312.外部中断INT初始化函数1413.外部中断INT1中断处理程序1514.外部中断INT0中断处理程序1515.普通I/O口模拟PWM生成程序1616.LCD驱动1617.DS18B20温度传感器驱动1918.LCM2402(1602也适用)驱动程序

2、2119.主函数2520. 8个独立式键盘驱动程序2721. 16个阵列式键盘驱动程序281.函数头文件/*程序名: 编写人: 编写时间:20 年 月 日硬件支持:接口说明:修改日志:NO.1-/*说明:/*/#include <REG51.h REG52.h STC11Fxx.H STC12C2052AD.H STC12C5A60S2.H> /通用89C51头文件(只留下实际使用的单片机所对应的头文件)#include <assert.h> /设定插入点#include <ctype.h> /字符处理#include <errno.h> /定义

3、错误码#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&g

4、t; /定义杂项函数及内存分配函数#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 自定义名 = 系统

5、位名 ; /按位定义SFR中的存储器名。例:sbit Add_Key = P3 1;bit 自定义名 ; /定义一个位(位的值只能是0或1)例:bit LED;#define 代替名 原名 /用代替名代替原名。例:#define LED P1 / #define TA 0x25#define KEY P1 /键盘所连接的I/O接口组定义sbit SPEAKER = P37; /扬声器连接定义sbit DQ = P2 5; /ds18B20sbit RS = P10; /模式位,为0输入指令,为1输入数据sbit RW = P11; /读写位,为0读,为1写sbit E = P12; /使能位#

6、define Lcd_Bus P0 /数据总线unsigned char 自定义名 ; /定义一个0255的整数变量。unsigned int 自定义名 ; /定义一个065535的整数变量。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 u

7、nsigned char a;)xdata片外RAM,64K字节,从0x00到0xFFFF (例:xdata unsigned char a;)code ROM存储器,64K字节,从0x00到0xFFFF (例:code unsigned char a;)2.毫秒级CPU延时函数/*函数名:毫秒级CPU延时函数调 用:DELAY_MS (?);参 数:165535(参数不可为0)返回值:无结 果:占用CPU方式延时与参数数值相同的毫秒时间备 注:应用于1T单片机时i<600,应用于12T单片机时i<125(在此预为1T单片机数值)/*/void DELAY_MS ( unsigne

8、d int a )unsigned int i;while ( -a != 0)for(i = 0; i < 600; i+);/*/-M1M0方式说明00013位T/C,由TL低5位和TH的8位组成13位计数器01116位T/C,TL和TH共16位计数器1028位T/C,TL用于计数,当TL溢出时将TH中的值自动写入TL113两组8位T/C-3.定时/计数器初始化函数/*函数名:定时/计数器初始化函数调 用:T_C_init();参 数:无返回值:无结 果:设置SFR中T/C1和(或)T/C0相关参数备 注:本函数控制T/C1和T/C0,不需要使用的部分可用/屏蔽/*/void T_C

9、_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启动开关/*/4.定时/计数器1中断处理函

10、数/*函数名:定时/计数器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延时) /函数内容/*/5.定时/计数器0中断处理函数/*函数名:定时/计数器0中断处理函数调 用:T/C0溢出后中断处理

11、参 数:无返回值:无结 果:重新写入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延时) /函数内容/*/6.PWM初始化函数/*函数名:PWM初始化函数调 用:PWM_init();参 数:无返回值:无结 果:将PCA初始化为PWM模式,初始占空比为0备 注:需要更多路P

12、WM输出直接插入CCAPnH和CCAPnL即可/*/void PWM_init (void)CMOD=0x02; /设置PCA定时器 CL=0x00; CH=0x00;CCAPM0=0x42; /PWM0设置PCA工作方式为PWM方式(0100 0010) CCAP0L=0x00; /设置PWM0初始值与CCAP0H相同 CCAP0H=0x00; / PWM0初始时为0/CCAPM1=0x42; /PWM1设置PCA工作方式为PWM方式(使用时删除/)/CCAP1L=0x00; /设置PWM1初始值与CCAP0H相同 /CCAP1H=0x00; / PWM1初始时为0/CCAPM2=0x42;

13、 /PWM2设置PCA工作方式为PWM方式/CCAP2L=0x00; /设置PWM2初始值与CCAP0H相同 /CCAP2H=0x00; / PWM2初始时为0/CCAPM3=0x42; /PWM3设置PCA工作方式为PWM方式/CCAP3L=0x00; /设置PWM3初始值与CCAP0H相同 /CCAP3H=0x00; / PWM3初始时为0 CR=1; /启动PCA定时器/*/7.PWM0占空比设置函数/*函数名:PWM0占空比设置函数调 用:PWM0_set();参 数:0x000xFF(亦可用0255)返回值:无结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备 注:如

14、果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可/*/void PWM0_set (unsigned char a)CCAP0L= a; /设置值直接写入CCAP0L CCAP0H= a; /设置值直接写入CCAP0H/*/8.UART串口初始化函数/*函数名:UART串口初始化函数调 用:UART_init();参 数:无返回值:无结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备 注:振荡晶体为12MHz,PC串口端设置 4800,8,无,1,无 /*/void UART_init (void)EA = 1; /允许总中断(如不使用中

15、断,可用/屏蔽)ES = 1; /允许UART串口的中断/TMOD = 0x20; /定时器T/C1工作方式2SCON = 0x50; /串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)/TH1 = 0xF3; /定时器初值高8位设置/TL1 = 0xF3; /定时器初值低8位设置PCON = 0x80; /波特率倍频(屏蔽本句波特率为2400)/TR1 = 1; /定时器启动 /*/9.UART串口接收中断处理函数/*函数名:UART串口接收中断处理函数调 用:SBUF收到数据后中断处理参 数:无返回值:无结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并

16、发送回去)备 注:过长的处理程序会影响后面数据的接收/*/void UART_R (void) interrupt 4 using 1 /切换寄存器组到1unsigned char UART_data; /定义串口接收数据变量(需要对接受到的数据进行处理时,可将其定义为全局变量)RI = 0; /令接收中断标志位为0(软件清零)UART_data = SBUF; /将接收到的数据送入变量 UART_data /用户函数内容(用户可使用UART_data做数据处理)/SBUF = UART_data; /将接收的数据发送回去(删除/即生效)/while(TI = 0); /检查发送中断标志位/T

17、I = 0; /令发送中断标志位为0(软件清零)/*/10.UART串口发送函数/*函数名:UART串口发送函数调 用:UART_T (?);参 数:需要UART串口发送的数据(8位/1字节)返回值:无 结 果:将参数中的数据发送给UART串口,确认发送完成后退出备 注:/*/void UART_T (unsigned char UART_data) /定义串口发送数据变量 SBUF = UART_data; /将接收的数据发送回去while(TI = 0); /检查发送中断标志位TI = 0; /令发送中断标志位为0(软件清零)/*/11.UART串口发送字符串函数/*函数名:UART串口发

18、送字符串函数调 用:UART_TC (?);参 数:需要UART串口发送的数据(8位/1字节)返回值:无 结 果:向串口发送一个字符串,长度不限。备 注:例:UART_TC("d9887321"); 此函数需要#include <string.h>头文件支持。/*/void UART_TC (unsigned char *str)while(*str != '0')UART_T(*str);*str+;*str = 0;/*/中断入口说明中断入口说明interrupt 0 外部中断0(ROM入口地址:0x03)interrupt 1 定时/计数器

19、中断0(ROM入口地址:0x0B)interrupt 2 外部中断1(ROM入口地址:0x13)interrupt 3 定时/计数器中断1(ROM入口地址:0x1B)interrupt 4 UART串口中断(ROM入口地址:0x23)(更多的中断依单片机型号而定,ROM中断入口均相差8个字节)using 0 使用寄存器组0using 1 使用寄存器组1using 2 使用寄存器组2using 3 使用寄存器组312.外部中断INT初始化函数/*函数名:外部中断INT初始化函数调 用:INT_init();参 数:无返回值:无结 果:启动外部中断INT1、INT0中断,设置中断方式备 注:/*/

20、void INT_init (void)EA = 1; /中断总开关EX1 = 1; /允许外部中断1中断 EX0 = 1; /允许外部中断0中断IT1 = 1; /1:下沿触发 0:低电平触发IT0 = 1; /1:下沿触发 0:低电平触发/*/13.外部中断INT1中断处理程序/*函数名:外部中断INT1中断处理程序调 用:外部引脚INT1中断处理参 数:无返回值:无结 果:用户处理外部中断信号备 注:/*/void INT_1 (void) interrupt 2 using 2 /切换寄存器组到2 /用户函数内容/*/14.外部中断INT0中断处理程序/*函数名:外部中断INT0中断处

21、理程序调 用:外部引脚INT0中断处理参 数:无返回值:无结 果:用户处理外部中断信号备 注:/*/void INT_0 (void) interrupt 0 using 2 /切换寄存器组到2 /用户函数内容/*/15.普通I/O口模拟PWM生成程序/*函数名:普通I/O口模拟PWM生成程序调 用:display (?)备 注:/*/void display (unsigned int a) /显示程序(50ms的PWM宽度) DY_PORT = 0x00; /LED小灯亮delay (a); /延时a的长度DY_PORT = 0xff; /LED小灯灭delay (DY_PWM-a); /

22、延时总PWM长度减a/*/16.LCD驱动/*/LCD驱动(DY12864CBL液晶显示屏并口驱动程序)/*/void chk_busy() /检查忙位(底层) RS=0; RW=1; E=1; Lcd_Bus=0xff; while(Lcd_Bus&0x80)=0x80); E=0;/*/void write_com(unsigned char cmdcode) /写命令到LCD(底层)chk_busy();RS=0;RW=0;E=1;Lcd_Bus=cmdcode;E=0;/*/void write_data(unsigned char Dispdata) /写数据到LCD(底层)

23、 chk_busy();RS=1;RW=0;E=1;Lcd_Bus=Dispdata;E=0;/*/void lcm_init() /初始化LCD屏(被调用层) write_com(0x30); /选择8bit数据流 write_com(0x0c); /开显示(无游标、不反白) write_com(0x01); /清除显示,并且设定地址指针为00H/*/void lcm_w_word(unsigned char *s) /向LCM发送一个字符串,长度64字符之内。(被调用层)while(*s>0) /应用:lcm_w_word("您好!");write_data(*s); s+; /*/void lcm_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论