收藏 分享(赏)

51单片机常用模板.doc

上传人:精品资料 文档编号:10810082 上传时间:2020-01-10 格式:DOC 页数:25 大小:34.75KB
下载 相关 举报
51单片机常用模板.doc_第1页
第1页 / 共25页
51单片机常用模板.doc_第2页
第2页 / 共25页
51单片机常用模板.doc_第3页
第3页 / 共25页
51单片机常用模板.doc_第4页
第4页 / 共25页
51单片机常用模板.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、拓跋公司名称 | 公司地址模板文档副标题目录* 函数功能 : 延时函数,i=1 时,大约延时 10us 3* 函数功能 :数码管显示函数 .3* 函数功能 : 设置外部中断 14* 函数功能 : 向 74HC595 发送一个字节的数据 .4* 函数功能 : 检测有按键按下并读取键值 .5* 函数功能 :数据处理函数 .6*功 能:初始化触摸 SPI7*功 能:使用 SPI 读取数据 .8*功 能:读取触摸数据 8#include “lcd.h“/液晶显示 9* 函数功能 : 向 LCD 写入一个字节的命令 .10* 函数功能 : 向 LCD 写入一个字节的数据 .11* 函数功能 : 初始化

2、LCD 屏 .12* 函数功能 : 通过 595 发送四个字节的数据 .14* 函数功能 :设置串口 .16* 函 数 名 : delay* 函数功能 : 延时函数,i=1 时,大约延时 10us*/void delay(uint i)while(i-);/* 函数名 :DigDisplay()* 函数功能 :数码管显示函数* 输入 : 无* 输出 : 无*/void DigDisplay()uchar i;for(i=0;i7;dat 7; /放置最高位dat 0; i-); /延时等待转换结果CLK = 1; /发送一个时钟周期,清除 BUSY_nop_();_nop_();CLK = 0

3、;_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) /误差 0usuchar a,b;for (; c0; c-)for (b=199;b0;b-)for(a=1;a0;a-); /* 函 数 名 : LcdWrit

4、eCom* 函数功能 : 向 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); /保持时间LCD160

5、2_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 7; /从最高位开始发送dat1 7; /从最高位开始发送dat2 7

6、; /从最高位开始发送dat3 7; /从最高位开始发送dat4 #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

7、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_res

8、ult_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=“.“; ucha

9、r 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

10、; 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;i0;delay-) for(i=0;i4; /-电压采样程序- void caiyangP10() /测电压 P1M0|=0x01; /设 P1_0 为

11、开漏模式 如: 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; /片选置高,才能进行读写操作

12、SCLK=0; /*-写命令控制字 -*/ for(i=0;i8;i+) /循环八次,每次 读取一位数据 SID=(bit)(i_data /bit 表示取其最高位 SCLK=0; SCLK=1; /正跳变写入指令 i_data=i_data1; /左移一位 /*-*/ /*-写指令高四位 -*/ i_data=cmd; i_data=i_data /把低四位置 0 for(i=0;i8;i+) /循环八次,每次 读取一位数据 SID=(bit)(i_data /bit 表示取其最高位 SCLK=0; SCLK=1; /正跳变写入指令 i_data=i_data1; /左移一位 /*-*/ /

13、*-写指令低四位 -*/ i_data=cmd; i_data=i_data4; /左移四位,把低四位的数据移到高四位,再把低四位置 0 for(i=0;i8;i+) /循环八次,每次 读取一位数据 SID=(bit)(i_data /bit 表示取其最高位 SCLK=0; SCLK=1; /正跳变写入指令 i_data=i_data1; /左移一位 /*-*/ CS=0; /把片选置低 delay1ms(5); /延时是因为没有进行忙检测,适当的延 时可以不进行忙检测 /*-*/ /*-写数据到 LCD12864-*/ void write_dat(uchar dat) uchar i; u

14、char i_data; i_data=0xfa; CS=1; for(i=0;i8;i+) SID=(bit)(i_data SCLK=0; SCLK=1; i_data=i_data1; i_data=dat; i_data=i_data for(i=0;i8;i+) SID=(bit)(i_data SCLK=0; SCLK=1; i_data=i_data1; i_data=dat; i_data=i_data4; for(i=0;i8;i+) SID=(bit)(i_data SCLK=0; SCLK=1; i_data=i_data1; CS=0; delay1ms(5); /*-

15、*/ /*-显示坐标-*/ void lcd_pos(uchar x,uchar y) /汉字显示坐标,x 为哪一行,y 为哪一列 uchar pos; if(x=0) x=0x80; /第一行 else if(x=1) x=0x90; /第二行 else if(x=2) x=0x88; /第三行 else if(x=3) x=0x98; /第四行 pos=x+y; /显示哪一行(总共有 4 行) 哪一竖(总共有 8 竖,每 16 列为 1 竖) write_cmd(pos); /*-*/ /*-显示 8 个汉字-*/ void disp_hanzi(uchar code *chn) ucha

16、r i; write_cmd(0x30); /基本指令操作方式 for(i=0;i16;i+) /16 列*8 个汉字=128(刚好) write_dat(chni); /*-*/ /*-显示数字-*/ void disp_num(uchar code *chn) uchar i; write_cmd(0x30); /基本指令操作方式 for(i=0;i2;i+) /1 个数字 write_dat(chni); void disp_number(uchar num) switch(num) case 0: disp_num(num0);break; case 1: disp_num(num1)

17、;break; case 2: disp_num(num2);break; case 3: disp_num(num3);break; case 4: disp_num(num4);break; case 5: disp_num(num5);break; case 6: disp_num(num6);break; case 7: disp_num(num7);break; case 8: disp_num(num8);break; case 9: disp_num(num9);break; default: break; /*- -LCD 初始化-*/ void lcd_init() PSB=

18、0; write_cmd(0x30); /基本指令 write_cmd(0x02); /地址归位 write_cmd(0x06); /游标右移 write_cmd(0x0c); /整体显示 write_cmd(0x01); /清屏 /*-*/ void displayP10() float ad1; /unsigned int temp1,sh1,ge1,n1,m1; /uchar code dis2=0x01,0x02,0x00; /ad1=x*7.8125; /电压修正 uchar i; ad1=Vin*3.9608; /具体线性参数由输入电压值调整,该值的测量范围为 0-10.00V,5

19、V 左右的测量比较准确, /两端的最大误差为 70mv,其他一般在 40mv 以内 temp1=(int)ad1; sh1=temp1/1000; /十位 ge1=(temp1%1000)/100; /个位 n1=(temp1%1000)%100)/10; /小数点后一位 m1=(temp1%1000)%100)%10; /小数点后二位 /write_cmd(0x01); write_cmd(0x30); /基本指令操作方式 lcd_pos(0,0); for(i=0;i6;i+) write_dat(ma1i); lcd_pos(0,3); disp_number(sh1); lcd_pos

20、(0,4); disp_number(ge1); lcd_pos(0,5); for(i=0;i2;i+) write_dat(ma2i); lcd_pos(0,6); disp_number(n1); lcd_pos(0,7); disp_number(m1); /*lcd_pos(2,0); disp_hanzi(disp1); lcd_pos(3,0); disp_hanzi(disp2);*/ void main() EA=1; AD_initiate(); /初始化 ADC_Power_On(); /开 AD 电源 /init(); lcd_init(); delay(10); while(1) caiyangP10(); /测电压 send_ad_result(); /Vin=Vin*4007; displayP10(); delay(10);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报