版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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初始化函数 .1513.外部中断INT1中断处理程序 .1514.外部中断INT0中断处理程序 .1615.普通I/O口模拟PWM生成程序 .1616.LCD驱动 .1717. DS18B
2、20温度传感器驱动 .1918. LCM2402(1602也适用)驱动程序 .2219.主函数 .2620. 8个独立式键盘驱动程序 .2821. 1 6个阵列式键盘驱动程序 .291.函数头文件/* 程序名:编写人:编写时间: 20 年 月 日硬件支持:接口说明:修改日志:NO.1-/* 说明:/*/#include REG51.h REG52.h STC11Fxx.H STC12C2052AD.H#include #include #include #include #include #include #include #include #include #include #include
3、 #include #include #include #include STC12C5A60S2.H/通用 89C51 头文件(只留下实际使用的单片机所对应的头文件) /设定插入点/字符处理/定义错误码/浮点数处理/文件输入输出/参数化输入输出/数据流输入输出 /定义各种数据类型最值常量/定义本地化函数/定义数学函数 /定义输入输出函数 /定义杂项函数及内存分配函数 /字符串处理/基于数组的输入输出/定义关于时间的函数#inelude #inelude #inelude vintrins.hsfr 自定义名 = SFR 地址;sbit 自定义名=系统位名;bit 自定义名;#define 代
4、替名原名#define KEY P1sbit SPEAKER = P3A7;sbit DQ = P2A5;sbit RS = P1A0;sbit RW= P1A1;sbitE = P1A2;#define Lcd_Bus POunsigned char 自定义名;unsigned int 自定义名;data字节寻址片内 RAM ,片内 RAM 的 128 字节bdata可位寻址片内 RAM , 16 字节,从 0 x20 至 U 0 x2Fidata所有片内 RAM , 256 字节,从 0 x00 到 OxFFpdata片外 RAM , 256 字节,从 0 x00 到 OxFFxdata片
5、外 RAM , 64K 字节,从 0 x00 到 OxFFFFcode ROM 存储器,64K 字节,从 0 x00 至 U OxFFFF宽字符处理及输入/输出宽字符分类/51 基本运算(包括_nop_空函数)按字节定义 SFR 中的存储器名。例:sfr P1 = 0 x90;按位定义 SFR 中的存储器名。例: sbit Add_Key = P3A1; 定义一个位(位的值只能是 0 或 1)例:bit LED;用代替名代替原名。例:#define LED P1 / #define TA 0 x25/键盘所连接的 I/O 接口组定义扬声器连接定义/ds18B20模式位,为 0 输入指令,为 1
6、 输入数据读写位,为 0 读,为 1 写使能位数据总线定义一个 0255 的整数变量。定义一个 065535 的整数变量。(例:data unsigned 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
7、 方式延时与参数数值相同的毫秒时间备 注:应用于 1T 单片机时 i600 ,应用于 12T 单片机时 i125 (在此预为/*/ 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 中的值自动写入1 1 3 两组 8 位 T/
8、C1T 单片机数值)TL3.定时/计数器初始化函数*函数名:定时/计数器初始化函数调用:T_C_init();参 数:无返回值:无结 果:设置 SFR 中 T/C1 和(或)T/CO 相关参数备 注:本函数控制 T/C1 和 T/CO,不需要使用的部分可用屏蔽 */ voidT_C_init (void)TMOD = 0 x11;EA= 1;TH1 = OxFF;TL1 = OxFF;ET1 = 1;TR1 = 1;/THO = 0 x3C; /TLO = OxBO;/ETO = 1;/TRO = 1;*高 4 位控制 T/C1 GA TE, C/T, M1 , MO , GATE, C/T,
9、 M1 , MO中断总开关6 位计数寄存器 T1 咼 8 位(写入初值) /16 位计数寄存器 T1低 8 位/T/C1 中断开关/T/C1 启动开关 /16 位计数寄存器 TO 高 8 位/16 位计数寄存器 TO 低 8 位(0 x3CB0 = 50mS 延时) /T/CO 中断开关/T/C0 启动开关函数内容4.定时/计数器1中断处理函数/*函数名:定时/计数器 1 中断处理函数调用:T/C1 溢出后中断处理参 数:无返回值:无结 果:重新写入 16 位计数寄存器初始值,处理用户程序备 注:必须允许中断并启动T/C 本函数方可有效,重新写入初值需和*/void T_C1 (void) i
10、nterrupt 3 using 3TH1 = 0 x3C;TL1 = OxBO;*T_C_init 函数切换寄存器组到3/16 位计数寄存器/16 位计数寄存器T1 高 8 位(重新写入初值)T1 低 8 位(0 x3CB0 = 50mS 延时)函数内容5定时/计数器0中断处理函数/*函数名:定时/计数器 0 中断处理函数调用:T/CO 溢出后中断处理参 数:无返回值:无结 果:重新写入 16 位计数寄存器初始值,处理用户程序备 注:必须允许中断并启动 T/C 本函数方可有效,重新写入初值需和/*void T_C0 (void) interrupt 1 using 1 切换寄存器组到 1TH
11、O = 0 x3C;TLO = OxBO;*函数内容T_C_init 函数一致/16 位计数寄存器 TO 高 8 位(重新写入初值)/16 位计数寄存器 TO 低 8 位(0 x3CB0 = 50mS 延时)6.PWM初始化函数/*函数名:PWM 初始化函数调用:PWMnit();参 数:无返回值:无结 果:将 PCA 初始化为 PWM 模式,初始占空比为 0备 注:需要更多路 PWM 输出直接插入 CCAPnH 和 CCAPnL 即可*/void PWMJnit (void)CMOD=0 x02;CL=0 x00;CH=0 x00;CCAPM0=0 x42;CCAP0L=0 x00;CCAP
12、0H=0 x00;/CCAP M 仁 0 x42;设置 PCA 定时器/PWMO 设置 PCA 工作方式为 PWM 方式(O1OO 0010)设置 PWMO 初始值与 CCAPOH 相同/ PWMO 初始时为 0 /PWM1 设置 PCA 工作方式为 PWM 方式(使用时删除/)/CCAP1L=OxOO;/CCAP1H=OxOO;/CCAPM2=0 x42;/CCAP2L=0 x00;/CCAP2H=0 x00;/CCAPM3=0 x42;/CCAP3L=0 x00;/CCAP3H=0 x00;CR=1;*7.PWM0占空比设置函数*函数名:PWMO 占空比设置函数设置 PWM1 初始值与 C
13、CAPOH 相同/ PWM1 初始时为 0/PWM2 设置 PCA 工作方式为 PWM 方式设置 PWM2 初始值与 CCAPOH 相同/ PWM2 初始时为 0/PWM3 设置 PCA 工作方式为 PWM 方式设置 PWM3 初始值与 CCAPOH 相同/ PWM3 初始时为 0启动 PCA 定时器调 用: PWM0_set();参 数: 0 x000 xFF (亦可用 0255 ) 返回值:无结 果:设置 PWM 模式占空比,为 0 时全部高电平,为 1 时全部低电平备 注:如果需要 PWM1 的设置函数,只要把 CCAP0L 和 CCAP0H 中的 0 改为 1 即可/*/void PW
14、M0_set (unsigned char a)CCAP0L= a;/设置值直接写入 CCAP0LCCAP0H= 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 = 0 x20;
15、SCON = 0 x50;/定时器 T/C1 工作方式 2/串口工作方式 1,允许串口接收( SCON = 0 x40 时禁止串口接收)/TH1 = 0 xF3; /TL1 = 0 xF3;PCON = 0 x80; /TR1 = 1;*9.UART串口接收中断处理函数/*函数名: UART 串口接收中断处理函数调 用: SBUF 收到数据后中断处理 参 数:无返回值:无结 果: UART 串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备 注:过长的处理程序会影响后面数据的接收/*/void UART_R (void) interrupt 4using 1/切换寄存器组到 1uns
16、igned char UART_data;/定义串口接收数据变量 (需要对接受到的数据进行处理时,可将其定义为全局变量)RI = 0;/令接收中断标志位为 0(软件清零)UART_data = SBUF;/将接收到的数据送入变量UART_data/定时器初值高 8 位设置/定时器初值低 8 位设置 /波特率倍频(屏蔽本句波特率为2400)/定时器启动/SBUF = UART_data;/while(TI = 0);/Tl = 0;*10. UART串口发送函数*函数名:UART 串口发送函数调用:UART_T;参 数:需要 UART 串口发送的数据(8 位门字节)返回值:无结 果:将参数中的数
17、据发送给UART 串口,确认发送完成后退出备注:*/ voidUART_T (unsigned char UART_data)SBUF = UART_data;用户函数内容(用户可使用UART_data 做数据处理)将接收的数据发送回去(删除 即生效)检查发送中断标志位令发送中断标志位为 0 (软件清零)定义串口发送数据变量 将接收的数据发送回去/检查发送中断标志位/ 令发送中断标志位为 0(软件清零)11. UART串口发送字符串函数/* 函数名: UART 串口发送字符串函数调 用: UART_TC (?);参 数:需要 UART 串口发送的数据( 8 位/1 字节)返回值:无结 果:向串
18、口发送一个字符串 , 长度不限。备 注:例: UART_TC(d9887321); 此函数需要 #include 头文件支持。/*/ void UART_TC (unsigned char *str)*while(TI = 0);TI = 0;while(*str != 0)UART_T(*str);*str+;*str = 0;*/中断入口说明中断入口说明interrupt 0 外部中断 0 (ROM 入口地址:0 x03)interrupt 1 定时/计数器中断 0 ( ROM 入口地址:OxOB)interrupt 2 外部中断 1 (ROM 入口地址:0 x13)interrupt 3
19、 定时/计数器中断 1 ( ROM 入口地址:0 x1 B)interrupt 4 UART 串口中断(ROM 入口 地址:0 x23)(更多的中断依单片机型号而定,ROM 中断入口均相差 8 个字节)using 0 使用寄存器组 0using 1 使用寄存器组 1using 2 使用寄存器组 2using 3 使用寄存器组 312.外部中断INT初始化函数/*函数名:外部中断 INT 初始化函数调用:INT_init();参 数:无返回值:无结 果:启动外部中断 INT1、INTO 中断,设置中断方式备注:*/void INTJnit (void)EA= 1;EX1 = 1;EXO = 1;
20、IT1 = 1;ITO = 1;*/13.外部中断INT1中断处理程序*函数名:外部中断 INT1 中断处理程序调 用:外部引脚 INT1 中断处理参 数:无返回值:无结 果:用户处理外部中断信号中断总开关/允许外部中断/允许外部中断/1:下沿触发/1:下沿触发1 中断0 中断0:低电平触发0:低电平触发备注:void INT_1 (void) interrupt 2 using 214.外部中断INTO中断处理程序*函数名:外部中断 INTO 中断处理程序调 用:外部引脚 INTO 中断处理参 数:无返回值:无结 果:用户处理外部中断信号备注:*/void INT_0 (void) inte
21、rrupt 0 using 2*/15.普通I/O口模拟PWM生成程序*函数名:普通 I/O 口模拟 PWM 生成程序调用:display (?)备注:切换寄存器组到 2 用户函数内容切换寄存器组到 2 用户函数内容void display (unsigned int a)DY_PORT = 0 x00;delay (a);DY_PORT = Oxff;delay (DY_PWM-a);*16丄CD驱动/LCD 驱动(DY12864CBL 液晶显示屏并口驱动程序)void chk_busy()RS=0;RW=1;E=1;Lcd_Bus=Oxff;while(Lcd_Bus&0 x80)=0 x
22、80);E=0;*void write_com(unsigned char cmdcode)显示程序(50ms 的 PWM 宽度)/LED 小灯亮延时 a 的长度/LED 小灯灭延时总 PWM 长度减 a检查忙位(底层)写命令到 LCD (底层)chk_busy();RS=O;RW=O;E=1;Lcd_Bus=cmdcode;E=0;*void write_data(unsigned char Dispdata)chk_busy();RS=1;RW=0;E=1;Lcd_Bus=Dispdata;E=0;*void Icmnit()write_com(0 x30);write_com(0 x0c
23、);write_com(0 x01);*void lcm_w_word(unsigned char *s)while(*s0)write_data(*s);写数据到 LCD (底层)初始化 LCD 屏(被调用层)选择 8bit 数据流开显示(无游标、不反白)清除显示,并且设定地址指针为00H向 LCM 发送一个字符串,长度 64 字符之内。应用:lcm_w_word(您好! ”);(被调用层)S+;void lcm_w_test(bit i,unsigned char word)if(i = 0)write_com(word);elsewrite_data(word);*void lcm_cl
24、r(void)lcm_w_test(0,0 x01);*17. DS18B20温度传感器驱动*/DS18B20 温度传感器驱动(显示 0 至 60 度)*写指令或数据(被调用层)写指令或数据(0,指令)写指令或数据(1,数据)清屏函数void Delay(int num)while(num-);*void lnit_DS18B20(void)unsigned char x=0;DQ = 1;Delay(8);DQ = 0;Delay(80);DQ = 1;Delay(14);x=DQ;Delay(20);*unsigned char ReadOneChar(void) unsigned cha
25、r i=0; unsigned char dat = 0;for (i=8;i0;i-)DQ = 0; dat=1;DQ = 1; if(DQ) dat|=0 x80;Delay(4);*延时函数初始化 ds1820/DQ 复位稍做延时单片机将 DQ 拉低精确延时大于 480us拉高总线稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败读一个字节/给脉冲信号/给脉冲信号 return(dat);*void WriteOneChar(unsigned char dat)unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = dat&0 x01;De
26、lay(5);DQ = 1;dat=1;*unsigned int ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=O;lnit_DS18B20();WriteOneChar(OxCC);WriteOneChar(Ox44);lnit_DS18B20();WriteOneChar(OxCC);WriteOneChar(OxBE);a=ReadOneChar();b=ReadOneChar();写一个字节读取温度/跳过读序号列号的操作/启动温度转换跳过读序号列号的操作读取温度寄存
27、器读低 8 位读高 8 位t=b;t=8;t=t|a;tt=t*0.0625;t=tt*10+0.5;return (t);*18. LCM2402 (1602也适用)驱动程序以下是 LCM2402 (1602 也适用)驱动程序*/引脚定义II(使用者根据实际更改)#defineLCM2402_DB0_DB7P1sbit LCM2402_RS = P3A2;sbit LCM2402_RW = P3A3;sbit LCM2402_E= P3A4;sbit LCM2402_Busy = P1A7;*定义 LCM2402 指令集/ (详细请见技术手册)*/#defi neCMD clear0 x01
28、*/放大 10 倍输出并四舍五入/定义 LCM2402 的数据总线/定义 LCM2402 的 RS 控制线/定义 LCM2402 的 RW 控制线/定义 LCM2402 的 E 控制线/定义 LCM2402 的测忙线(与 LCM2402_DB0_DB7 关联)/清除屏幕#defi neCMD_back0 x02#defi neCMD_dec10 x04#defi neCMD_add10 x06#defi neCMD_dis_gb1OxOf#defi neCMD_dis_gb2OxOe#defi neCMD_dis_gb30 x0c#defi neCMD_OFF_dis0 x08#defi ne
29、CMD_set820 x38#defi neCMD_set810 x30#defi neCMD_set420 x28#defi neCMD_set410 x20#defi nelin_10 x80#defi nelin 2OxcO/*/读 LCM 忙程序底层协议/ (所有底层协议都无需关注)/ LCM2402 测忙,若 LCM2402 处于忙状态,本函数将等待至非忙状态*/void LCM2402_TestBusy(void)LCM2402_DB0_DB7 = Oxff;LCM2402_RS = 0;LCM2402_RW = 1;LCM2402_E = 1;while(LCM2402_Busy
30、);LCM2402_E = 0;*写指令程序/向 LCM2402 写命令 本函数需要 1 个指令集的入口参数II*/ DDRAM 回零位/读入后 AC (指针)减 1,向左写 /读入后AC (指针)力口 1,向右写 /开显示_开光标开光标闪烁/开显示_开光标关光标闪烁/开显示_关光标关光标闪烁/关显示_关光标关光标闪烁/ 8 位总线_2 行显示8 位总线行显示(上边行)/4 位总线_2 行显示4 位总线行显示(上边行)4 位总线行显示(上边行)/4 位总线_1 行显示(上边行)/设备读状态等待 LCM 不忙void LCM2402_WriteCMD(uint8 LCM2402_command)
31、LCM2402_T estBusy();LCM2402_DB0_DB7 = LCM2402_command:LCM2402_RS = 0;LCM2402_RW= 0;LCM2402_E = 1;LCM2402_E = 0;*/写数据程序/向 LCM2402 写数据/*/ voidLCM2402_WriteData(uint8 LCM2402_data)LCM2402_T estBusy();LCM2402_DB0_DB7 = LCM2402_data;LCM2402_RS = 1;LCM2402_RW= 0;LCM2402_E = 1;LCM2402_E = 0;*/打印字符串程序/ (本函数
32、调用指针函数)/向 LCM 发送一个字符串,长度 48 字符之内/第_行位置 0 x000 x 仃第二行位置 0 x40-0 x57/应用举例:print(0 x80,); /在第一行第一位处从左向右打印*/void print(uint8 a,uint8 *str)LCM2402_WriteCMD(a | 0 x80); 字符串while(*str != 0)LCM2402_WriteData(*str+);*str = 0;*打印单字符程序/第_行位置 0 x000 x 仃第二行位置 0 x40-0 x57/向 LCM 发送一个字符,以十六进制(0 x00)表示/应用举例:print(0
33、xc0,0 x30); 在第二行第一位处打印字符“0*/ void print2(uint8 a,uint8t)LCM2402_WriteCMD(a | 0 x80);LCM2402_WriteData(t);*IILCM2402 初始化/ (使用者可自定义,加 *号程序行必须保留但可修改)*/ void LCM2402nit(void)LCM2402_WriteCMD(CMD_set82);LCM2402_WriteCMD(CMD_clear);LCM2402_WriteCMD(CMD_back);LCM2402_WriteCMD(CMD_add1);LCM2402_WriteCMD(CMD
34、_dis_gb3);*/*显示模式设置:显示 2 行,每个字符为 5*7 个像素 /显示清屏/*数据指针指向第 1 行第 1 个字符位置/显示光标移动设置:文字不动,光标右移/显示开及光标设置:显示开,光标开,闪烁开19.主函数/*函数名:主函数调用:无参 数:无返回值:无结 果:程序开始处,无限循环备注:*/void main (void)*函数名:扬声器驱动备注:/*unsigned char MUSIC;unsigned char STHO;unsigned char STLO;unsigned int code tab=64021,64103,64260,64400,/低音 3 开始6
35、4524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178;void main(void)TMOD=0 x01;ET0=1;EA=1;KEY = Oxff; while(1)STH0=tabMUSIC/256;STL0=tabMUSIC%256;TR0=1;elseSPEAKER = 1;TR0=0;void tO(void) interrupt 1 using 0TH0=STH0;TL0=STL0;SPEAKER=SPEAKER;*20. 8个独立式键盘驱动程序/*函数名:8 个独立式键盘驱动程序调用:? = Key ();参 数:无返回值:unsigned char 键值 08结 果:有键按下时返回值为键值18,无键按下时返回值为0备注:在主函数中不断调用*/unsigned char Key ()unsigned char a,b;KEY = Oxff;if (KEY != Oxff)Delay (20);if (KEY != Oxff)a = KEY;switch(a) /键盘状态查表case Oxfe: b = 1; break;case Oxfd: b = 2; break;case Oxfb: b = 3; break;case 0 xf7:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- NB/T 11542-2024煤矿巷道笼式锚索底板锚注支护技术规范
- GH/T 1439-2023小茴香
- 《客户跟踪技巧》课件
- 《chapter固定资产》课件
- 《肩关节镜简介》课件
- 单位管理制度合并选集【人事管理篇】
- 2024第八届全国职工职业技能大赛(网约配送员)网上练兵考试题库-中(多选题)
- 单位管理制度分享汇编人事管理篇
- 单位管理制度分享大全人力资源管理篇十篇
- 单位管理制度范例选集人力资源管理篇十篇
- Cinema 4D从入门到精通PPT完整版全套教学课件
- T-SHSPTA 002-2023 药品上市许可持有人委托销售管理规范
- 我国双语教育发展现状以及建议
- 放射治疗技术常用放射治疗设备课件
- 保研推免个人简历
- 《计算机组成原理》武汉大学2023级期末考试试题答案
- 广东广州白云区2021学年第二学期期末学生学业质量诊断调研六年级语文(含答案)
- 公安院校公安专业招生体检表
- 2023-2024学年四川省泸州市小学数学四年级上册期末评估测试题
- GB/T 9944-2015不锈钢丝绳
- GB/T 5019.11-2009以云母为基的绝缘材料第11部分:塑型云母板
评论
0/150
提交评论