STC12C5A60SAD转换及LCD1602显示_第1页
STC12C5A60SAD转换及LCD1602显示_第2页
STC12C5A60SAD转换及LCD1602显示_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

1、/*我写的51AD转换程序,LED灯显示,随着外部电压升高,亮的小灯数会逐渐增加*/#include/庖含单片机寄存器的头文件#include/包含_nop_()函数定义的头文件/A/D转换结果变量unsignedcharresult;voidmain(void)unsignedlongi;unsignedcharstatus;ADC_CONTR|=0x80;for(i=0;i10000;i+);P1ASF=0x04;ADC_CONTR=0xE2;for(i=0;i10000;i+);/开A/D转换电源,第一次使用时要打开内部模拟电源/适当延时/选择P1.2作为A/D转换通道/适当延时whil

2、e(1)循环进行A/D转换ADC_CONTR|=0x08;/启动A/D转换status=0;while(status=0)/等待A/D转换结束status=ADC_CONTR&0x10;ADC_CONTR&=0xE7;/将ADC_FLAG青0result=ADC_RES;/保存A/D转换结果if(result32)P0=0xff;elseif(result64)P0=0xfe;elseif(result96)P0=0xfc;elseif(result128)P0=0xf8;elseif(result160)P0=0xf0;elseif(result192)P0=0xe0;elseif(resu

3、lt214)P0=0xc0;elseif(result236)P0=0x80;elseP0=0x00;/*/*_*功能【AD转换,液晶显示】*/*_*芯片:STC12C5A60S2*%-*/*_*液晶:【LCD1602*/*_*ADC管月却:【P1.0P1.7】*/*-*检测范围:【0.004.99V】*/*/#includereg52.h”#includeintrins.htypedefunsignedcharuchar;typedefunsignedintuint;#define_Nop()_nop_()/*以下为LCD1602显示模块定义*/unsignedchardata_char_t

4、able=0123456789ABCDEF;/LCD数据unsignedcharLcd_Dis1_table=Position:No.;/第一行显示框架unsignedcharpos_char_table=D;/显示位置unsignedcharLcd_Dis2_table=Voltage:V;/第二行显示框架unsignedcharnum_char_table=9A.CDV;/显示位置sbitlcd_rs_port=P2A7;sbitlcd_rw_port=P2A6;sbitlcd_en_port=P2A4;#definelcd_data_portP0voidlcd_delay(ucharms

5、);voidlcd_busy_wait();voidlcd_command_write(uintcommand);voidlcd_system_reset();voidlcd_char_write(uintx_pos,y_pos,lcd_dat);voidlcd_bad_check();voidNum_to_Disp(uchari,uintNum);voidLcdDisp(ucharj,uintnum);/定义LCD控制端口,根据硬件调整/LCD1602延时/LCD1602忙等待/LCD1602命令字写入/LCD1602初始化/LCD1602字符写入/LCD1602坏点检查/显示数据处理/液晶

6、显示函数/*以下为ADC相应寄存器初始化及端口定义*/*定义与ADC相关的特殊功能寄存器*/sfrADC_CONTR:=0xBCsfrADC_RES=0xBD;sfrADC_RESL=0xBE;sfrP1ASF=0x9D;/ADC控制寄存器/ADChight8-bitresultregister/ADClow2-bitresultregister/P1口功能控制寄存器P1ASF/*定义相应操作位*/#defineADC_POWER0x80/ADC电源控制位,0:关闭,1:打开#defineADC_FLAG0x10/ADC结束标志位#defineADC_START0x08/ADC启动控制位#de

7、fineADC_SPEEDLL0x00/540clocks选择转换速度/*以下为相关函数声明*/voidInitADC();/ADC初始化uintGetADCResult(ucharch);voidDelay(uintn);/延时程序voiddelay_1ms(ucharx);/*主函数*/voidmain()uchari;/LCD1602初始化/LCD1602坏点检查/初始化ADC特殊功能寄存器lcd_system_reset();lcd_bad_check();InitADC();while(1)i=0;while(i7)LcdDisp(i,GetADCResult(i);/液晶1602显

8、示输入电压值P1.0-P1.7Delay(1000);i+;/*ADC取值*/uintGetADCResult(ucharch)ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;_nop_();/Mustwaitbeforeinquiry_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FLAG);/WaitcompleteflagADC_CONTR&=ADC_FLAG;/CloseADC/ReturnADCresultreturn(ADC_RES*4+ADC_RESL);/*初始化ADC特殊功能寄存器*/voi

9、dInitADC()P1ASF=P1|0x3f;/SetP1.0-P1.5asanaloginputportADC_RES=0;/ClearpreviousresultADC_RESL=0;ADC_CONTR=ADC_POWER|ADC_SPEEDLL;Delay(20);/ADCpower-ondelayandStartA/Dconversion/*LCD1602相应函数*/以下为LCD显示数据处理/voidNum_to_Disp(uchari,uintNum)floatNUM;intxx,yy,zz;NUM=(Num*5/1024.0);/计算公式:10-bitA/DConversionR

10、esult=1024x(Vin/Vcc)xx=(int)NUM;yy=(int)(NUM-(float)(xx)*10);zz=(int)(NUM-(float)(xx)*100)%10;/电压值十位/电压值个位/电压值小数点后一位/电压值小数点后两位?/当前ADC接口num_char_table9=data_char_tablexx/10;num_char_table10=data_char_tablexx%10;num_char_table12=data_char_tableyy;num_char_table13=data_char_tablezz;pos_char_table13=dat

11、a_char_tablei;/以下为LCD显示/voidLcdDisp(ucharj,uintnum)uinti=0;for(i=0;i16;i+)lcd_char_write(i,0,Lcd_Dis1_tablei);lcd_char_write(i,1,Lcd_Dis2_tablei);/显示框架Num_to_Disp(j,num);lcd_char_write(13,0,pos_char_table13);for(i=9;i14;i+)lcd_char_write(i,1,num_char_tablei);/显示电压delay_1ms(100);/以下是LCD1602驱动程序/voidl

12、cd_delay(ucharms)/*LCD1602延时*/ucharj;while(ms-)for(j=0;j250;j+);voidlcd_busy_wait()/*LCD1602忙等待*/lcd_rs_port=0;lcd_rw_port=1;lcd_en_port=1;lcd_data_port=0xff;while(lcd_data_port&0x80);lcd_en_port=0;voidlcd_command_write(uintcommand)/*LCD1602命令字写入*/lcd_busy_wait();lcd_rs_port=0;lcd_rw_port=0;lcd_en_p

13、ort=0;lcd_data_port=command;lcd_en_port=1;lcd_en_port=0;voidlcd_system_reset()/*LCD1602初始化*/lcd_delay(20);lcd_command_write(0x38);lcd_delay(100);lcd_command_write(0x38);lcd_delay(50);lcd_command_write(0x38);lcd_delay(10);lcd_command_write(0x08);lcd_command_write(0x01);lcd_command_write(0x06);lcd_com

14、mand_write(0x0c);字符写入*/voidlcd_char_write(uintx_pos,y_pos,lcd_dat)/*LCD1602x_pos&=0x0f;/*X位置范围015*/y_pos&=0x01;/*Y位置范围01*/if(y_pos=1)x_pos+=0x40;x_pos+=0x80;lcd_command_write(x_pos);lcd_busy_wait();lcd_rs_port=1;lcd_rw_port=0;lcd_en_port=0;lcd_data_port=lcd_dat;lcd_en_port=1;lcd_en_port=0;voidlcd_bad_check()/*LCD1602坏点检查*/chari,j;for(i=0;i2;i+)for(j=0;j16;j+)lcd_char_write(j,i,0xff);lcd_delay(200);lcd_delay(200);

温馨提示

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

评论

0/150

提交评论