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

下载本文档

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

文档简介

1、8051 单片机 C 语言编程模板2. 毫秒级 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. LC

2、D 驱动 1617. DS18B20温度传感器驱动 1918. LCM2402(1602 也适用)驱动程序 2119. 主函数 2520.8 个独立式键盘驱动程序 2721.16 个阵列式键盘驱动程序 281. 函数头文件/*程序名: 编写人:编写时间: 硬件支持: 接口说明: 修改日志:NO.1-20 年月日说明:/ 通用 89C51头文件(只留下实际使用的单片机所对应的头文件) #include / 设定插入点 #include / 字符处理 #include / 定义错误码 #include / 浮点数处理 #include / 文件输入输出 #include / 参数化输入输出 #in

3、clude / 数据流输入输出 #include / 定义各种数据类型最值常量 #include / 定义本地化函数 #include / 定义数学函数 #include / 定义输入输出函数 #include / 定义杂项函数及内存分配函数 #include / 字符串处理sfrP1=0x90;sbitAdd_Key=P31;#include / 基于数组的输入输出 #include / 定义关于时间的函数 #include / 宽字符处理及输入输出 #include / 宽字符分类 #include /51 基本运算(包括 _nop_空函数) sfr 自定义名=SFR 地址; / 按字节定

4、义 SFR中的存储器名。例: sbit 自定义名= 系统位名; / 按位定义 SFR中的存储器名。例: bit 自定义名; / 定义一个位(位的值只能是 0或 1)例: bitLED;#define 代替名 原名/ 用代替名代替原名。例: #defineLEDP1/#defineTA0x25 #defineKEYP1/ 键盘所连接的 I/O 接口组定义 sbitSPEAKER=P37;/ 扬声器连接定义 sbitDQ=P25; /ds18B20sbitRS=P10; / 模式位,为 0 输入指令,为 1输入数据 sbitRW=P11;/ 读写位,为 0 读,为 1 写 sbitE=P12; /

5、 使能位#defineLcd_BusP0 / 数据总线 unsignedchar 自定义名 ; / 定义一个 0255 的整数变量。 unsignedint 自定义名 ; / 定义一个 065535的整数变量。data 字节寻址片内 RAM,片内 RAM的 128 字节(例: dataunsignedchara; ) bdata 可位寻址片内 RAM,16 字节,从 0x20到 0x2F(例: bdataunsignedchara; ) idata 所有片内 RAM, 256字节,从 0x00到 0xFF(例: idataunsignedchara; ) pdata 片外 RAM,256字节,

6、从 0x00 到 0xFF(例: pdataunsignedchara; ) xdata 片外 RAM,64K字节,从 0x00 到 0xFFFF(例: xdataunsignedchara; ) code ROM存储器, 64K字节,从 0x00 到 0xFFFF(例: codeunsignedchara; )2. 毫秒级 CPU 延时函数/* 函数名:毫秒级 CPU延时函数调用: DELAY_MS();参数: 165535(参数不可为 0)返回值:无结果:占用 CPU方式延时与参数数值相同的毫秒时间备注:应用于 1T单片机时 i600 ,应用于 12T单片机时 i125 (在此预为 1T单

7、片机数值) /*/ voidDELAY_MS(unsignedinta)unsignedinti;while(-a!=0)for(i=0;i600;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中的值自动写入 TL1 1 3 两组 8 位 T/C3. 定时/计数器初始化函数/* 函数名:定时 / 计数器初始化函数调用: T_C_init(); 参数:无 返回值:无 结果:设置 SFR中 T/C1和(

8、或) T/C0 相关参数 备注:本函数控制 T/C1 和 T/C0,不需要使用的部分可用 / 屏蔽 /*/ voidT_C_init(void)TMOD=0x11/; 高 4 位控制 T/C1GATE, 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

9、=50mS延时) /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 位(重新写入初值)TL1=0xB0;/16 位计数寄存器 T1低 8

10、 位(0x3CB0=50mS延时)/ 函数内容/*/5. 定时 /计数器 0 中断处理函数/* 函数名:定时 / 计数器 0 中断处理函数调用: T/C0 溢出后中断处理 参数:无返回值:无结果:重新写入 16 位计数寄存器初始值,处理用户程序 备注:必须允许中断并启动 T/C 本函数方可有效,重新写入初值需和 T_C_init 函数一致 /*/ voidT_C0(void)interrupt1using1/ 切换寄存器组到 1TH0=0x3C/;/16 位计数寄存器 T0高 8 位(重新写入初值)TL0=0xB0;/16 位计数寄存器 T0低 8 位(0x3CB0=50mS延时) / 函数内

11、容6. PWM 初始化函数/* 函数名: PWM初始化函数调用: PWM_init();参数:无 返回值:无结果:将 PCA初始化为 PWM模式,初始占空比为 0 备注:需要更多路 PWM输出直接插入 CCAPnH和 CCAPnL即可 /*/ voidPWM_init(void)CMOD=0x02/; 设置 PCA定时器CL=0x00;CH=0x00;CCAPM0=0x42/;PWM0设置 PCA工作方式为 PWM方式( 01000010) CCAP0L=0x00/;/ 设置 PWM0初始值与 CCAP0H相同CCAP0H=0x00/;PWM0初始时为 0 /CCAPM1=0x42;/PWM1

12、设置 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初始时为 0CR=1;/ 启动 PCA定时器 /*/7.

13、PWM0 占空比设置函数/*函数名: PWM占0 空比设置函数调用: PWM0_set();参数: 0x000xFF(亦可用 0255)返回值:无结果:设置 PWM模式占空比,为 0 时全部高电平,为 1 时全部低电平 备注:如果需要 PWM的1 设置函数,只要把 CCAP0L和 CCAP0H中的 0 改为 1即可 /*/ voidPWM0_set(unsignedchara)CCAP0L=a/;/ 设置值直接写入 CCAP0LCCAP0H=a/; 设置值直接写入 CCAP0H /*/8. UART 串口初始化函数/*函数名: UART串口初始化函数调用: UART_init();参数:无返回

14、值:无结果:启动 UART串口接收中断,允许串口接收,启动 T/C1 产生波特率(占用) 备注:振荡晶体为 12MHz,PC串口端设置 4800 ,8,无, 1,无 voidUART_init(void)EA=1;/ 允许总中断(如不使用中断,可用 / 屏蔽) ES=1;/ 允许 UART串口的中断/TMOD=0x20; / 定时器 T/C1 工作方式 2SCON=0x50/;/ 串口工作方式 1,允许串口接收( SCON=0x4时0 禁止串口接收) /TH1=0xF3; / 定时器初值高 8 位设置/TL1=0xF3; / 定时器初值低 8 位设置 PCON=0x80/;/ 波特率倍频(屏蔽

15、本句波特率为 2400)/TR1=1; / 定时器启动9. UART 串口接收中断处理函数 /* 函数名: UART串口接收中断处理函数 调用: SBUF收到数据后中断处理 参数:无 返回值:无 结果: UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去) 备注:过长的处理程序会影响后面数据的接收/*/ voidUART_R(void)interrupt4using1 / 切换寄存器组到 1unsignedcharUART_data; / 定义串口接收数据变量 ( 需要对接受到的数据进行处理时,可将其定义为全局变量 ) RI=0; / 令接收中断标志位为 0(软件清零)UART_

16、data=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(unsignedcharU

17、ART_data) / 定义串口发送数据变量SBUF=UART_data; / 将接收的数据发送回去 while(TI=0); / 检查发送中断标志位 TI=0; / 令发送中断标志位为 0(软件清零) /*/11. UART 串口发送字符串函数/*函数名: UART串口发送字符串函数调用: UART_TC();参数:需要 UART串口发送的数据( 8 位/1 字节) 返回值:无头文件支持结果:向串口发送一个字符串 , 长度不限。 备注:例: UART_TC(d9887321);此函数需要 #include /* voidUART_TC(unsignedchar*str) while(*str

18、!=0) UART_T(*str);*str+;*str=0; /* 中断入口说明 中断入口说明 interrupt0 外部中断 0( ROM入口地址: 0x03) interrupt1 定时/计数器中断 0(ROM入口地址: 0x0B) interrupt2 外部中断 1( ROM入口地址: 0x13)interrupt3 定时/计数器中断 1(ROM入口地址: 0x1B) interrupt4UART 串口中断( ROM入口地址: 0x23) (更多的中断依单片机型号而定, ROM中断入口均相差 8 个字节) using0 使用寄存器组 0using1 使用寄存器组 1 using2 使用

19、寄存器组 2 using3 使用寄存器组 312. 外部中断 INT 初始化函数/* 函数名:外部中断 INT 初始化函数调用: INT_init(); 参数:无 返回值:无 结果:启动外部中断 INT1、INT0 中断,设置中断方式 备注:/*/ voidINT_init(void)EA=1; / 中断总开关EX1=1;/ 允许外部中断 1 中断EX0=1;/ 允许外部中断 0 中断IT1=1; /1 :下沿触发 0:低电平触发IT0=1; /1 :下沿触发 0:低电平触发 13. 外部中断 INT1 中断处理程序 /* 函数名:外部中断 INT1 中断处理程序调用: 外部引脚 INT1中断

20、处理 参数:无返回值:无 结果:用户处理外部中断信号 备注:/*/ voidINT_1(void)interrupt2using2 / 切换寄存器组到 2/ 用户函数内容/*/14. 外部中断 INT0 中断处理程序/* 函数名:外部中断 INT0 中断处理程序调用: 外部引脚 INT0中断处理 参数:无返回值:无 结果:用户处理外部中断信号备注:/*/ voidINT_0(void)interrupt0using2 / 切换寄存器组到 2/ 用户函数内容/*/15. 普通 I/O 口模拟 PWM 生成程序/* 函数名:普通 I/O 口模拟 PWM生成程序调用: display()备注:/*/

21、 voiddisplay(unsignedinta) / 显示程序( 50ms的 PWM宽度) DY_PORT=0x00/;LED 小灯亮 delay(a); / 延时 a 的长度DY_PORT=0xff;/LED 小灯灭 delay(DY_PWM-a);/ 延时总 PWM长度减 a16. LCD 驱动/LCD 驱动( DY12864CBL液晶显示屏并口驱动程序)/* voidchk_busy() / 检查忙位(底层)RS=0;RW=1;E=1;Lcd_Bus=0xff; while(Lcd_Bus&0x80)=0x80); E=0; /* voidwrite_com(unsignedchar

22、cmdcode) / 写命令到 LCD(底层) chk_busy(); RS=0; RW=0; E=1;Lcd_Bus=cmdcode;E=0; /* voidwrite_data(unsignedcharDispdata) / 写数据到 LCD(底层)chk_busy();RS=1;RW=0;E=1;Lcd_Bus=Dispdata;E=0;/*/ voidlcm_init() / 初始化 LCD屏(被调用层)write_com(0x30); / 选择 8bit 数据流 write_com(0x0c); / 开显示 ( 无游标、不反白 ) write_com(0x01); / 清除显示,并且

23、设定地址指针为 00H /*/voidlcm_w_word(unsignedchar*s) / 向 LCM发送一个字符串 , 长度 64 字符之内。(被调用层) while(*s0) / 应用: lcm_w_word( 您好! );write_data(*s);s+;/*/ voidlcm_w_test(biti,unsignedcharword) / 写指令或数据(被调用层) if(i=0)write_com(word); / 写指令或数据( 0,指令) elsewrite_data(word); / 写指令或数据( 1,数据)/* voidlcm_clr(void) / 清屏函数 lcm_

24、w_test(0,0x01);17. DS18B20 温度传感器驱动/DS18B20 温度传感器驱动(显示 0至 60度)voidDelay(intnum) / 延时函数while(num-);/* voidInit_DS18B20(void) / 初始化 ds1820 unsignedcharx=0; DQ=1;/DQ 复位 Delay(8); / 稍做延时 DQ=0;/ 单片机将 DQ拉低 Delay(80); / 精确延时大于 480us DQ=1;/ 拉高总线 Delay(14);x=DQ;/ 稍做延时后如果 x=0 则初始化成功 x=1 则初始化失败Delay(20);unsigne

25、dcharReadOneChar(void) / 读一个字节 unsignedchari=0; unsignedchardat=0; for(i=8;i0;i-)DQ=0;/ 给脉冲信号 dat=1;DQ=1;/ 给脉冲信号 if(DQ) dat|=0x80;Delay(4); return(dat);/* voidWriteOneChar(unsignedchardat) / 写一个字节 unsignedchari=0; for(i=8;i0;i-)DQ=0;DQ=dat&0x01;Delay(5);DQ=1; dat=1;/* unsignedintReadTemperature(void

26、) / 读取温度unsignedchara=0;unsignedcharb=0; unsignedintt=0; floattt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换 Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0xBE); / 读取温度寄存器 a=ReadOneChar();/ 读低 8 位 b=ReadOneChar();/ 读高 8 位 t=b;t=8;t=t|a;tt=t*0.0625;t=t

27、t*10+0.5; / 放大 10 倍输出并四舍五入 return(t);18. LCM2402 ( 1602 也适用)驱动程序/*/以下是 LCM2402(1602 也适用)驱动程序/ 引脚定义 / (使用者根据实际更改)#define LCM2402_DB0_DB7 P1 / 定义 LCM2402的数据总线 sbitLCM2402_RS=P32;/ 定义 LCM2402的 RS控制线sbitLCM2402_RW=P33;/ 定义 LCM2402的 RW控制线sbitLCM2402_E=P34;/ 定义 LCM2402的 E 控制线sbitLCM2402_Busy=P17;/ 定义 LCM2

28、402的测忙线(与 LCM2402_DB0_DB关7联)#defineCMD_clear0x01/ 清除屏幕#defineCMD_back0x02/DDRAM回零位#defineCMD_dec10x04/ 读入后 AC(指针)减 1,向左写#defineCMD_add10x06/ 读入后 AC(指针)加 1,向右写#defineCMD_dis_gb10x0f / 开显示 _开光标 _开光标闪烁#defineCMD_dis_gb20x0e/ 开显示 _开光标 _关光标闪烁#defineCMD_dis_gb30x0c/ 开显示 _关光标 _关光标闪烁#defineCMD_OFF_dis0x08/

29、关显示 _关光标 _关光标闪烁#defineCMD_set820x38/8 位总线 _2 行显示#defineCMD_set810x30/8 位总线 _1 行显示(上边行)#defineCMD_set420x28/4 位总线 _2 行显示#defineCMD_set410x20/4 位总线 _1 行显示(上边行)#definelin_10x80/4 位总线 _1 行显示(上边行)#definelin_20xc0/4 位总线 _1 行显示(上边行)/ 定义 LCM2402指令集 / (详细请见技术手册)/ 读 LCM忙程序 底层协议 / (所有底层协议都无需关注)/LCM2402 测忙,若 LC

30、M2402处于忙状态,本函数将等待至非忙状态 / voidLCM2402_TestBusy(void)LCM2402_DB0_DB7=0xff; / 设备读状态LCM2402_RS=0;LCM2402_RW=1;LCM2402_E=1;while(LCM2402_Busy); / 等待 LCM不忙LCM2402_E=0; /* / 写指令程序 / 向 LCM2402写命令本函数需要 1 个指令集的入口参数 / /*/ voidLCM2402_WriteCMD(uint8LCM2402_command)LCM2402_TestBusy();LCM2402_DB0_DB7=LCM2402_comm

31、and;LCM2402_RS=0;LCM2402_RW=0;LCM2402_E=1;LCM2402_E=0;/*/ 写数据程序 / 向 LCM2402写数据 /*/ voidLCM2402_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 第二行位置 0x40

32、0x57/ 应用举例: print(0x80,);/ 在第一行第一位处从左向右打印 字符串 /*/voidprint(uint8a,uint8*str)LCM2402_WriteCMD(a|0x80);while(*str!=0)LCM2402_WriteData(*str+);*str=0;/*/ 打印单字符程序 / 第一行位置 0x000x17 第二行位置 0x400x57/ 向 LCM发送一个字符 , 以十六进制( 0x00)表示/ 应用举例: print(0xc0,0x30);/ 在第二行第一位处打印字符“ 0” /*/ voidprint2(uint8a,uint8t) LCM240

33、2_WriteCMD(a|0x80); LCM2402_WriteData(t);/LCM2402 初始化 / (使用者可自定义,加 * 号程序行必须保留但可修改) /*/ voidLCM2402_Init(void)LCM2402_WriteCMD(CMD_set82); /* 显示模式设置:显示 2行,每个字符为 5*7 个像素 LCM2402_WriteCMD(CMD_clear); / 显示清屏LCM2402_WriteCMD(CMD_back); /* 数据指针指向第 1 行第 1个字符位置LCM2402_WriteCMD(CMD_add1); / 显示光标移动设置:文字不动,光标右

34、移 LCM2402_WriteCMD(CMD_dis_gb3); / 显示开及光标设置:显示开,光标开,闪烁开 19. 主函数/* 函数名:主函数调用:无参数:无返回值:无结果:程序开始处,无限循环备注:/*/ voidmain(void)/* 函数名:扬声器驱动备注:/*/ unsignedcharMUSIC;unsignedcharSTH0;unsignedcharSTL0;unsignedintcodetab=64021,64103,64260,64400, / 低音 3 开始64524,64580,64684,64777,64820,64898,64968,65030,65058,65

35、110,65157,65178;voidmain(void)TMOD=0x01;ET0=1;EA=1;KEY=0xff;while(1)STH0=tabMUSIC/256;STL0=tabMUSIC%256;TR0=1;elseSPEAKER=1;TR0=0;voidt0(void)interrupt1using0TH0=STH0;TL0=STL0;SPEAKER=SPEAKER;/*/20.8 个独立式键盘驱动程序/* 函数名: 8 个独立式键盘驱动程序调用: =Key();参数:无返回值: unsignedchar 键值 08 结果:有键按下时返回值为键值 18,无键按下时返回值为 0 备注:在主函数中不断调用/*/ unsignedcharKey() /8 个独立键盘处理程序unsignedchara,b;KEY=0xff; / 设定键盘初始电平状态 if(KEY!=0xff) / 读取键盘状态是否改变 Delay(20); / 延时 20ms去抖动 if(K

温馨提示

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

评论

0/150

提交评论