STC12C5A60SAD转换及LCD1602显示.docx
《STC12C5A60SAD转换及LCD1602显示.docx》由会员分享,可在线阅读,更多相关《STC12C5A60SAD转换及LCD1602显示.docx(9页珍藏版)》请在冰豆网上搜索。
STC12C5A60SAD转换及LCD1602显示
STC12C5A60SAD转换及LCD1602显示
/*我写的51AD转换程序,LED灯显示,随着外部电压升高,亮的小灯数会逐渐增加*/
#include//包含单片机寄存器的头文件
#include//包含_nop_()函数定义的头文件
unsignedcharresult;//A/D转换结果变量
voidmain(void)
{
unsignedlongi;
unsignedcharstatus;
ADC_CONTR|=0x80;//开A/D转换电源,第一次使用时要打开内部模拟电源
for(i=0;i<10000;i++);//适当延时
P1ASF=0x04;//选择P1.2作为A/D转换通道
ADC_CONTR=0xE2;
for(i=0;i<10000;i++);//适当延时
while
(1)//循环进行A/D转换
{
ADC_CONTR|=0x08;//启动A/D转换
status=0;
while(status==0)//等待A/D转换结束
{
status=ADC_CONTR&0x10;
}
ADC_CONTR&=0xE7;//将ADC_FLAG清0
result=ADC_RES;//保存A/D转换结果
if(result<32)
P0=0xff;
elseif(result<64)
P0=0xfe;
elseif(result<96)
P0=0xfc;
elseif(result<128)
P0=0xf8;
elseif(result<160)
P0=0xf0;
elseif(result<192)
P0=0xe0;
elseif(result<214)
P0=0xc0;
elseif(result<236)
P0=0x80;
else
P0=0x00;
}
}
/*---------------------------------------------------------------------------------------------------------------------------*/
/*--************************功能【AD转换,液晶显示】**************************--*/
/*--************************芯片:
【STC12C5A60S2】******************************--*/
/*--************************液晶:
【LCD1602】***********************************--*/
/*--************************ADC管脚:
【P1.0~P1.7】***************************--*/
/*--************************检测范围:
【0.00~4.99V】***************************--*/
/*---------------------------------------------------------------------------------------------------------------------------*/
#include"reg52.h"
#include"intrins.h"
typedefunsignedcharuchar;
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_portP0
voidlcd_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-bitresultregister
sfrADC_RESL=0xBE;//ADClow2-bitresultregister
sfrP1ASF=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(i<7)
{
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));//Waitcompleteflag
ADC_CONTR&=ADC_FLAG;//CloseADC
return(ADC_RES*4+ADC_RESL);//ReturnADCresult
}
/*----------------------------初始化ADC特殊功能寄存器-------------------*/
voidInitADC()
{
P1ASF=P1|0x3f;//SetP1.0-P1.5asanaloginputport
ADC_RES=0;//Clearpreviousresult
ADC_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;i<16;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;i<14;i++)
{
lcd_char_write(i,1,num_char_table[i]);//显示电压
}
delay_1ms(100);
}
//////////////以下是LCD1602驱动程序////////////////
voidlcd_delay(ucharms)/*LCD1602延时*/
{
ucharj;
while(ms--){
for(j=0;j<250;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;i<2;i++){
for(j=0;j<16;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驱动程序////////////////
/*-----------------------------延时程序---------------------------*/
voidDelay(uintn)
{
uintx;
while(n--)
{
x=500;
while(x--);
}
}
/*1MS为单位的延时程序*/
voiddelay_1ms(ucharx)
{
ucharj;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}