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

下载本文档

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

文档简介

1、8051单片机C语言编程模板2. 毫秒级CPU延时函数 43. 定时/计数器初始化函数 54. 定时/计数器1中断处理函数 65. 定时/计数器0中断处理函数 76. PWM初始化函数 87. PWM(占空比设置函数 98. UART串口初始化函数 109. UART串口接收中断处理函数 1110. UART串口发送函数 1211. UART串口发送字符串函数 1312. 外部中断INT初始化函数 1413. 外部中断INT1中断处理程序 1514. 外部中断INT0中断处理程序 1515. 普通I/O 口模拟PW生成程序 1616. LCD 驱动 1617. DS18B20温度传感器驱动 1

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

3、种数据类型最值常量#include /定义本地化函数#include /定义数学函数#include /定义输入/输出函数#include /定义杂项函数及内存分配函数#include/ 字符串处理#include /基于数组的输入/输出#include /定义关于时间的函数#include /宽字符处理及输入/输出#include / 宽字符分类#includevintrins.h/51 基本运算(包括 _nop_空函数)sfrP1=0x90;sbitAdd_Key=P3A1;sfr自定义名=SFR地址;/按字节定义SFR中的存储器名。例: sbit自定义名=系统位名;/按位定义SFR中的存

4、储器名。例: bit自定义名;/定义一个位(位的值只能是 0或1)例:bitLED;#define代替名原名/用代替名代替原名。例:#defineLEDP1/#defineTA0x25#defineKEYPI/键盘所连接的I/O接口组定义 sbitSPEAKER=P3A7;/扬声器连接定义sbitDQ=P2A5;/ds18B20sbitRS=PM0;/模式位,为0输入指令,为1输入数据sbitRW=P1Al;读写位,为0读,为1写sbitE=P1A2; / 使能位#defineLcd_BusP0/ 数据总线unsignedchar自定义名;/定义一个0255的整数变量。unsignedint自

5、定义名;/定义一个065535的整数变量。data字节寻址片内 RAM片内RAM勺128字节(例:dataunsignedchara;)bdata 可位寻址片内 RAM 16 字节,从 0x20到 0x2F (例:bdataunsignedchara;) idata所有片内 RAM 256字节,从 0x00 到 0xFF (例:idataunsignedchara;)pdata 片外 RAM 256 字节,从 0x00 到 0xFF (例:pdataunsignedchara;) xdata 片外 RAM 64K字节,从 0x00 到 0xFFFF (例:xdataunsignedchara;

6、) codeROM存储器,64K字节,从 0x00 到 0xFFFF (例:codeunsignedchara;)2.毫秒级CPU延时函数/*函数名:毫秒级CPU延时函数调用:DELAY_MS();参数:165535 (参数不可为0)返回值:无结果:占用CPL方式延时与参数数值相同的毫秒时间备注:应用于1T单片机时i600,应用于12T单片机时i125 (在此预为1T单片机数值) /*/voidDELAY_MS(u nsig nedi nta) _un sig nedi nti;while(-a!=0)for(i=0;i /* voidUART_TC(u nsig nedchar*str) _

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

8、用寄存器组312.外部中断INT初始化函数/* 函数名:外部中断INT初始化函数调用:INT_init();参数:无返回值:无结果:启动外部中断INT1、INTO中断,设置中断方式 备注:/*/ voidINTni t(void) _EA=1; /中断总开关EX1=1允许外部中断1中断EX0=1允许外部中断0中断IT仁1;/1 :下沿触发0:低电平触发IT0=1;/1 :下沿触发0:低电平触发13.外部中断INT1中断处理程序/*函数名:外部中断INT1中断处理程序调用:外部引脚INT1中断处理参数:无返回值:无结果:用户处理外部中断信号备注:/*/voidINT_1(void)interru

9、pt2using2/ 切换寄存器组到 2 _/用户函数内容/*/14.外部中断INTO中断处理程序/*函数名:外部中断INTO中断处理程序调用:外部引脚INTO中断处理参数:无返回值:无结果:用户处理外部中断信号备注:/*/voidlNT_0(void)interruptOusing2 / 切换寄存器组到 2 _/用户函数内容/*/15.普通I/O 口模拟PWM生成程序/*函数名:普通I/O 口模拟PW生成程序调用:display。备注:/*/voiddisplay(unsignedinta)/ 显示程序(50ms的 PWM宽度)DY_PORT=0x00_ED 小灯亮delay(a);/延时a

10、的长度DY_PORT=0xff/LED 小灯灭delay(DY_PWM-a); 延时总 PWI长度减 a16丄CD驱动/LCD驱动(DY12864CB液晶显示屏并口驱动程序)/* voidchk_busy() /检查忙位(底层)RS=O;RW=1;E=1;Lcd_Bus=Oxff;while(Lcd_Bus&0x80)=0x80);E=0;/* voidwrite_com(u nsig nedcharcmdcode) /写命令到LCD(底层) chk_busy();RS=0;RW=0;E=1;Lcd_Bus=cmdcode;E=0;/*voidwrite_data(unsignedcharDi

11、spdata) / 写数据到 LCD(底层) _chk_busy();RS=1;RW=O;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) /向LCM发送一个字符串,长度64字符之内。(被调用层) while(*s0)/ 应用:lcm_w_word(您好! ”); 一 一write

12、_data(*s);s+;/*/voidlcm_w_test(biti,unsignedcharword) / 写指令或数据(被调用层) 一 一if(i=0)write_com(word); /写指令或数据(0,指令) elsewrite_data(word); /写指令或数据(1,数据)/*voidlcm_clr(void) / 清屏函数 _lcm_w_test(O,OxO1);17.DS18B20温度传感器驱动/DS18B20温度传感器驱动(显示0至60度)voidDelay(intnum) / 延时函数while( num-);/*voidInit_DS18B20(void) / 初始化

13、 ds1820un sig nedcharx=0;DQ=1/DQ 复位Delay(8); /稍做延时DQ=0/单片机将DC拉低Delay(80); /精确延时大于480usDQ=1/拉高总线Delay(14);x=DQ/稍做延时后如果x=0则初始化成功x=1则初始化失败Delay(20); un sig nedcharRead On eChar(void) /读一个字节un sig nedchari=0;un sig nedchardat=0;for(i=8;i0;i-)DQ=0/给脉冲信号dat=1;DQ=1/给脉冲信号if(DQ)dat|=0x80;Delay(4);return(dat)

14、;/*voidWriteOneChar(unsignedchardat)/ 写一个字节un sig nedchari=0;for(i=8;i0;i-)DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat=1;/* un sig nedi ntReadTemperature(void) /读取温度un sig nedchara=O;un sig nedcharb=O;un sig nedi ntt=O;floattt=0;In it_DS18B20();Write On eChar(0xCC); /跳过读序号列号的操作Write On eChar(0x44); / 启动温度转换I

15、n it_DS18B20();Write On eChar(0xCC); /跳过读序号列号的操作Write On eChar(0xBE); /读取温度寄存器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);I*18.LCM2402( 1602也适用)驱动程序/*/以下是LCM2402( 1602也适用)驱动程序/*/引脚定义/ (使用者根据实际更改)#defineLCM2402_DB0_DB7 P1/ 定义 LCM2402勺数据总线

16、sbitLCM2402_RS=P3T;/ 定义 LCM2402勺 RS控制线sbitLCM2402_RW=P3T;/ 定义 LCM2402勺 RW空制线sbitLCM2402_E=P3A4;/ 定义 LCM2402勺 E 控制线sbitLCM2402_Busy=P1A7;/ 定义 LCM2402勺测忙线(与 LCM2402_DB0_DB7联)/定义LCM2402旨令集(详细请见技术手册)#defi neCMD_clear0x01/清除屏幕#defi neCMD_back0x02/DDRAMM 零位#defi neCMD_dec10x04/读入后AC (指针)减1,向左写#defi neCMD_

17、add10x06/读入后AC (指针)加1,向右写#defi neCMD_dis_gb10x0f /开显示_开光标开光标闪烁#defi neCMD_dis_gb20x0e开显示_开光标关光标闪烁#defi neCMD_dis_gb30x0c开显示_关光标关光标闪烁#defi neCMD_OFF_dis0x08/关显示_关光标关光标闪烁#defi neCMD_set820x38/8位总线_2行显示#defi neCMD_set810x30/8位总线_1行显示(上边行)#defi neCMD_set420x28/4位总线_2行显示#defi neCMD_set410x20/4位总线_1行显示(上边

18、行)#defi nelin_10x80/4位总线_1行显示(上边行)#defi nelin_20xc0/4位总线_1行显示(上边行)*/读LCM忙程序底层协议/ (所有底层协议都无需关注)/LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态/ voidLCM2402_TestBusy(void) _LCM2402_DB0_DB7=0xff;/ 设备读状态LCM2402_RS=0;LCM2402_RW=1;LCM2402_E=1;while(LCM2402_Busy); / 等待 LCM不忙 LCM2402_E=0; /*/写指令程序/向LCM2402W命令本函数需要1个指令

19、集的入口参数/*/voidLCM2402_WriteCMD(ui nt8LCM2402_comma nd)LCM2402_TestBusy();LCM2402_DB0_DB7=LCM2402_comma nd;LCM2402_RS=0;LCM2402_RW=0;LCM2402_E=1;LCM2402_E=0;/*/写数据程序/ 向 LCM2402W数据 /*/voidLCM2402_WriteData(ui nt8LCM2402_data)LCM2402_TestBusy();LCM2402_DB0_DB7=LCM2402_data;LCM2402_RS=1;LCM2402_RW=0;LCM2

20、402_E=1;LCM2402_E=0;/*II打印字符串程序/ (本函数调用指针函数)/向LCM发送一个字符串,长度48字符之内/第一行位置0x000x17第二行位置0x400x57/应用举例:print(0x80,);/在第一行第一位处从左向右打印字符串/*/voidpri nt(ui nt8a,ui nt8*str)LCM2402_WriteCMD (a|0x80);while(*str!=0)LCM2402_WriteData(*str+);*str=0;/*/打印单字符程序/第一行位置0x000x17第二行位置0x400x57/向LCM发送

21、一个字符,以十六进制(0x00)表示/应用举例:print(0xc0,0x30);在第二行第一位处打印字符“ 0”/*/voidpri nt2(ui nt8a,ui nt8t)LCM2402_WriteCMD (a| 0x80);LCM2402_WriteData(t);I*/LCM2402初始化/ (使用者可自定义,加*号程序行必须保留但可修改)/*/voidLCM2402ni t(void)LCM2402_WriteCMD(CMD_set82); /*显示模式设置:显示 2行,每个字符为5*7个像素LCM2402_WriteCMD(CMD_clear); / 显示清屏LCM2402_Wri

22、teCMD(CMD_back); /*数据指针指向第1行第1个字符位置LCM2402_WriteCMD(CMD_add1); /显示光标移动设置:文字不动,光标右移LCM2402_WriteCMD(CMD_dis_gb3);显示开及光标设置:显示开,光标开,闪烁开19.主函数/*函数名:主函数调用:无参数:无返回值:无结果:程序开始处,无限循环备注:/*/ voidma in(v oid)/*函数名:扬声器驱动备注:/*/un sig nedcharMUSIC;un sig nedcharSTH0;un sig nedcharSTL0;un sig nedi ntcodetab=64021,6

23、4103,64260,64400, / 低音 3 开始64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178;voidma in(v oid)TMOD=0x01;ET0=1;EA=1;KEY=0xff;while(1)STH0=tabMUSIC/256;STL0=tabMUSIC%256;TR0=1;elseSPEAKER*TR0=0;voidt0(void)i nterrupt1usi ng0TH0=STH0;TL0=STL0;SPEAKER=SPEAKER;/*/20.8个独立式键盘驱动程序/*函数名:

24、8个独立式键盘驱动程序调用:=Key();参数:无返回值:unsignedchar 键值 08结果:有键按下时返回值为键值18,无键按下时返回值为0备注:在主函数中不断调用/*/unsignedcharKey() 8个独立键盘处理程序un sig nedchara,b;KEY=0xff; /设定键盘初始电平状态if(KEY!=0xff) /读取键盘状态是否改变Delay(20); / 延时 20ms去抖动if(KEY!=0xff) / 重新读取a=KEY/寄存状态值到aswitch(a)键盘状态查表case0xfe:b=1;break;case0xfd:b=2;break;case0xfb:b=3;break;case0xf7:b=4;break;case0xef:b=5;break;case0xdf:b=6;break;case0xbf:b=7;break;case0x7f:b=8;break;default:b=0;break;return(b); /将b中的键值代号送入函数返回值/*/21.16个阵列式键盘驱动程序/* 函数名:16个阵列式键盘驱动程序调用:=Key();参数:无

温馨提示

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

最新文档

评论

0/150

提交评论