STC12C5A60SAD转换及LCD1602显示.docx

上传人:b****6 文档编号:7584374 上传时间:2023-01-25 格式:DOCX 页数:9 大小:16.95KB
下载 相关 举报
STC12C5A60SAD转换及LCD1602显示.docx_第1页
第1页 / 共9页
STC12C5A60SAD转换及LCD1602显示.docx_第2页
第2页 / 共9页
STC12C5A60SAD转换及LCD1602显示.docx_第3页
第3页 / 共9页
STC12C5A60SAD转换及LCD1602显示.docx_第4页
第4页 / 共9页
STC12C5A60SAD转换及LCD1602显示.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

STC12C5A60SAD转换及LCD1602显示.docx

《STC12C5A60SAD转换及LCD1602显示.docx》由会员分享,可在线阅读,更多相关《STC12C5A60SAD转换及LCD1602显示.docx(9页珍藏版)》请在冰豆网上搜索。

STC12C5A60SAD转换及LCD1602显示.docx

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++)

{;}

}

}

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

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1