STC12C5A60S2自带10位AD测量电压值LCD1602显示(C程序)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/*---------------------------------------------------------------------------------------------------------------------------*//*--************************功能【AD转换,液晶显示】**************************--*//*--************************芯片:【STC12C5A60S2】******************************--*//*--************************液晶:【LCD1602】***********************************--*//*--************************ADC管脚:【P1.0~P1.7】***************************--*//*--************************检测范围:【0.00~4.99V】***************************--*//*---------------------------------------------------------------------------------------------------------------------------*/#includereg52.h#includeintrins.htypedefunsignedcharuchar;typedefunsignedintuint;#define_Nop()_nop_()/*------------------------以下为LCD1602显示模块定义-----------------------*/unsignedchardata_char_table[]={0123456789ABCDEF};//LCD数据unsignedcharLcd_Dis1_table[]={Position:No.};//第一行显示框架unsignedcharpos_char_table[]={D};//显示位置unsignedcharLcd_Dis2_table[]={Voltage:V};//第二行显示框架unsignedcharnum_char_table[]={9A.CDV};//显示位置sbitlcd_rs_port=P2^7;//定义LCD控制端口,根据硬件调整sbitlcd_rw_port=P2^6;sbitlcd_en_port=P2^4;#definelcd_data_portP0voidlcd_delay(ucharms);//LCD1602延时voidlcd_busy_wait();//LCD1602忙等待voidlcd_command_write(uintcommand);//LCD1602命令字写入voidlcd_system_reset();//LCD1602初始化voidlcd_char_write(uintx_pos,y_pos,lcd_dat);//LCD1602字符写入voidlcd_bad_check();//LCD1602坏点检查voidNum_to_Disp(uchari,uintNum);//显示数据处理voidLcdDisp(ucharj,uintnum);//液晶显示函数/*------------------------以下为ADC相应寄存器初始化及端口定义-------------*//*****定义与ADC相关的特殊功能寄存器*****/sfrADC_CONTR=0xBC;//ADC控制寄存器sfrADC_RES=0xBD;//ADChight8-bitresultregistersfrADC_RESL=0xBE;//ADClow2-bitresultregistersfrP1ASF=0x9D;//P1口功能控制寄存器P1ASF/************定义相应操作位***************/#defineADC_POWER0x80//ADC电源控制位,0:关闭,1:打开#defineADC_FLAG0x10//ADC结束标志位#defineADC_START0x08//ADC启动控制位#defineADC_SPEEDLL0x00//540clocks___________选择转换速度/*------------------------以下为相关函数声明------------------------------*/voidInitADC();//ADC初始化uintGetADCResult(ucharch);voidDelay(uintn);//延时程序voiddelay_1ms(ucharx);/*--------------------------------主函数--------------------------------*/voidmain(){uchari;lcd_system_reset();//LCD1602初始化lcd_bad_check();//LCD1602坏点检查InitADC();//初始化ADC特殊功能寄存器while(1){i=0;while(i7){LcdDisp(i,GetADCResult(i));//液晶1602显示输入电压值(P1.0-P1.7)Delay(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;//CloseADCreturn(ADC_RES*4+ADC_RESL);//ReturnADCresult}/*----------------------------初始化ADC特殊功能寄存器-------------------*/voidInitADC(){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/DConversionResult=1024x(Vin/Vcc)xx=(int)NUM;yy=(int)((NUM-(float)(xx))*10);zz=(int)((NUM-(float)(xx))*100)%10;num_char_table[9]=data_char_table[xx/10];//电压值十位num_char_table[10]=data_char_table[xx%10];//电压值个位num_char_table[12]=data_char_table[yy];//电压值小数点后一位num_char_table[13]=data_char_table[zz];//电压值小数点后两位?pos_char_table[13]=data_char_table[i];//当前ADC接口}//////////////////以下为LCD显示////////////////////voidLcdDisp(ucharj,uintnum){uinti=0;for(i=0;i16;i++){lcd_char_write(i,0,Lcd_Dis1_table[i]);lcd_char_write(i,1,Lcd_Dis2_table[i]);//显示框架}Num_to_Disp(j,num);lcd_char_write(13,0,pos_char_table[13]);for(i=9;i14;i++){lcd_char_write(i,1,num_char_table[i]);//显示电压}delay_1ms(100);}//////////////以下是LCD1602驱动程序////////////////voidlcd_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_port=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_command_write(0x0c);}voidlcd_char_write(uintx_pos,y_pos,lcd_dat)/*LCD1602字符写入*/{x_pos&=0x0f;/*X位置范围0~15*/y_pos&=0x01;/*Y位置范围0~1*/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);lcd_delay(200);lcd_delay(100);lcd_delay(200);lcd_command_write(0x01);/*clearlcddisp*/}//////////////////以上是LCD1602驱动程序/////////////////*------------

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功