




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机C语言编程模板程序名: 编写人: 编写时间:20 年 月 日硬件支持:接口说明:修改日志:NO.1-/*说明:/*/#include /通用89C51头文件(只留下实际使用的单片机所对应的头文件)#include /设定插入点#include /字符处理#include /定义错误码#include /浮点数处理#include /文件输入输出#include /参数化输入输出#include /数据流输入输出#include /定义各种数据类型最值常量#include /定义本地化函数#include /定义数学函数#include /定义输入输出函数#include /定义杂项函数及内存分配函数#include /字符串处理#include /基于数组的输入输出#include /定义关于时间的函数#include /宽字符处理及输入输出#include /宽字符分类#include /51基本运算(包括_nop_空函数)sfr 自定义名 = SFR地址 ; /按字节定义SFR中的存储器名。例:sfr P1 = 0x90;sbit 自定义名 = 系统位名 ; /按位定义SFR中的存储器名。例:sbit Add_Key = P3 1;bit 自定义名 ; /定义一个位(位的值只能是0或1)例:bit LED;#define 代替名 原名 /用代替名代替原名。例:#define LED P1 / #define TA 0x25#define KEY P1 /键盘所连接的I/O接口组定义sbit SPEAKER = P37; /扬声器连接定义sbit DQ = P2 5;/ds18B20sbit RS = P10;/模式位,为0输入指令,为1输入数据sbit RW = P11;/读写位,为0读,为1写sbit E = P12;/使能位#define Lcd_Bus P0 /数据总线unsigned char 自定义名 ; /定义一个0255的整数变量。unsigned int 自定义名 ; /定义一个065535的整数变量。data字节寻址片内RAM,片内RAM的128字节(例:data unsigned char a;)bdata可位寻址片内RAM,16字节,从0x20到0x2F(例:bdata unsigned char a;)idata所有片内RAM,256字节,从0x00到0xFF(例:idata unsigned char a;)pdata片外RAM,256字节,从0x00到0xFF(例:pdata unsigned char a;)xdata片外RAM,64K字节,从0x00到0xFFFF(例:xdata unsigned char a;)codeROM存储器,64K字节,从0x00到0xFFFF(例:code unsigned char a;)/*函数名:毫秒级CPU延时函数调 用:DELAY_MS (?);参 数:165535(参数不可为0)返回值:无结 果:占用CPU方式延时与参数数值相同的毫秒时间备 注:应用于1T单片机时i600,应用于12T单片机时i125(在此预为1T单片机数值)/*/void DELAY_MS (unsigned int a)unsigned int i;while( -a != 0)for(i = 0; i 600; i+);/*/-M1M0方式说明00013位T/C,由TL低5位和TH的8位组成13位计数器01116位T/C,TL和TH共16位计数器1028位T/C,TL用于计数,当TL溢出时将TH中的值自动写入TL113两组8位T/C-/*函数名:定时/计数器初始化函数调 用:T_C_init();参 数:无返回值:无结 果:设置SFR中T/C1和(或)T/C0相关参数备 注:本函数控制T/C1和T/C0,不需要使用的部分可用/屏蔽/*/void T_C_init (void)TMOD = 0x11; /高4位控制T/C1 GATE,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 = 50mS延时)/ET0 = 1; /T/C0中断开关/TR0 = 1; /T/C0启动开关/*/*函数名:定时/计数器1中断处理函数调 用:T/C1溢出后中断处理参 数:无返回值:无结 果:重新写入16位计数寄存器初始值,处理用户程序备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致/*/void T_C1 (void) interrupt 3 using 3 /切换寄存器组到3TH1 = 0x3C; /16位计数寄存器T1高8位(重新写入初值)TL1 = 0xB0; /16位计数寄存器T1低8位(0x3CB0 = 50mS延时)/函数内容/*/*函数名:定时/计数器0中断处理函数调 用:T/C0溢出后中断处理参 数:无返回值:无结 果:重新写入16位计数寄存器初始值,处理用户程序备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致/*/void T_C0 (void) interrupt 1 using 1 /切换寄存器组到1TH0 = 0x3C; /16位计数寄存器T0高8位(重新写入初值)TL0 = 0xB0; /16位计数寄存器T0低8位(0x3CB0 = 50mS延时)/函数内容/*/*函数名:PWM初始化函数调 用:PWM_init();参 数:无返回值:无结 果:将PCA初始化为PWM模式,初始占空比为0备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可/*/void PWM_init (void)CMOD=0x02; /设置PCA定时器 CL=0x00; CH=0x00;CCAPM0=0x42; /PWM0设置PCA工作方式为PWM方式(0100 0010) CCAP0L=0x00; /设置PWM0初始值与CCAP0H相同 CCAP0H=0x00; / PWM0初始时为0/CCAPM1=0x42; /PWM1设置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初始时为0 CR=1; /启动PCA定时器/*/*函数名:PWM0占空比设置函数调 用:PWM0_set();参 数:0x000xFF(亦可用0255)返回值:无结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可/*/void PWM0_set (unsigned char a)CCAP0L= a; /设置值直接写入CCAP0L CCAP0H= a; /设置值直接写入CCAP0H/*/*函数名:UART串口初始化函数调 用:UART_init();参 数:无返回值:无结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备 注:振荡晶体为12MHz,PC串口端设置 4800,8,无,1,无 /*/void UART_init (void)EA = 1; /允许总中断(如不使用中断,可用/屏蔽)ES = 1; /允许UART串口的中断TMOD = 0x20;/定时器T/C1工作方式2SCON = 0x50;/串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3;/定时器初值高8位设置TL1 = 0xF3;/定时器初值低8位设置PCON = 0x80;/波特率倍频(屏蔽本句波特率为2400)TR1 = 1;/定时器启动 /*/*函数名:UART串口接收中断处理函数调 用:SBUF收到数据后中断处理参 数:无返回值:无结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备 注:过长的处理程序会影响后面数据的接收/*/void UART_R (void) interrupt 4 using 1 /切换寄存器组到1unsigned char UART_data; /定义串口接收数据变量RI = 0;/令接收中断标志位为0(软件清零)UART_data = SBUF;/将接收到的数据送入变量 UART_data/用户函数内容(用户可使用UART_data做数据处理)/SBUF = UART_data;/将接收的数据发送回去(删除/即生效)/while(TI = 0);/检查发送中断标志位/TI = 0;/令发送中断标志位为0(软件清零)/*/*函数名:UART串口发送函数调 用:UART_T (?);参 数:需要UART串口发送的数据(8位/1字节)返回值:无 结 果:将参数中的数据发送给UART串口,确认发送完成后退出备 注:/*/void UART_T (unsigned char UART_data) /定义串口发送数据变量SBUF = UART_data;/将接收的数据发送回去while(TI = 0);/检查发送中断标志位TI = 0;/令发送中断标志位为0(软件清零)/*/*函数名:UART串口发送字符串函数调 用:UART_TC (?);参 数:需要UART串口发送的数据(8位/1字节)返回值:无 结 果:向串口发送一个字符串,长度不限。备 注:例:UART_TC(d9887321); 此函数需要#include 头文件支持。/*/void UART_TC (unsigned char *str)while(*str != 0)UART_T(*str);*str+;*str = 0;/*/中断入口说明interrupt 0 外部中断0(ROM入口地址:0x03)interrupt 1 定时/计数器中断0(ROM入口地址:0x0B)interrupt 2 外部中断1(ROM入口地址:0x13)interrupt 3 定时/计数器中断1(ROM入口地址:0x1B)interrupt 4 UART串口中断(ROM入口地址:0x23)(更多的中断依单片机型号而定,ROM中断入口均相差8个字节)using 0 使用寄存器组0using 1 使用寄存器组1using 2 使用寄存器组2using 3 使用寄存器组3/*函数名:外部中断INT初始化函数调 用:INT_init();参 数:无返回值:无结 果:启动外部中断INT1、INT0中断,设置中断方式备 注:/*/void INT_init (void)EA = 1;/中断总开关EX1 = 1; /允许外部中断1中断 EX0 = 1; /允许外部中断0中断IT1 = 1; /1:下沿触发 0:低电平触发IT0 = 1; /1:下沿触发 0:低电平触发/*/*函数名:外部中断INT1中断处理程序调 用:外部引脚INT1中断处理参 数:无返回值:无结 果:用户处理外部中断信号备 注:/*/void INT_1 (void) interrupt 2 using 2 /切换寄存器组到2/用户函数内容/*/*函数名:外部中断INT0中断处理程序调 用:外部引脚INT0中断处理参 数:无返回值:无结 果:用户处理外部中断信号备 注:/*/void INT_0 (void) interrupt 0 using 2 /切换寄存器组到2/用户函数内容/*/*函数名:普通I/O口模拟PWM生成程序调 用:display (?)备 注:/*/void display (unsigned int a) /显示程序(50ms的PWM宽度)DY_PORT = 0x00; /LED小灯亮delay (a); /延时a的长度DY_PORT = 0xff; /LED小灯灭delay (DY_PWM-a);/延时总PWM长度减a/*/*/LCD驱动(DY12864CBL液晶显示屏并口驱动程序)/*/void chk_busy()/检查忙位(底层) RS=0; RW=1; E=1; Lcd_Bus=0xff; while(Lcd_Bus&0x80)=0x80); E=0;/*/void write_com(unsigned char cmdcode)/写命令到LCD(底层)chk_busy();RS=0;RW=0;E=1;Lcd_Bus=cmdcode;E=0;/*/void write_data(unsigned char Dispdata) /写数据到LCD(底层)chk_busy();RS=1;RW=0;E=1;Lcd_Bus=Dispdata;E=0;/*/void lcm_init()/初始化LCD屏(被调用层) write_com(0x30); /选择8bit数据流 write_com(0x0c); /开显示(无游标、不反白) write_com(0x01); /清除显示,并且设定地址指针为00H/*/void lcm_w_word(unsigned char *s)/向LCM发送一个字符串,长度64字符之内。(被调用层)while(*s0)/应用:lcm_w_word(您好!); write_data(*s); s+; /*/void lcm_w_test(bit i,unsigned char word)/写指令或数据(被调用层)if(i = 0)write_com(word);/写指令或数据(0,指令)elsewrite_data(word);/写指令或数据(1,数据)/*/void lcm_clr(void)/清屏函数lcm_w_test(0,0x01);/*/*/DS18B20温度传感器驱动(显示0至60度)/*/void Delay(int num)/延时函数while(num-) ;/*/void Init_DS18B20(void)/初始化ds1820unsigned char x=0;DQ = 1; /DQ复位Delay(8); /稍做延时DQ = 0; /单片机将DQ拉低Delay(80); /精确延时 大于 480usDQ = 1; /拉高总线Delay(14);x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败Delay(20);/*/unsigned char ReadOneChar(void)/读一个字节unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-)DQ = 0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;Delay(4);return(dat);/*/void WriteOneChar(unsigned char dat)/写一个字节unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat=1;/*/unsigned int ReadTemperature(void)/读取温度unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=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= tt*10+0.5; /放大10倍输出并四舍五入return(t);/*/*/以下是LCM2402(1602也适用)驱动程序/*/*/ 引脚定义 / (使用者根据实际更改)/*/#defineLCM2402_DB0_DB7P1/ 定义LCM2402的数据总线sbit LCM2402_RS = P3 2;/ 定义LCM2402的RS控制线sbit LCM2402_RW = P3 3;/ 定义LCM2402的RW控制线sbit LCM2402_E = P3 4;/ 定义LCM2402的E控制线sbit LCM2402_Busy = P1 7;/ 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联)/*/ 定义LCM2402指令集 / (详细请见技术手册)/*/#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 / 关显示_关光标_关光标闪烁#defineCMD_set820x38 / 8位总线_2行显示#defineCMD_set810x30 / 8位总线_1行显示(上边行)#defineCMD_set420x28 / 4位总线_2行显示#defineCMD_set410x20 / 4位总线_1行显示(上边行)#definelin_10x80 / 4位总线_1行显示(上边行)#definelin_20xc0 / 4位总线_1行显示(上边行)/*/ 读LCM忙程序 底层协议 / (所有底层协议都无需关注)/ LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态 /*/void LCM2402_TestBusy(void) LCM2402_DB0_DB7 = 0xff;/设备读状态 LCM2402_RS = 0; LCM2402_RW = 1; LCM2402_E = 1; while(LCM2402_Busy);/等待LCM不忙 LCM2402_E = 0;/*/ 写指令程序 / 向LCM2402写命令 本函数需要1个指令集的入口参数 /*/void LCM2402_WriteCMD(uint8 LCM2402_command) LCM2402_TestBusy(); LCM2402_DB0_DB7 = LCM2402_command; LCM2402_RS = 0; LCM2402_RW = 0; LCM2402_E = 1; LCM2402_E = 0;/*/ 写数据程序 / 向LCM2402写数据 /*/void LCM2402_WriteData(uint8 LCM2402_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,); /在第一行第一位处从左向右打印字符串/*/void print(uint8 a,uint8 *str)LCM2402_WriteCMD(a | 0x80);while(*str != 0)LCM2402_WriteData(*str+);*str = 0;/*/ 打印单字符程序 / / 第一行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《2025违规的《莱特公寓物业管理合同》》
- 2025年北京市存量房屋承购经纪服务合同
- 2025销售代表劳动合同
- 2025年南昌货运从业资格证考试模拟试题
- 汉语构音障碍评定法(crrc版)
- 寒假放假安全注意事项
- 2025年南平a2货运资格证考试题
- 单招表彰文件
- 2025年济南货运运输驾驶员从业资格证考试试题
- 廉洁警示教育要求
- 2024届吉林省吉林市高三下学期数学试题模拟试题
- 道路普通货物运输企业双重预防机制建设指导手册
- 医院培训课件:《降低肛肠术后尿潴留发生率》
- 【部编版道德与法治六年级下册】全册测试卷(含答案)
- 食堂家长开放日活动方案及流程
- 人工智能技术应用专业调研报告
- 2024年中考英语专项复习:传统文化的魅力(阅读理解+完型填空+书面表达)(含答案)
- 厦门大学网络教育《经济学原理》专在线测试题库及正确答案
- 部编小学语文(2年级下册第3单元)作业设计2
- JT-T-794-2019道路运输车辆卫星定位系统车载终端技术要求
- 2024年陕西省中考物理模拟试卷
评论
0/150
提交评论