验证过的STC12C5A60S2单片机AD程序.doc_第1页
验证过的STC12C5A60S2单片机AD程序.doc_第2页
验证过的STC12C5A60S2单片机AD程序.doc_第3页
验证过的STC12C5A60S2单片机AD程序.doc_第4页
验证过的STC12C5A60S2单片机AD程序.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

/* 文件名:AD_CAIYANG.C* 功能:使用AD采集电压显示在LCD* 说明:转自网络,本人验证通过*/#include#define uint unsigned int#define uchar unsigned charsbit 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;/-模块延时程序- 1msvoid delay1ms(uint delay1ms) /STC11F60XE,22.1184M,延时1msuint 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= #00000000BP1M1|=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; /把低四位置0for(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; /左移四位,把低四位的数据移到高四位,再把低四位置0for(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=i_data1;i_data=dat;i_data=i_data4;for(i=0;i8;i+) SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data1;CS=0;delay1ms(5);/*-*/*-显示坐标-*/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) uchar 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);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=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,5V左右的测量比较准确, /两端的最大误差为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(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);di

温馨提示

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

评论

0/150

提交评论