




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 .外部中断INTO中断处理程序 1515 .普通I/O 口模拟PWM 生成程序 1616 .LCD 驱动1617 .DS18B20温度传
2、感器驱动 1918 .LCM2402 (1602也适用)驱动程序 2119 .主函数2520 . 8个独立式键盘驱动程序 2721 . 16个阵列式键盘驱动程序 281.函数头文件/*程序名:20年 月 日编写人: 编写时间: 硬件支持: 接口说明: 修改日志:NO.1- /*说明:/*/#include <REG51.h REG52.h STCIIFxx.H STC12C2052AD.H#include <assert.h>#include <ctype.h>#include <errno.h>#include <float.h>#inc
3、lude <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>STC1
4、2C5A60S2.H>/通用89C51头文件(只留下实际使用的单片机所对应的头文件)/设定插入点字符处理/定义错误码/浮点数处理文件输入/输出/参数化输入/输出/数据流输入/输出/定义各种数据类型最值常量定义本地化函数/定义数学函数/定义输入/输出函数/定义杂项函数及内存分配函数/字符串处理基于数组的输入/输出/定义关于时间的函数宽字符处理及输入/输出#include <wctype.h>#include <intrins.h>sfr 自定义名=SFR地址;sbit 自定义名=系统位名;bit 自定义名;#define 代替名原名#define KEY P1sbi
5、t SPEAKER= P3”sbit DQ = P2 A 5;sbit RS = P1A0;sbit RW = P1A1;sbit E = P1A2;#define Lcd_Bus P0unsigned char 自定义名;unsigned int 自定义名;data字节寻址片内 RAM ,片内RAM 的128字节(例:bdata可位寻址片内 RAM , 16字节,从0x20到0x2F(例:idata所有片内RAM , 256字节,从0x00到0xFF(例:pdata片夕卜RAM , 256字节,从 0x00到0xFF(例:xdata片外 RAM , 64K 字节,从 0x00 到 0xFFF
6、F(例:codeROM存储器,64K字节,从0x00到0xFFFF(例:宽字符分类/51基本运算(包括_nop_空函数)按字节定义 SFR中的存储器名。例:sfr P1 = 0x90;按位定义 SFR中的存储器名。例: sbit Add_Key = P3人1;定义一个位(位的值只能是0或1)例:bit LED;用代替名代替原名。例:#define LED P1 / #define TA 0x25键盘所连接的I/O接口组定义扬声器连接定义/ds18B20/模式位,为0输入指令,为1输入数据读写位,为0读,为1写使能位数据总线定义一个0255的整数变量。定义一个065535的整数变量。data u
7、nsigned char a;)bdata unsigned char a;)idata unsigned char a;)pdata unsigned char a;)xdata unsigned char a;)code unsigned char a;)2.毫秒级CPU延时函数/*函数名:毫秒级CPU延时函数调用:DELAY_MS ;参 数:165535 (参数不可为 0)返回值:无结 果:占用CPU方式延时与参数数值相同的毫秒时间备 注:应用于 仃单片机时i<600,应用于12T单片机时i<125 (在此预为/*/1T单片机数值)void DELAY_MS ( unsign
8、ed int a )unsigned int i;while ( -a != 0)for(i = 0; i < 600; i+);/*/M1 M0方式 说明00013位T/C ,由TL低5位和TH的8位组成13位计数器01116位T/C, TL和TH共16位计数器1028位T/C, TL用于计数,当TL溢出时将TH中的值自动写入113两组8位T/CTL3.定时/计数器初始化函数/*函数名:定时/计数器初始化函数调用:T_C_init();参 数:无返回值:无结 果:设置SFR中T/C1和(或)T/C0相关参数备 注:本函数控制 T/C1和T/C0,不需要使用的部分可用屏蔽/*/void
9、T_C_init (void) TMOD = 0x11;EA = 1;TH1 = 0xFF;TL1 = 0xFF;ET1 = 1;TR1 = 1;/TH0 = 0x3C;/TL0 = 0xB0;/ET0 = 1;TR0 = 1;高 4 位控制 T/C1 GATE, C/T, M1 , M0 , GATE, C/T, M1 , M0 中断总开关/16位计数寄存器 T1高8位(写入初值)/16位计数寄存器T1低8位/T/C1中断开关/T/C1启动开关/16位计数寄存器 T0高8位/16位计数寄存器 T0低8位(0x3CB0 = 50mS延时)/T/C0中断开关/T/C0启动开关I*5.定时/计数器
10、0中断处理函数/*函数名:定时/计数器1中断处理函数调用:T/C1溢出后中断处理参 数:无返回值:无结 果:重新写入16位计数寄存器初始值,处理用户程序T C init函数一致备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和/*/void T_C1 (void) interrupt 3 using 3切换寄存器组到TH1 = 0x3C;TL1 = 0xB0;/16位计数寄存器/16位计数寄存器T1高8位(重新写入初值)T1 彳氐 8 位(0x3CB0 = 50mS 延时)函数内容/*/*函数名:定时/计数器0中断处理函数调用:T/C0溢出后中断处理参 数:无返回值:无结 果:重
11、新写入16位计数寄存器初始值,处理用户程序备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T C init函数一致/*/ void T_C0 (void) interrupt 1 using 1 切换寄存器组至U 1 TH0 = 0x3C;/16位计数寄存器T0高8位(重新写入初值)/16位计数寄存器 T0低8位(0x3CB0 = 50mS延时)函数内容TL0 = 0xB0;I*6.PWM初始化函数/*函数名:PWM初始化函数调用:PWM_init();参 数:无返回值:无结 果:将PCA初始化为PWM模式,初始占空比为0备 注:需要更多路 PWM输出直接插入 CCAPnH和C
12、CAPnL即可 /*/ void PWM_init (void) /设置PCA定时器CMOD=0x02;CL=0x00;CH=0x00;/PWM0设置PCA工作方式为 PWM方式(0100 0010)设置PWM0初始值与CCAP0H相同/ PWM0初始时为0CCAPM0=0x42;CCAP0L=0x00;CCAP0H=0x00;CCAPM1=0x42;/CCAP1L=0x00;/CCAP1H=0x00;/PWM1设置PCA工作方式为 PWM方式(使用时删除/)/设置PWM1初始值与 CCAP0H相同/ PWM1初始时为0/CCAPM2=0x42;/CCAP2L=0x00;CCAP2H=0x00
13、;/PWM2设置PCA工作方式为 PWM方式/设置PWM2初始值与CCAP0H相同/ PWM2初始时为0/CCAPM3=0x42;/CCAP3L=0x00;CCAP3H=0x00;/PWM3设置PCA工作方式为 PWM方式/设置PWM3初始值与CCAP0H相同/ PWM3初始时为0CR=1;启动PCA定时器/*/7.PWM0占空比设置函数/*函数名:PWM0占空比设置函数调用:PWM0_set();参 数:0x000xFF (亦可用 0255)返回值:无结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备 注:如果需要 PWM1的设置函数,只要把 CCAP0L和CCAP0H中的0
14、改为1即可/*/void PWM0_set (unsigned char a)CCAP0L= a;CCAP0H= a;设置值直接写入设置值直接写入CCAP0LCCAP0H/*/EA = 1;ES = 1;/TMOD = 0x20;SCON = 0x50;/TH1 = 0xF3;/TL1 = 0xF3;PCON = 0x80;TR1 = 1;8.UART串口初始化函数/*函数名:UART串口初始化函数调用:UART_init();参 数:无返回值:无结 果:启动UART串口接收中断,允许串口接收,启动 T/C1产生波特率(占用)备 注:振荡晶体为12MHz, PC串口端设置4800, 8,无,1
15、,无 /*/ void UART_init (void) 允许总中断(如不使用中断,可用屏蔽)允许UART串口的中断 定时器T/C1工作方式2串口工作方式 1,允许串口接收(SCON = 0x40时禁止串口接收)定时器初值高8位设置定时器初值低8位设置波特率倍频(屏蔽本句波特率为2400)定时器启动I*10.UART串口接收中断处理函数/*函数名:UART串口接收中断处理函数调用:SBUF收到数据后中断处理参 数:无返回值:无结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去) 备注:过长的处理程序会影响后面数据的接收/*/void UART_R (void) inter
16、rupt 4 using 1 unsigned char UART_data;RI = 0;UART_data = SBUF;切换寄存器组到1/定义串口接收数据变量(需要对接受到的数据进行处理时,可将其定义为全局变量令接收中断标志位为 0 (软件清零)将接收到的数据送入变量UART_data/用户函数内容(用户可使用UART_data做数据处理)/SBUF = UART_data;/while(TI = 0);/TI = 0;将接收的数据发送回去(删除 即生效)检查发送中断标志位令发送中断标志位为 0 (软件清零)/*/12.UART串口发送字符串函数/*函数名:UART串口发送函数调用:UA
17、RT_T (?);参 数:需要UART串口发送的数据(8位/1字节)返回值:无结 果:将参数中的数据发送给UART串口,确认发送完成后退出备注:/*/void UART_T (unsigned char UART_data) SBUF = UART_data;while(TI = 0);TI = 0;定义串口发送数据变量将接收的数据发送回去/检查发送中断标志位/令发送中断标志位为 0 (软件清零)/*/*函数名:UART串口发送字符串函数调用:UART_TC;参 数:需要UART串口发送的数据(8位/1字节)返回值:无结 果:向串口发送一个字符串,长度不限。备 注:例:UART_TC(&quo
18、t;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入
19、口地址:0x1B)interrupt 4 UART 串口中断(ROM 入口地址:0x23)(更多的中断依单片机型号而定,ROM中断入口均相差 8个字节) using 0使用寄存器组0using 1使用寄存器组1using 2使用寄存器组2using 3使用寄存器组312 .外部中断INT初始化函数/*函数名:外部中断INT初始化函数调用:INT_init();参 数:无返回值:无结 果:启动外部中断INT1、INT0中断,设置中断方式备注:/*/ void INT_init (void) EA = 1;EX1 = 1;EX0 = 1;IT1 = 1;IT0 = 1;中断总开关/允许外部中断 /
20、允许外部中断 /1:下沿触发 /1:下沿触发1中断0中断0:低电平触发0:低电平触发/*/13 .外部中断INT1中断处理程序/*函数名:外部中断INT1中断处理程序调 用:外部引脚INT1中断处理参 数:无返回值:无结 果:用户处理外部中断信号备注:/*/切换寄存器组到2用户函数内容void INT_1 (void) interrupt 2 using 2 /*/14 .外部中断INT0中断处理程序/*函数名:外部中断INT0中断处理程序调 用:外部引脚INT0中断处理参 数:无返回值:无结 果:用户处理外部中断信号备注:/*/切换寄存器组到2用户函数内容void INT_0 (void)
21、interrupt 0 using 2 /*/15 .普通I/O 口模拟PWM生成程序/*函数名:普通I/O 口模拟PWM生成程序调用:display (?)备注:/*/显示程序(50ms的PWM宽度)/LED小灯亮延时a的长度/LED小灯灭延时总PWM长度减avoid display (unsigned int a) DY_PORT = 0x00; delay (a);DY_PORT = 0xff; delay (DY_PWM-a);/*/16 .LCD驱动/*/LCD驱动(DY12864CBL液晶显示屏并口驱动程序)/*/检查忙位(底层)void chk_busy()RS=0;RW=1;E
22、=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 (底层)chk_busy();RS=1;RW=0;E=1;Lcd_Bus=Dispdata;E=0;/*/void lcm_init()write_com(0x30);write_com(0x0c);w
23、rite_com(0x01);/*/初始化LCD屏(被调用层)/选才i 8bit数据流/开显示(无游标、不反白)清除显示,并且设定地址指针为00Hvoid lcm_w_word(unsigned char *s)向LCM发送一个字符串,长度64字符之内。(被调用层)while(*s>0)应用:lcm_w_word("您好!");write_data(*s);s+;/*/void lcm_w_test(bit i,unsigned char word) 写指令或数据(被调用层)if(i = 0)write_com(word);elsewrite_data(word);写
24、指令或数据(0,指令)写指令或数据(1,数据)/*/void lcm_clr(void)lcm_w_test(0,0x01);/*/清屏函数17.DS18B20温度传感器驱动/*/DS18B20温度传感器驱动(显示 0至60度)/*/void Delay(int num)while(num-);/*/延时函数void Init_DS18B20(void) 初始化ds1820unsigned char x=0;DQ = 1;Delay(8);DQ = 0;Delay(80);DQ = 1;Delay(14);x=DQ;Delay(20);/DQ复位稍做延时单片机将DQ拉低/精确延时大于480us
25、拉高总线稍做延时后 如果x=0则初始化成功 x=1则初始化失败/*/ unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-)DQ = 0;dat>>=1;DQ = 1;读一个字节/给脉冲信号/给脉冲信号if(DQ) dat|=0x80; Delay(4);return(dat);/*/void WriteOneChar(unsigned char dat) 写一个字节unsigned char i=0; for (i=8; i>0; i-) DQ =
26、0;DQ = dat&0x01;Delay(5);DQ = 1;dat>>=1;/*/unsigned int ReadTemperature(void) unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0x44);Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0xBE);读取温度/跳过读序号列号的操作/启动温度转换跳过读序号列号的操作读取温度寄存器/读低
27、8位/读高8位a=ReadOneChar(); b=ReadOneChar(); t=b;t<<=8;t二t|a; tt=t*0.0625;/放大10倍输出并四舍五入t= tt*10+0.5;return(t);/*/18.LCM2402 (1602也适用)驱动程序/*/*/以下是LCM2402 (1602也适用)驱动程序/*/引脚定义(使用者根据实际更改) /*/#define LCM2402_DB0_DB7P1sbit LCM2402_RS = P3 A 2;sbit LCM2402_RW = P3 a 3;sbit LCM2402_E= P3 a 4;sbit LCM2402
28、_Busy = P1 a 7;/定义LCM2402的数据总线/定义LCM2402的RS控制线/定义LCM2402的RW控制线定义LCM2402的E控制线/定义LCM2402的测忙线(与 LCM2402_DB0_DB7 关联)/*/定义LCM2402指令集/ (详细请见技术手册)I*#defineCMD_clear0x01/清除屏幕#defineCMD_back0x02/ DDRAM回零位#defineCMD_dec10x04/读入后AC (指针)减1,向左与#defineCMD_add10x06/读入后AC (指针)力U 1,向右与#defineCMD_dis_gb10x0f/开显示开光标开光
29、标闪烁#defineCMD_dis_gb20x0e/开显示开光标关光标闪烁#defineCMD_dis_gb30x0c/开显示关光标关光标闪烁#defineCMD_OFF_dis0x08/关显示关光标关光标闪烁#defineCMD_set820x38/ 8位总线_2行显示#defineCMD_set810x30/ 8位总线_1行显示(上边行)#defineCMD_set420x28/ 4位总线_2行显示#defineCMD_set410x20/ 4位总线_1行显示(上边行)#definelin_10x80/ 4位总线_1行显示(上边行)#definelin_20xc0/ 4位总线_1行显示(上
30、边行)/*/设备读状态等待LCM不忙/读LCM忙程序底层协议(所有底层协议都无需关注)/ LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态/*/void LCM2402_TestBusy(void)LCM2402_DB0_DB7 = 0xff;LCM2402_RS = 0;LCM2402_RW = 1;LCM2402_E = 1;while(LCM2402_Busy);LCM2402_E = 0;/*/写指令程序/向LCM2402写命令 本函数需要1个指令集的入口参数/*/void LCM2402_WriteCMD(uint8 LCM2402_command) LCM24
31、02_TestBusy();LCM2402_DB0_DB7 = LCM2402_command;LCM2402_RS = 0;LCM2402_RW = 0;LCM2402_E = 1;LCM2402_E = 0;/*/写数据程序/向LCM2402写数据 /*/ void LCM2402_WriteData(uint8 LCM2402_data)LCM2402_TestBusy();LCM2402_DB0_DB7 = LCM2402_data;LCM2402_RS = 1;LCM2402_RW = 0;LCM2402_E = 1;LCM2402_E = 0;/*/打印字符串程序(本函数调用指针函
32、数)向LCM发送一个字符串,长度48字符之内第一行位置 0x000x17 第二行位置 0x400x57应用举例:print(0x80,"");/在第一行第一位处从左向右打印 字符串/*/ void print(uint8 a,uint8 *str)LCM2402_WriteCMD(a | 0x80);while(*str != '0')LCM2402_WriteData(*str+); *str = 0;/*/打印单字符程序/第一行位置 0x000x17第二行位置 0x400x57/向LCM发送一个字符,以十六进制(0x00)表示/应用举例:print(0xc0,0x30);在第二行第一位处打印字符“0” /*/ void print2(uint8 a,uint8 t)LCM2402_WriteCMD(a | 0x80);LCM2402_WriteData(t);/*/ LCM2402初始化(使用者可自定义,加 *号程序行必须保留但可修改)/*/*显示模式设置:显示 2行,每个字符为5*7个像素/显示清屏/*数据指针指向第1行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国智能化电机软起动器市场调查研究报告
- 2025年中国无衬铝箔胶粘带市场调查研究报告
- 2025年山东省潍坊市中考二模地理试题及答案
- 2025年中国数显恒温水浴锅市场调查研究报告
- 肇庆市实验中学高中生物一:降低化学反应活化能的酶(三)
- 肇庆市实验中学高中历史一:第七单元测试
- 2025-2030年中国CAD软件行业投资风险分析及前景预测研究报告
- 新疆铁道职业技术学院《电商创业》2023-2024学年第二学期期末试卷
- 2025至2031年中国硒酸酯多糖行业投资前景及策略咨询研究报告
- 新疆应用职业技术学院《商业数据分析技术基础》2023-2024学年第二学期期末试卷
- 钢结构高处作业安全管理
- JJF 2221-2025导热系数瞬态测定仪校准规范
- 华为手机协议合同
- 甘肃省陇南市礼县第六中学2024-2025学年八年级下学期第一次月考数学试卷(无答案)
- 公司两班倒管理制度
- 2025年武汉数学四调试题及答案
- 人教版小学四年级语文下册2024-2025学年度第二学期期中质量检测试卷
- 2025年黑龙江牡丹江市“雪城优才”招聘事业单位480人历年高频重点模拟试卷提升(共500题附带答案详解)
- 七年级下册道德与法治(2025年春)教材变化详细解读
- 鸡头黄精栽培技术规程
- 2025年上半年福建省泉州市事业单位招聘编制内信息(1023人)易考易错模拟试题(共500题)试卷后附参考答案
评论
0/150
提交评论