收藏 分销(赏)

5STC单片机C语言通用万能编程模板.doc

上传人:二*** 文档编号:4576867 上传时间:2024-09-30 格式:DOC 页数:32 大小:112KB 下载积分:5 金币
下载 相关 举报
5STC单片机C语言通用万能编程模板.doc_第1页
第1页 / 共32页
本文档共32页,全文阅读请下载到手机保存,查看更方便
资源描述
. . ?8051单片机C语言编程模板? 1.函数头文件2 2.毫秒级CPU延时函数4 3.定时/计数器初始化函数5 4.定时/计数器1中断处理函数6 5.定时/计数器0中断处理函数7 6.PWM初始化函数8 7.PWM0占空比设置函数9 8.UART串口初始化函数10 9.UART串口接收中断处理函数11 10.UART串口发送函数12 11.UART串口发送字符串函数13 12.外部中断INT初始化函数14 13.外部中断INT1中断处理程序15 14.外部中断INT0中断处理程序15 15.普通I/O口模拟PWM生成程序16 16.LCD驱动16 17.DS18B20温度传感器驱动19 18.LCM2402〔1602也适用〕驱动程序21 19.主函数25 20. 8个独立式键盘驱动程序27 21. 16个阵列式键盘驱动程序28 1.函数头文件 /****************************************************************************** 程序名:    编写人:    编写时间:  20 年 月 日 硬件支持:   接口说明:   修改日志:     NO.1- /****************************************************************************** 说明: /*****************************************************************************/ #include <REG51.h REG52.h STC11Fxx.H STC12C2052AD.H STC12C5A60S2.H> //通用89C51头文件〔只留下实际使用的单片机所对应的头文件〕 #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 #define KEY P1 //键盘所连接的I/O接口组定义 sbit SPEAKER = P3^7; //扬声器连接定义 sbit DQ = P2 ^ 5; //ds18B20 sbit RS = P1^0; //模式位,为0输入指令,为1输入数据 sbit RW = P1^1; //读写位,为0读,为1写 sbit E = P1^2; //使能位 #define Lcd_Bus P0 //数据总线 unsigned char [自定义名] ; //定义一个0~255的整数变量。 unsigned int [自定义名] ; //定义一个0~65535的整数变量。 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;〕 2.毫秒级CPU延时函数 /****************************************************************************** 函数名:毫秒级CPU延时函数 调 用:DELAY_MS (?); 参 数:1~65535〔参数不可为0〕 返回值:无 结 果:占用CPU方式延时与参数数值一样的毫秒时间 备 注:应用于1T单片机时i<600,应用于12T单片机时i<125〔在此预为1T单片机数值〕 /*****************************************************************************/ 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 ----------------------------------------------------------------------------- 3.定时/计数器初始化函数 /****************************************************************************** 函数名:定时/计数器初始化函数 调 用: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启动开关 } /*****************************************************************************/ 4.定时/计数器1中断处理函数 /****************************************************************************** 函数名:定时/计数器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溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入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 备 注:需要更多路PWM输出直接插入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; //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(); 参 数:0x00~0xFF〔亦可用0~255〕 返回值:无 结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平 备 注:如果需要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; //允许总中断〔如不使用中断,可用//屏蔽〕 ES = 1; //允许UART串口的中断 //TMOD = 0x20; //定时器T/C1工作方式2 SCON = 0x50; //串口工作方式1,允许串口接收〔SCON = 0x40 时制止串口接收〕 //TH1 = 0xF3; //定时器初值高8位设置 //TL1 = 0xF3; //定时器初值低8位设置 PCON = 0x80; //波特率倍频〔屏蔽本句波特率为2400〕 //TR1 = 1; //定时器启动 } /*****************************************************************************/ 9.UART串口接收中断处理函数 /****************************************************************************** 函数名: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〔软件清零〕 } /*****************************************************************************/ 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串口发送字符串函数 调 用: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 定时/计数器中断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 12.外部中断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:低电平触发 } /*****************************************************************************/ 13.外部中断INT1中断处理程序 /****************************************************************************** 函数名:外部中断INT1中断处理程序 调 用:[外部引脚INT1中断处理] 参 数:无 返回值:无 结 果:用户处理外部中断信号 备 注: /*****************************************************************************/ void INT_1 (void) interrupt 2 using 2 //切换存放器组到2 { //用户函数容 } /*****************************************************************************/ 14.外部中断INT0中断处理程序 /****************************************************************************** 函数名:外部中断INT0中断处理程序 调 用:[外部引脚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 =
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服