


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8051 单片机 C 语言编程模板1. 函数头文件 错误! 未指定书签2. 毫秒级CPU延时函数 错误!未指定书签3. 定时/计数器初始化函数 错误! 未指定书签4. 定时/计数器 1中断处理函数 错误! 未指定书签5. 定时/计数器 0中断处理函数 错误! 未指定书签6. PWM初始化函数 错误!未指定书签7. PWM0占空比设置函数 错误!未指定书签8. UART串口初始化函数 错误!未指定书签9. UART串口接收中断处理函数 错误!未指定书签10. UART串口发送函数 错误!未指定书签11. UART串口发送字符串函数 错误!未指定书签12. 外部中断INT初始化函数 错误!未指定书
2、签13. 外部中断 INT1 中断处理程序 错误! 未指定书签14. 外部中断INTO中断处理程序 错误!未指定书签15. 普通I/O 口模拟PWMk成程序 错误!未指定书签16. LCD驱动 错误!未指定书签17. DS18B20温度传感器驱动 错误!未指定书签18. LCM2402( 1602也适用)驱动程序 错误!未指定书签19. 主函数 错误!未指定书签20.8 个独立式键盘驱动程序 错误!未指定书签21.16 个阵列式键盘驱动程序 错误!未指定书签1. 函数头文件/*程序名:编写人:编写时间:硬件支持:接口说明:修改日志:NO.1-20 年月日/*说明:/* #include<
3、REG51.hREG52.hSTC11Fxx.HSTC12C2052AD.HSTC12C5A60S2.H>/通用89C51头文件(只留下实际使用的单片机所对应的头文件)#include<assert.h>/ 设定插入点#include<ctype.h>/字符处理#include<errno.h>/定义错误码#include<float.h>/浮点数处理#include<iomanip.h> / 参数化输入输出#include<iostream.h> / 数据流输入输出#include<limits.h>
4、/ 定义各种数据类型最值常量#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&
5、lt;wctype.h> / 宽字符分类#includevintrins.h>51 基本运算(包括 _nop_空函数)sfrP1=0x90;sbitAdd_Key=P3A1;sfr自定义名=SFR地址;/按字节定义SFR中的存储器名。例: sbit自定义名=系统位名;/按位定义SFR中的存储器名。例: bit 自定义名 ; / 定义一个位(位的值只能是 0或 1)例: bitLED;#define 代替名 原名/ 用代替名代替原名。例: #defineLEDP1/#defineTA0x25 #defineKEYP1/ 键盘所连接的 I/O 接口组定义sbitSPEAKER二P3八7
6、/扬声器连接定义sbitDQ二P2八5; ds18B20sbitRS=P1A0; /模式位,为0输入指令,为1输入数据sbitRW=P1A1;/读写位,为0读,为1写sbitE=P1A2; / 使能位#defineLcd_BusP0/ 数据总线unsignedchar 自定义名 ; / 定义一个 0255的整数变量。unsignedint 自定义名 ; / 定义一个 065535的整数变量。data 字节寻址片内 RAM片内RAM勺128字节(例:dataunsignedchara;)bdata 可位寻址片内 RAM 16 字节,从 0x20 到 0x2F (例:bdataunsignedch
7、ara;) idata 所有片内 RAM 256 字节,从 0x00 到 0xFF (例:idataunsignedchara;) pdata 片外 RAM 256 字节,从 0x00 到 0xFF (例:pdataunsignedchara;)xdata 片外 RAM 64K字节,从 0x00 到 0xFFFF (例:xdataunsignedchara;) code ROM存储器,64K字节,从 0x00 到 0xFFFF (例:codeunsignedchara;)2. 毫秒级 CPU 延时函数/*函数名:毫秒级CPU延时函数调用: DELAY_MS();参数: 165535(参数不可为
8、 0)返回值:无结果:占用CPU方式延时与参数数值相同的毫秒时间备注:应用于1T单片机时i<600,应用于12T单片机时i<125 (在此预为 仃单片机数值)/*/ voidDELAY_MS(unsignedinta)unsignedinti;while(-a!=0)for(i=0;i<600;i+);*M1 M0 方式 说明0 0 013位T/C,由TL低5位和TH的8位组成13位计数器01116位T/C, TL和TH共16位计数器10 2 8位T/C, TL用于计数,当TL溢出时将TH中的值自动写入TL113 两组 8位 T/C3. 定时 /计数器初始化函数/*函数名:定
9、时 /计数器初始化函数调用: T_C_init();参数:无 返回值:无 结果:设置SFR中T/C1和(或)T/CO相关参数备注:本函数控制T/C1和T/C0,不需要使用的部分可用/屏蔽/*/ voidT_C_init(void)TMOD=0x11/; 高 4 位控制 T/C1GATE, C/T, M1, M0, GATE, C/T, M1, M0EA=1; / 中断总开关TH1=0xFF;/16 位计数寄存器 T1 高 8 位(写入初值)TL1=0xFF;/16 位计数寄存器 T1 低 8 位ET1=1;/T/C1 中断开关TR1=1;/T/C1 启动开关TH0=0x3C;16 位计数寄存器
10、 T0高8位TL0=0xB0;16 位计数寄存器 T0低8位(0x3CB0=50m延时)/ET0=1;/T/C0 中断开关/TR0=1;/T/C0 启动开关4. 定时/计数器 1 中断处理函数 /* 函数名:定时 /计数器 1 中断处理函数调用: T/C1 溢出后中断处理 参数:无返回值:无结果:重新写入 16 位计数寄存器初始值,处理用户程序 备注:必须允许中断并启动 T/C 本函数方可有效,重新写入初值需和 T_C_init 函数一致 /*/ voidT_C1(void)interrupt3using3 / 切换寄存器组到 3TH1=0x3C/16位计数寄存器T1高8位(重新写入初值)TL
11、1=0xB0;/16位计数寄存器T1低8位(0x3CB0=50m延时)/ 函数内容/*/5. 定时/计数器 0 中断处理函数 /* 函数名:定时 /计数器 0 中断处理函数调用: T/C0 溢出后中断处理 参数:无返回值:无结果:重新写入 16 位计数寄存器初始值,处理用户程序备注:必须允许中断并启动 T/C 本函数方可有效,重新写入初值需和 T_C_init 函数一致 /*/ voidT_C0(void)interrupt1using1/ 切换寄存器组到 1TH0=0x3C/16位计数寄存器TO高8位(重新写入初值)TL0=0xB0;/16 位计数寄存器 TO 低 8 位(0x3CB0=50
12、m延时)/*6. PWM初始化函数/* 函数名:PW砌始化函数调用:PWMnit();参数:无返回值:无结果:将PCAW始化为PW嗾式,初始占空比为0备注:需要更多路PW晞出直接插入CCAPnffi CCAPnlf卩可/*voidPW Mnit(void)CMOD=OxO0;设置PC雄时器*0 <BWf®IAIMd/OOXO=H£dV99/回毋lOdVOO W®WCBlAIMd 离强 /J00X0=-|£dV99/ 芒购Md ¥竿gAOd MI/IMd/t7X0=£|/|dV99/ 0 <WWlAIMd/00X0=HSdV
13、99/ 回毋lOdVOO W®WCBlAIMd 离强 /J00X0=-|SdV99/ 芒购Md ¥竿gAOd MI/IMd/t7X0=S|/|dV99/ 0 <BWBlAIMd/00X0=HI,dV99/回毋lOdVOO W®W®IAIMd 离强 /J00X0=H,dV99/ (/ 潮制闻宙剌)芒购Md 华芒R助口/Od MM IAIMd/l7X0= HAIdVOO/ 0 <BWM0l/IMdto0X0=H0dV99 回毋lOdVOO W®Wf®IAIMd 离强 /QOXO二lOdVOO (01,00001,0)芒购MdM
14、»l/IMd)Kt7X0=0l/ldV99S0X0 二 HO 5x0=107. PWM0 占空比设置函数/* 函数名:PWM占空比设置函数调用: PWM0_set();参数:OxOOOxFF(亦可用 0255)返回值:无结果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备注:如果需要PWM的设置函数,只要把 CCAP0和CCAP0中的0改为1即可 /*/ voidPWM0_set(unsignedchara)CCAP0L=a/;/ 设置值直接写入 CCAP0LCCAP0H=a/; 设置值直接写入 CCAP0H8. UART 串口初始化函数/*函数名:UART串 口初始化函
15、数调用: UART_init();参数:无返回值:无结果:启动UART串 口接收中断,允许串口接收,启动 T/C1产生波特率(占用)备注:振荡晶体为12MHz PC串口端设置4800, 8,无,1,无/*/ voidUART_init(void)EA=1;/ 允许总中断(如不使用中断,可用 / 屏蔽)ES=1;允许UART串口的中断/TMOD=0x20;/ 定时器 T/C1 工作方式 2SCON=0x50; /串口工作方式1,允许串口接收(SCON=Ox4时禁止串口接收)/TH1=0xF3; /定时器初值高 8 位设置/TL1=0xF3; / 定时器初值低 8 位设置PCON=0x80; /
16、波特率倍频(屏蔽本句波特率为 2400)/TR1=1; / 定时器启动/*/9. UART 串口接收中断处理函数/*函数名:UART串口接收中断处理函数调用:SBUF收到数据后中断处理参数:无返回值:无结果:UART串 口接收到数据时产生中断,用户对数据进行处理(并发送回去)备注:过长的处理程序会影响后面数据的接收voidUART_R(void)interrupt4using1 / 切换寄存器组到 1 unsignedcharUART_data; / 定义串口接收数据变量 (需要对接受到的数据进行处理时,可将其定义为全局变量 ) RI=0; / 令接收中断标志位为 0(软件清零)UART_da
17、ta=SBUF; / 将接收到的数据送入变量 UART_data/用户函数内容(用户可使用 UART_data做数据处理)/SBUF=UART_data; /将接收的数据发送回去(删除 /即生效)/while(TI=0);/ 检查发送中断标志位/TI=0;/ 令发送中断标志位为 0 (软件清零)/*/10. UART 串口发送函数/*函数名:UART串 口发送函数调用: UART_T();参数:需要UART串 口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给 UART串 口,确认发送完成后退出备注:/*voidUART_T(unsignedcharUART_data)/ 定义串
18、口发送数据变量SBUF=UART_data; / 将接收的数据发送回去while(TI=0); / 检查发送中断标志位TI=0;/ 令发送中断标志位为 0 (软件清零)/*11. UART 串口发送字符串函数 函数名:UART串 口发送字符串函数调用: UART_TC();参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:向串口发送一个字符串 ,长度不限。头文件支持备注:例:UART_TC("d9887321");此函数需要 #includevstring.h> /* voidUART_TC(unsignedchar*str)while(*str!=
19、39;0')UART_T(*str);*str+;*str=0;中断入口说明 中断入口说明 interruptO 外部中断 0 (ROMK口地址:0x03)interruptl定时/计数器中断0 (ROM入 口地址:OxOB)in terrupt2 外部中断 1 (ROMK 口地址:0x13)in terrupt3 定时/计数器中断1 (ROM入 口地址:0x1B)interrupt4UART 串口中断(ROM入 口地址:0x23)(更多的中断依单片机型号而定,ROM中断入口均相差8个字节)using0 使用寄存器组 0using1 使用寄存器组 1using2 使用寄存器组 2usi
20、ng3 使用寄存器组 312. 外部中断 INT 初始化函数函数名:外部中断INT初始化函数调用:INT_init();参数:无返回值:无结果:启动外部中断INT1、INT0中断,设置中断方式备注:/*voidlNTJnit(void)EA=1; /中断总开关EX1 = 1/允许外部中断1中断EX0=1/允许外部中断0中断IT仁餐/门:下沿触发0:低电平触发IT0=1; /1 :下沿触发0:低电平触发*13. 外部中断INT1中断处理程序/*函数名:外部中断INT1中断处理程序调用:外部引脚INT1中断处理参数:无返回值:无结果:用户处理外部中断信号备注:/*voidlNT_1 (void)i
21、nterrupt2using2 / 切换寄存器组到 2 /用户函数内容/*14. 外部中断INTO中断处理程序*函数名:外部中断 INT0 中断处理程序调用: 外部引脚 INT0 中断处理 参数:无 返回值:无 结果:用户处理外部中断信号 备注: /* voidINT_0(void)interrupt0using2 / 切换寄存器组到 2 / 用户函数内容/*15. 普通 I/O 口模拟 PWM 生成程序函数名:普通I/O 口模拟PW佐成程序 调用:display()备注:/*voiddisplay(unsignedinta) / 显示程序(50ms的 PW噬度) DY_PORT=OxOI?y
22、j_ED 小灯亮delay(a);/延时a的长度DY_PORT=Oxff/LED 小灯灭delay(DY_PWM-a);/ 延时总 PW脈度减 a/*16丄CD驱动/*/LCD驱动(DY12864CB®晶显示屏并口驱动程序)*voidchk_busy() / 检查忙位(底层)RS=0;RW=1;E=1;Lcd_Bus=0xff;while(Lcd_Bus&0x80)=0x80);E=0;/*voidwrite_com(unsignedcharcmdcode) / 写命令至U LCD (底层)chk_busy();RS=0;RW=0;E=1;Lcd_Bus=cmdcode;E=
23、0;/* voidwrite_data(unsignedcharDispdata)/ 写数据到 LCD(底层)chk_busy();RS=1;RW=0;E=1;Lcd_Bus=Dispdata;E=0;/* voidlcmnit()/初始化LCD屏 (被调用层)write_com(0x30); / 选择 8bit 数据流write_com(0x0c); / 开显示 ( 无游标、不反白 )write_com(0x01); / 清除显示,并且设定地址指针为 00H /*/voidlcm_w_word(unsignedchar*s) II向LCM发送一个字符串,长度64字符之内。(被调用层) whi
24、le(*s>0)II 应用: l c m_w_w o rd ("您好! ");write_data(*s);s+;/*/ voidlcm_w_test(biti,unsignedcharword) II 写指令或数据(被调用层)if(i=0)write_com(word); / 写指令或数据( 0,指令)elsewrite_data(word); / 写指令或数据( 1,数据)/*voidlcm_clr(void) / 清屏函数lcm_w_test(0,0x01);17.DS18B20温度传感器驱动 /*M/DS18B20温度传感器驱动(显示 0至60度)/*Mvoi
25、dDelay(intnum) / 延时函数while(num-);/*Mvoidlnit_DS18B20(void) / 初始化 ds1820unsign edcharx=0;DQ=1/DQ 复位Delay(8); /稍做延时DQ=0/单片机将DO低Delay(80); /精确延时大于480usf*f*f*DQ=1;/ 拉高总线Delay(14);x=DQ;/ 稍做延时后如果 x=0 则初始化成功 x=1 则初始化失败Delay(20);/*unsignedcharReadOneChar(void) / 读一个字节unsignedchari=0;unsignedchardat=0;for(i=
26、8;i>0;i-)DQ=0;/ 给脉冲信号dat>>=1;DQ=1;/ 给脉冲信号if(DQ)dat|=0x80;Delay(4);return(dat);/*,voidWriteOneChar(unsignedchardat) / 写一个字节unsign edchari=0;for(i=8;i>0;i-)DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat»=1;*/*unsignedintReadTemperature(void)/ 读取温度unsign edchara=0;unsign edcharb=0;unsignedin t
27、t=O;floattt=0;lnit_DS18B20();WriteOneChar(OxCC); /跳过读序号列号的操作WriteOneChar(Ox44); / 启动温度转换 lnit_DS18B20();WriteOneChar(OxCC); /跳过读序号列号的操作WriteOneChar(OxBE); /读取温度寄存器a=ReadOneChar();/ 读低 8 位*b=ReadOneChar();/ 读高 8 位t=b;t<<=8;t=t|a;tt=t*0.0625;t=tt*10+0.5; / 放大 10 倍输出并四舍五入return(t);/*/18.LCM2402 (
28、 1602 也适用)驱动程序/*/ / 以下是 LCM2402(1602 也适用)驱动程序/*/* / 引脚定义 / (使用者根据实际更改)#defineCMD_clear#defineCMD_back#defineCMD_dec1#defineCMD_add1#defineCMD_dis_gb1#defineCMD_dis_gb2#defineCMD_dis_gb3#defineLCM2402_DB0_DB7 P1/ 定义 LCM2402勺数据总线sbitLCM2402_RS二P3八2;/定义LCM2402勺RS控制线sbitLCM2402_RW二P3八3;/定义LCM2402勺RW空制线s
29、bitLCM2402_E=P3A4;/定义LCM2402勺E控制线sbitLCM2402_Busy=P1A7;/定义LCM2402的测忙线(与LCM2402_DB0_DB关联)/*/定义LCM2402指令集/ (详细请见技术手册)/*0x01/ 清除屏幕0X02/DDRAM 回零位0x04读入后AC (指针)减1,向左写0x06读入后AC(指针)力口 1,向右写0x0f/ 开显示_开光标 _开光标闪烁0x0e/ 开显示_开光标 _关光标闪烁0x0c/ 开显示_关光标 _关光标闪烁#defineCMD_OFF_dis 0x08/ 关显示_关光标_关光标闪烁#defineCMDset820x38/
30、8位总线_2 行显示#defineCMDset810x30/8位总线_1 行显示(上边行)#defineCMDset420x28/4位总线_2 行显示#defineCMDset410x20/4位总线_1 行显示(上边行)#definelin_10x80/4 位总线_1 行显示(上边行)#definelin_20xc0/4 位总线_1 行显示(上边行)/*/读LCM忙程序底层协议/ (所有底层协议都无需关注) /LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态/*/ voidLCM2402_TestBusy(void)LCM2402_DB0_DB7=0xff;/ 设备读状态
31、LCM2402_RS=0;LCM2402_RW=1;LCM2402_E=1;while(LCM2402_Busy); / 等待 LClW忙LCM2402_E=0;/*£/写指令程序/向LCM240官命令本函数需要1个指令集的入口参数/*£voidLCM2402_WriteCMD(uint8LCM2402_command)LCM2402_TestBusy();LCM2402_DB0_DB7=LCM2402_command;LCM2402_RS=0;LCM2402_RW=0;LCM2402_E=1;LCM2402_E=0;e*e*/*,/写数据程序/向LCM240官数据/*,v
32、oidLCM2402_WriteData(uint8LCM2402_data)LCM2402_TestBusy();LCM2402_DB0_DB7=LCM2402_data;LCM2402_RS=1;LCM2402_RW=0;LCM2402_E=1;LCM2402_E=0;/*,/打印字符串程序/ (本函数调用指针函数)*/向LCM发送一个字符串,长度48字符之内/ 第一行位置 0x000x17 第二行位置 0x400x57 / 应用举例: print(0x80,"");/ 在第一行第一位处从左向右打印 字符串 /*/voidprint(uint8a,uint8*str)L
33、CM2402_WriteCMD(a|0x80);while(*str!='0')LCM2402_WriteData(*str+);*str=0;/*/ 打印单字符程序 / 第一行位置 0x000x17 第二行位置 0x400x57/向LCM发送一个字符,以十六进制(0x00)表示/应用举例: print(0xc0,0x30);/ 在第二行第一位处打印字符“ 0”/*/voidprint2(uint8a,uint8t)LCM2402_WriteCMD(a|0x80);LCM2402_WriteData(t);/*/LC M 2402初始化/ (使用者可自定义,加 *号程序行必须保
34、留但可修改)/*/ voidLCM2402_Init(void)LCM2402_WriteCMD(CMD_set82); /* 显示模式设置:显示 2行,每个字符为 5*7 个像素LCM2402_WriteCMD(CMD_clear); / 显示清屏LCM2402_WriteCMD(CMD_back); /* 数据指针指向第 1行第 1个字符位置LCM2402_WriteCMD(CMD_add1); / 显示光标移动设置:文字不动,光标右移LCM2402_WriteCMD(CMD_dis_gb3); / 显示开及光标设置:显示开,光标开,闪烁开 /*/19.主函数/*函数名:主函数调用:无参数
35、:无返回值:无结果:程序开始处,无限循环备注:/*/voidmain(void)函数名:扬声器驱动备注:/*:unsignedcharMUSIC;unsign edcharSTHO;unsign edcharSTLO;unsignedin tcodetab=64021,64103,64260,64400, / 低音 3 开始64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178;voidmai n(v oid)TMOD=0x01;*ET0=1;EA=1;KEY 二 Oxff;while(1)STH0=tabMUSIC/256;STL0=tabMUSIC%256;TR0=1;elseSPEAKER*TR0=0;voidtO(void)i nteiruptl using。THO=STHO;TLO=STLO;SPEAKER=SPEAKER;/*20.8个独立式键盘驱动程序/*函数名:8个独立式键盘驱动程序调用:二Key();参数:无返回值:unsignedchar 键值 08结果:有键按下时返回值为键值 1-8,无键按下时返回值为备注:在主函数中不断调用匕*匕*unsignedcharKey() /8个独立键盘处理程序unsign edchara,b;KEY=Oxff; /设定键盘初始电平
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年软考设计师趋势与试题及答案预测
- 网络故障应急响应试题及答案
- 2025年技术驱动下的战略分析与风险对策试题及答案
- 2025年网络管理员考试趋势试题及答案
- 风险预判与决策支持试题及答案
- 法学概论综述与案例教学的结合试题及答案
- 云计算平台的优势与挑战试题及答案
- 2025年市场变化对战略的影响试题及答案
- 2025年软考软件设计师创新试题及答案
- VB编程技巧与试题及答案结合
- 试管婴儿合格协议书
- 事业单位公开招聘分类考试公共科目笔试考试大纲(2025版)
- 汽车路试协议书
- 2023年甘肃省榆中县事业单位公开招聘笔试题带答案
- 2025全员安全培训考试试题及完整答案(考点梳理)
- 高考考务人员培训系统试题答案
- 2023年江苏省沭阳县事业单位公开招聘辅警33名笔试题带答案
- 聘请名誉顾问合同协议
- 移动营业厅合作合同协议
- 淘宝和商家合同协议
- 2025年河南高一学业水平合格考模拟地理试卷试题(含答案详解)
评论
0/150
提交评论