51单片机常用模板.doc_第1页
51单片机常用模板.doc_第2页
51单片机常用模板.doc_第3页
51单片机常用模板.doc_第4页
51单片机常用模板.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

拓跋公司名称 | 公司地址模板文档副标题目录* 函数功能 : 延时函数,i=1时,大约延时10us3* 函数功能 :数码管显示函数3* 函数功能 : 设置外部中断14* 函数功能 : 向74HC595发送一个字节的数据4* 函数功能 : 检测有按键按下并读取键值5* 函数功能 :数据处理函数6*功 能:初始化触摸SPI7*功 能:使用SPI读取数据8*功 能:读取触摸数据8#include lcd.h/液晶显示9* 函数功能 : 向LCD写入一个字节的命令10* 函数功能 : 向LCD写入一个字节的数据11* 函数功能 : 初始化LCD屏12* 函数功能 : 通过595发送四个字节的数据14* 函数功能 :设置串口16* 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*/void delay(uint i)while(i-);/* 函数名 :DigDisplay()* 函数功能 :数码管显示函数* 输入 : 无* 输出 : 无*/void DigDisplay()uchar i;for(i=0;i8;i+)switch(i) /位选,选择点亮的数码管,case(0):LSA=0;LSB=0;LSC=0; break;/显示第0位case(1):LSA=1;LSB=0;LSC=0; break;/显示第1位case(2):LSA=0;LSB=1;LSC=0; break;/显示第2位case(3):LSA=1;LSB=1;LSC=0; break;/显示第3位case(4):LSA=0;LSB=0;LSC=1; break;/显示第4位case(5):LSA=1;LSB=0;LSC=1; break;/显示第5位case(6):LSA=0;LSB=1;LSC=1; break;/显示第6位case(7):LSA=1;LSB=1;LSC=1; break;/显示第7位P0=smgduani;/发送段码delay(100); /间隔一段时间扫描P0=0x00;/消隐/* 函 数 名 : Int1Init()* 函数功能 : 设置外部中断1* 输 入 : 无* 输 出 : 无*/void Int1Init()/设置INT1IT1=1;/跳变沿出发方式(下降沿)EX1=1;/打开INT1的中断允许。EA=1;/打开总中断void Int1()interrupt 2/外部中断1的中断函数delay(1000); /延时消抖if(k4=0)led=led;/* 函数名 : Hc595SendByte(uchar dat)* 函数功能 : 向74HC595发送一个字节的数据* 输入 : 无* 输出 : 无*/uchar ledduan=0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00;uchar ledwei=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;void Hc595SendByte(uchar dat)uchar a;SRCLK=0;RCLK=0;for(a=0;a7;dat=1;SRCLK=1;_nop_();_nop_();SRCLK=0;RCLK=1;_nop_();_nop_();RCLK=0;P0=0x7f;for(i=0;i8;i+)P0=ledweii; /位选Hc595SendByte(ledduani);/发送段选数据delay(100); /延时Hc595SendByte(0x00); /消隐/* 函 数 名 : KeyDown* 函数功能 : 检测有按键按下并读取键值* 输 入 : 无* 输 出 : 无*/void KeyDown(void)char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)/读取按键是否按下delay(1000);/延时10ms进行消抖if(GPIO_KEY!=0x0f)/再次检测键盘是否按下/测试列GPIO_KEY=0X0F;switch(GPIO_KEY)case(0X0e):KeyValue=0;break;case(0X0d):KeyValue=4;break;case(0X0b): KeyValue=8;break;case(0X07):KeyValue=12;break;/测试行GPIO_KEY=0XF0;switch(GPIO_KEY)case(0Xe0):KeyValue=KeyValue;break;case(0Xd0):KeyValue=KeyValue+1;break;case(0Xb0): KeyValue=KeyValue+2;break;case(0X70):KeyValue=KeyValue+3;break;while(a50)&(GPIO_KEY!=0xf0) /检测按键松手检测delay(1000);a+;/* 函数名 :datapros()* 函数功能 :数据处理函数* 输入 : 无* 输出 : 无*/void datapros()uint temp;static uchar i;if(i=50)i=0;temp = Read_AD_Data(0xE4);/ 外部adi+;disp0=smgduantemp/1000;/千位disp1=smgduantemp%1000/100;/百位disp2=smgduantemp%1000%100/10;/个位disp3=smgduantemp%1000%100%10;#includeXPT2046.h/*函数名:TSPI_Start*输 入:无*输 出:无*功 能:初始化触摸SPI*/void SPI_Start(void)CLK = 0;CS = 1;DIN = 1;CLK = 1;CS = 0;/*函数名:SPI_Write*输 入:dat:写入数据*输 出:无*功 能:使用SPI写入数据*/void SPI_Write(uchar dat)uchar i;CLK = 0;for(i=0; i 7; /放置最高位dat = 1;CLK = 0;/上升沿放置数据CLK = 1;/*函数名:SPI_Read*输 入:无*输 出:dat:读取 到的数据*功 能:使用SPI读取数据*/uint SPI_Read(void)uint i, dat=0;CLK = 0;for(i=0; i12; i+)/接收12位数据dat 0; i-); /延时等待转换结果CLK = 1; /发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_nop_();AD_Value=SPI_Read();CS = 1;return AD_Value;#include lcd.h/液晶显示/* 函 数 名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输 入 : c* 输 出 : 无* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。*/void Lcd1602_Delay1ms(uint c) /误差 0us uchar a,b;for (; c0; c-) for (b=199;b0;b-) for(a=1;a0;a-); /* 函 数 名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输 入 : com* 输 出 : 无*/#ifndef LCD1602_4PINS /当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能LCD1602_RS = 0; /选择发送命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com; /放入命令Lcd1602_Delay1ms(1);/等待数据稳定LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#else void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能清零LCD1602_RS = 0; /选择写入命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = com 4; /发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输 入 : dat* 输 出 : 无*/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat)/写入数据LCD1602_E = 0;/使能清零LCD1602_RS = 1;/选择输入数据LCD1602_RW = 0;/选择写入LCD1602_DATAPINS = dat; /写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#elsevoid LcdWriteData(uchar dat)/写入数据LCD1602_E = 0; /使能清零LCD1602_RS = 1; /选择写入数据LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = dat;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat 4; /写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdInit()* 函数功能 : 初始化LCD屏* 输 入 : 无* 输 出 : 无*/ #ifndefLCD1602_4PINSvoid LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#elsevoid LcdInit() /LCD初始化子程序LcdWriteCom(0x32); /将8位总线转为4位总线LcdWriteCom(0x28); /在四位线下的初始化LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#endif#include intrins.htypedef unsigned int uint; /对数据类型进行声明定义typedef unsigned char uchar;/-定义使用的IO口-/sbit SRCLK=P36;sbit RCLK=P35;sbit SER=P34;/定义LED点阵的位选,也就是类似于数码管的位选,因为要对其动态扫描操作/数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平uchar code ledwei=0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, ;uchar code ledduan1=/*- 文字: 普 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,;uchar code ledduan2=/*- 文字: 中 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00,;/* 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*/void delay(uint i)while(i-);/* 函 数 名 : Hc595SendByte(uchar dat1,uchar dat2,uchar dat3,uchar dat4)* 函数功能 : 通过595发送四个字节的数据* 输 入 : dat1:第4个595输出数值* * dat2: 第3个595输出数值* * dat3:第2个595输出数值* * dat4:第1个595输出数值* 输 出 : 无*/void Hc595SendByte(uchar dat1,uchar dat2,uchar dat3,uchar dat4)uchar a;SRCLK = 1;RCLK = 1;for(a=0;a 7; /从最高位开始发送dat1 = 1;SRCLK = 0; /发送时序_nop_();_nop_();SRCLK = 1;for(a=0;a 7; /从最高位开始发送dat2 = 1;SRCLK = 0; /发送时序_nop_();_nop_();SRCLK = 1;for(a=0;a 7; /从最高位开始发送dat3 = 1;SRCLK = 0; /发送时序_nop_();_nop_();SRCLK = 1;for(a=0;a 7; /从最高位开始发送dat4 = 1;SRCLK = 0; /发送时序_nop_();_nop_();SRCLK = 1;RCLK = 0;_nop_();_nop_();RCLK = 1;/* 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*/void main()uchar i;while(1) for(i=0;i16;i+)Hc595SendByte(ledweii+16,ledweii,ledduan116+i,ledduan1i);delay(10);/* 函数名 :UsartInit()* 函数功能 :设置串口* 输入 : 无* 输出 : 无*/void UsartInit()SCON=0X50;/设置为工作方式1TMOD=0X20;/设置计数器工作方式2PCON=0X80;/波特率加倍TH1=0XF3;/计数器初始值设置,注意波特率是4800的TL1=0XF3;ES=1;/打开接收中断EA=1;/打开总中断TR1=1;/打开计数器/* 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*/void main()UsartInit(); /串口初始化while(1);/* 函数名 : Usart() interrupt 4* 函数功能 : 串口通信中断函数* 输入 : 无* 输出 : 无*/void Usart() interrupt 4uchar receiveData;receiveData=SBUF;/出去接收到的数据RI = 0;/清除接收中断标志位SBUF=receiveData;/将接收到的数据放入到发送寄存器while(!TI); /等待发送数据完成TI=0; /清除发送完成标志位头文件#ifndef _TOU_H#define _TOU_H #include #define uchar unsigned charvoid dely(uchar i) while(i-);#endif#include #define uint unsigned int #define uchar unsigned char sfr ADC_CONTR =0XBC;sfr ADC_RES =0XBD;sfr ADC_LOW2 =0XBE;sfr ADC_LOW2 =0XBE;sfr P1ASF =0X9D;#define ADC_POWER 0X80#define ADC_FLAG 0x10#define ADC_START 0X08#define ADC_SPEEDLL 0X00#define ADC_SPEEDL 0X20#define ADC_SPEEDH 0X40#define ADC_SPEEDHH 0X60sbit CS=P20; /LCD12864串行通信片选 sbit SID=P21; /LCD12864串行通信数据口 sbit SCLK=P22; /LCD12864串行通信同步时钟信号 sbit PSB=P25; /LCD12864并/串选择:H并行 L串行 unsigned int temp1,sh1,ge1,n1,m1; unsigned char ad_result_data10; /AD转换高八位 unsigned char ad_result_low210; /AD转换低八位 unsigned char ad_result_total10; /AD转换总十位 unsigned char ad_average_result; /AD转换十次的平均值 unsigned char Ain,Vin; unsigned char b,t,R; char tp=0; unsigned char code ma16=0xb5,0xe7,0xd1,0xb9,0xa1,0xc3; /电压: unsigned char code ma2=.; uchar code disp1=提示: 按1 键进入; uchar code disp2=功能选择界面. ; unsigned char code num0=0xa3,0xb0; unsigned char code num1=0xa3,0xb1; unsigned char code num2=0xa3,0xb2; unsigned char code num3=0xa3,0xb3; unsigned char code num4=0xa3,0xb4; unsigned char code num5=0xa3,0xb5; unsigned char code num6=0xa3,0xb6; unsigned char code num7=0xa3,0xb7; unsigned char code num8=0xa3,0xb8; unsigned char code num9=0xa3,0xb9; /-模块延时程序- 1ms void delay1ms(uint delay1ms) /STC11F60XE,22.1184M,延时1ms uint i,j; for(;delay1ms0;delay1ms-) for(i=0;i7;i+) for(j=0;j0;delay-) for(i=0;i124;i+); for(j=0;j124;j+); /* AD转换程序 */ void AD_initiate() /初始化函数 ES=0; TMOD=0x21; /定时计数器方式控制寄存器,自动重装,16位计数器. SCON=0x50; /串行控制寄存器,方便在串口助手那观察 TH1=0xfa; TL1=0xfa; TR1=1; void ADC_Power_On() /AD转换电 ADC_CONTR|=0x80; delay(5); /必要的延时 void get_ad_result() /取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据 uint i,q=0; for(i=0;i4; /-电压采样程序- void caiyangP10() /测电压 P1M0|=0x01; /设P1_0为开漏模式 如: P1_0= #00000000B P1M1|=0x01; ADC_CONTR=0xe0; /设置P1.0为输入AD转换口 delay(2); get_ad_result(); /取转换数据 Vin=ad_average_result; R=Vin; /*-写控制字到LCD12864-*/ void write_cmd(uchar cmd) uchar i; uchar i_data; i_data=0xf8; /命令控制字:11111000写指令 11111010写数据 11111100读状态 11111110读数据 CS=1; /片选置高,才能进行读写操作 SCLK=0; /*-写命令控制字-*/ for(i=0;i8;i+) /循环八次,每次读取一位数据 SID=(bit)(i_data&0x80); /bit表示取其最高位 SCLK=0; SCLK=1; /正跳变写入指令 i_data=i_data1; /左移一位 /*-*/ /*-写指令高四位-*/ i_data=cmd; i_data=i_data&0xf0; /把低四位置0 for(i=0;i8;i+) /循环八次,每次读取一位数据 SID=(bit)(i_data&0x80); /bit表示取其最高位 SCLK=0; SCLK=1; /正跳变写入指令 i_data=i_data1; /左移一位 /*-*/ /*-写指令低四位-*/ i_data=cmd; i_data=i_data4; /左移四位,把低四位的数据移到高四位,再把低四位置0 for(i=0;i8;i+) /循环八次,每次读取一位数据 SID=(bit)(i_data&0x80); /bit表示取其最高位 SCLK=0; SCLK=1; /正跳变写入指令 i_data=i_data1; /左移一位 /*-*/ CS=0; /把片选置低 delay1ms(5); /延时是因为没有进行忙检测,适当的延时可以不进行忙检测 /*-*/ /*-写数据到LCD12864-*/ void write_dat(uchar dat) uchar i; uchar i_data; i_data=0xfa; CS=1; for(i=0;i8;i+) SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data1; i_data=dat; i_data=i_data&0xf0; for(i=0;i8;i+) SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=

温馨提示

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

最新文档

评论

0/150

提交评论