STC单片机C语言通用万能编程_第1页
STC单片机C语言通用万能编程_第2页
STC单片机C语言通用万能编程_第3页
STC单片机C语言通用万能编程_第4页
STC单片机C语言通用万能编程_第5页
免费预览已结束,剩余70页可下载查看

下载本文档

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

文档简介

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. 函数头文件/*程序名:编写人:#include/ 文件输入输出编写时间:硬件支持:接口说明:修改日志:NO.1-20 年月日/

3、*说明:/* #include/通用89C51头文件(只留下实际使用的单片机所对应的头文件)#include/ 设定插入点#include/字符处理#include/定义错误码#include/浮点数处理#include / 参数化输入输出#include / 数据流输入输出#include / 定义各种数据类型最值常量#include / 定义本地化函数#include / 定义数学函数#include / 定义输入输出函数#include/ 定义杂项函数及内存分配函数#include/ 字符串处理#include / 基于数组的输入输出#include / 定义关于时间的函数#includ

4、e / 宽字符处理及输入输出#include / 宽字符分类#include/51 基本运算(包括 _nop_空函数)sfrP1=0x90;SbitAdd_Key=P31;sfr自定义名=SFR地址;/按字节定义SFR中的存储器名。例: sbit自定义名=系统位名;/按位定义SFR中的存储器名。例: bit 自定义名 ; / 定义一个位(位的值只能是 0或 1)例: bitLED;#define 代替名 原名/ 用代替名代替原名。例: #defineLEDP1/#defineTA0x25 #defineKEYP1/ 键盘所连接的 I/O 接口组定义 sbitSPEAKER=P37/;/ 扬声器

5、连接定义sbitDQ=P25; /ds18B20 sbitRS=P10; / 模式位,为 0 输入指令,为 1 输入数据 sbitRW=P11; / 读写位,为 0 读,为 1 写sbitE=P12; / 使能位#defineLcd_BusP0 / 数据总线 unsignedchar 自定义名 ; / 定义一个 0255 的整数变量。unsignedint 自定义名 ; / 定义一个 065535 的整数变量。data 字节寻址片内 RAM片内RAMl勺128字节(例:dataunsignedchara;) bdata 可位寻址片内 RAM 16 字节,从 0x20 到 0x2F (例:bda

6、taunsignedchara;) idata 所有片内 RAM 256 字节,从 0x00 到 0xFF (例:idataunsignedchara;) Pdata 片外 RAM 256 字节,从 0x00 到 0xFF (例:PdataUnsignedchara;)Xdata 片外 RAM 64K字节,从 0x00 到 OXFFFF (例:XdataUnsignedchara;) code ROM存储器,64K字节,从 0x00 到 OXFFFF (例:codeUnSignedchara;)2. 毫秒级 CPU 延时函数/*函数名:毫秒级CPI延时函数调用: DELAY_MS();参数:

7、165535(参数不可为 0)返回值:无结果:占用CPL方式延时与参数数值相同的毫秒时间备注:应用于1T单片机时i600,应用于12T单片机时i125 (在此预为 仃单片机数值)/*/ voidDELAY_MS(unsignedinta)unsignedinti;while(-a!=0)for(i=0;i600;i+);*M1 M0 方式 说明OOO 13位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. 定时 /计数器初始化函数/*函数名:定

8、时 /计数器初始化函数调用: 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 位计数寄存器

9、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 位(重新写

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

11、CB0=50m延时)/函数内容/*6. PWM初始化函数/* 函数名:PWIJ始化函数调用:PWMnit();参数:无返回值:无结果:将PCAW始化为PW嗾式,初始占空比为O备注:需要更多路PWI出直接插入CCAPnffi CCAPnIf卩可/*VOidPW Mnit(void)CMOD=OX00;设置PC雄时器*IlBWOd g =UO 0 WBMd /J000=-d99/ 芒购Md 华芒R*ZB0d MIIMdt7X0=ld99/O WBMd /JOOO=-I3cl99/ 芒购MdMIIMdt7X0=3IId99/O 华闻畀 IAIMdMOOXO=H 归VOO/ B0d99 Wd/JOO=

12、H,d99/(/ 潮HM 宙剌)芒购Md 华芒R助ROd MM IIMdl7X0= HId99/ O Wfd Z)OXO=-0d99 (Hooo(Ho)芒购Md 华芒R*ZB0d Ml/IMd)Kt7XO=OI/ldV99 SOXO=HOSOXO=IO*7. PWM0 占空比设置函数/* 函数名:PWM占空比设置函数调用: PWM0_set();参数:OxOOOxFF(亦可用 0255)返回值:无结果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备注:如果需要PWM的设置函数,只要把 CCAPO和CCAPO中的0改为1即可 /*/ voidPWM0_set(unsignedchar

13、a)CCAP0L=a/;/ 设置值直接写入 CCAP0LCCAP0H=a/; 设置值直接写入 CCAP0H8. UART 串口初始化函数/*函数名:UART串口初始化函数调用: UART_init();参数:无返回值:无结果:启动UART串 口接收中断,允许串口接收,启动 T/C1产生波特率(占用)备注:振荡晶体为12MHz PC串口端设置4800, 8,无,1,无/*/ voidUART_init(void)EA=1;/ 允许总中断(如不使用中断,可用 / 屏蔽)ES=I;/允许UART串口的中断/TMOD=0x20;/ 定时器 T/C1 工作方式 2SCoN=OX50; Zz串口工作方式1

14、,允许串口接收(SCoN=OX4时禁止串口接收)/TH1=0xF3; /定时器初值高 8 位设置ZZTL1=0XF3; ZZ 定时器初值低 8 位设置PCoN=0X80; ZZ 波特率倍频(屏蔽本句波特率为 2400)ZZTR1=1; ZZ 定时器启动Z*Z9. UART 串口接收中断处理函数Z*函数名:UARl串口接收中断处理函数调用:SBUF收到数据后中断处理参数:无返回值:无结果:UART串 口接收到数据时产生中断,用户对数据进行处理(并发送回去)备注:过长的处理程序会影响后面数据的接收voidUART_R(void)interrupt4using1 / 切换寄存器组到 1 unsign

15、edcharUART_data; / 定义串口接收数据变量 (需要对接受到的数据进行处理时,可将其定义为全局变量 ) RI=0; / 令接收中断标志位为 0(软件清零)UART_data=SBUF; / 将接收到的数据送入变量 UART_dataZz用户函数内容(用户可使用UART_data做数据处理)/SBUF=UART_data; /将接收的数据发送回去(删除 /即生效)ZZwhile(TI=0); ZZ 检查发送中断标志位ZZTI=0; ZZ 令发送中断标志位为 0 (软件清零) Z*Z10. UART 串口发送函数Z*函数名:UART串 口发送函数调用: UART_T();参数:需要U

16、ART串口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给 UART串 口,确认发送完成后退出备注:/*voidUART_T(unsignedcharUART_data)/ 定义串口发送数据变量SBUF=UART_data; / 将接收的数据发送回去while(TI=0); / 检查发送中断标志位TI=0;/ 令发送中断标志位为 0 (软件清零)/*11. UART 串口发送字符串函数 函数名:UART串口发送字符串函数调用: UART_TC();参数:需要UART串 口发送的数据(8位/1字节)返回值:无结果:向串口发送一个字符串 ,长度不限。头文件支持备注:例:UART_TC

17、(d9887321);此函数需要 #inCIudeVString.h /* voidUART_TC(unSignedChar*Str)whiIe(*Str!=0)UART_T(*Str);*Str+;*Str=0;*中断入口说明 中断入口说明 interrupt 外部中断 0 (RoMK口地址:0x03)interrupt1定时/计数器中断0 (ROM入 口地址:OxOB)in terrupt2 外部中断 1 (ROMK 口地址:0x13)in terrupt3 定时/计数器中断1 (ROM入 口地址:0x1B)interrupt4UART 串口中断(ROM入口地址:0x23)(更多的中断依单

18、片机型号而定,ROM中断入口均相差8个字节)using0 使用寄存器组 0using1 使用寄存器组 1using2 使用寄存器组 2using3 使用寄存器组 312. 外部中断 INT 初始化函数*函数名:外部中断INT初始化函数调用:INTJnit();参数:无返回值:无结果:启动外部中断INT1 INT0中断,设置中断方式备注:/*VOidlNTJnit(VOid)EA= 1; /中断总开关EX1 = 1/允许外部中断1中断EX0=1/允许外部中断0中断IT仁餐/门:下沿触发0:低电平触发T0=1; /1 :下沿触发0:低电平触发*13. 外部中断INTI中断处理程序/*函数名:外部中

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

20、PlayO备注:/*VOiddiSPlay(UnSignedinta) / 显示程序(50ms的 PvV噬度) DY-PORT=OXOeyj-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)

21、 / 写命令至U 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;/*voidlcmnit()/初始化LCD屏 (被调用层)write_com(0x30); / 选择 8bit 数据流 write_com(0x0c); / 开显示 ( 无游标、不反白 )write_com(0x01); / 清除显示,并且设定地址指针为 00H /*/VoidI

22、Cm_w_Word(Unsignedchar*s) Il向LCM发送一个字符串,长度64字符之内。(被调用层) whiIe(*s0)II 应用: I c m_w_w o rd (您好! );write_data(*s);s+;/*/VoidIcm_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.DS18B2

23、0温度传感器驱动 *M/DS18B20温度传感器驱动(显示 0至60度)*MvoidDelay(intnum) / 延时函数while(num-);*MVOidlniLDSl8B20(void) / 初始化 ds1820UnSign edcharx=O;DQ=1/DQ 复位Delay(8); /稍做延时DQ=O/单片机将DO低Delay(80); /精确延时大于480USf*f*f*DQ=1;/ 拉高总线Delay(14);x=DQ;/ 稍做延时后如果 x=0 则初始化成功 x=1 则初始化失败Delay(20);/*unsignedcharReadOneChar(void) / 读一个字节u

24、nsignedchari=0;unsignedchardat=0;for(i=8;i0;i-)DQ=0;/ 给脉冲信号dat=1;DQ=1;/ 给脉冲信号if(DQ)dat=0x80;Delay (4);return(dat);/*,VOidWriteOneChar(UnSignedChardat) / 写一个字节UnSign edchari=O;for(i=8;i0;i-)DQ=O;DQ=dat&OxO1;Delay(5);DQ=1;dat=1;*/*UnSignedintReadTemperature(void) / 读取温度UnSign edchara=0;UnSign edcharb=

25、O;UnSignedin tt=O;Aoattt=O;IniLDSl 8B20();WriteOneChar(OxCC); /跳过读序号列号的操作WriteOneChar(OX44); / 启动温度转换IniLDSl 8B20();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.LCM2

26、402 ( 1602 也适用)驱动程序/*/ / 以下是 LCM2402(1602 也适用)驱动程序/*/* / 引脚定义 / (使用者根据实际更改)#defineCMD_clear#defineCMD_back#defineCMD_dec1#defineCMD_add1#defineCMD_diS_gb1#defineCMD_diS_gb2#defineCMD_diS_gb3#defineLCM2402_DB0_DB7 P1/ 定义 LCM242勺数据总线SbitLCM2402.RS=P32;/定义LCM2402勺RS控制线SbitLCM2402.RW=P33;/定义LCM2402勺RW空制

27、线SbitLCM2402_E=P34;/定义LCM2402勺E控制线SbitLCM2402_BUSy=P17;/定义LCM2402的测忙线(与LCM2402_DB0_DB关联)/*/定义LCM2402指令集/ (详细请见技术手册)/*0x01/ 清除屏幕0x02DDRAM 回零位0x04读入后AC (指针)减1 ,向左写0x06读入后AC (指针)力口 1,向右写0x0f/ 开显示_开光标 _开光标闪烁0x0e/ 开显示_开光标 _关光标闪烁0x0c/ 开显示_关光标 _关光标闪烁#defineCMD_OFF_dis 0x08/ 关显示_关光标_关光标闪烁#defineCMDset820x38

28、/8位总线_2 行显示#defineCMDset810x30/8位总线_1 行显示(上边行)#defineCMDset420x28/4位总线_2 行显示#defineCMDset410x20/4位总线_1 行显示(上边行)#definelin_10x80/4 位总线_1 行显示(上边行)#definelin_20xc0/4 位总线_1 行显示(上边行)/*/读LCM忙程序底层协议/ (所有底层协议都无需关注)ZzLCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态/*/ voidLCM2402_TestBusy(void)LCM2402_DB0_DB7=0xff;/ 设备读状

29、态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_DBO_DB7=LCM2402_COmmanCI;LCM2402_RS=0;LCM2402_RW=0;LCM2402_E=1;LCM2402_E=0;e*/*,/写数据程序/向LCM240官数据/*,VOidLCM2402_Wr

30、iteData(Uint8LCM2402_data)LCM2402_TeStBUSy();LCM2402_DBO_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)LCM2402_WriteCMD(a|0x80);w

31、hile(*str!=0)LCM2402_WriteData(*str+);*str=0;/*/ 打印单字符程序 / 第一行位置 0x000x17 第二行位置 0x400x57ZZ向LCM发送一个字符,以十六进制(OXoo)表示/应用举例: print(0xc0,0x30);/ 在第二行第一位处打印字符“ 0”Z*Z voidprint2(uint8a,uint8t)LCM24o2_WriteCMD(a|oX8o);LCM24o2_WriteData(t);Z*ZZLCM24O2初始化ZZ (使用者可自定义,加*号程序行必须保留但可修改)Z*ZvoidLCM24o2_Init(void)LCM

32、24o2_WriteCMD(CMD_set82); ZZ* 显示模式设置:显示 2行,每个字符为 5*7 个像素LCM24o2_WriteCMD(CMD_clear); ZZ 显示清屏LCM24o2_WriteCMD(CMD_back); ZZ* 数据指针指向第 1 行第 1个字符位置LCM2402_WriteCMD(CMD_add1); / 显示光标移动设置:文字不动,光标右移LCM2402_WriteCMD(CMD_dis_gb3); / 显示开及光标设置:显示开,光标开,闪烁开 /*/19.主函数/*函数名:主函数调用:无参数:无返回值:无结果:程序开始处,无限循环备注:/*/voidmain(void)*函数名:扬声器驱动备注:/*:UnSignedCharMUSIC;UnSign edcharSTHO;UnSign edcharSTLO;UnSignedin tcodetab=64021,64103,64260,64400, / 低音 3 开始64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,6

温馨提示

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

评论

0/150

提交评论