本项目实现数字电压表用LCD12864显示结果,通过本项目的练习,希望大家可以把学到的知识灵活应用到实际的电子产品设计中,活学活用,举一反三,触类旁通。以下总结本项目用到的知识:
一、ADC0809的使用总结
ADC0809时序中,CLK为转换时钟,要一直产生。转换过程为,ADC先在ALE引脚上产生上升沿进行通道地址锁存,将要转换的通道选中;接着在START引脚产生上升沿,启动转换进程;ADC转换开始后,EOC变低,表示正在转换过程中;当EOC变高时,表示转换结束,这时可以将OE引脚拉高,允许数据从AD中输出,最后通过D0~D7读取数据即可。
ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。
二、LCD12864使用方法总结
第一步:初始化,调用lcd_init(),lcd_clr();
第二步:根据具体情况调用相关的函数,
要显示汉字,调用dh(),要用字模转换软件先生存字模。
要显示单个字符,调用ds()。
要显示字符串,调用printchars()。
三、电路图如下:
电路
四、代码如下:
defineuintunsignedint
#include""
sbitST=P3^0;
sbitEOC=P3^2;
sbitOE=P3^1;
sbitCLK=P3^3;
sbitADDA=P3^4;
sbitADDB=P3^5;
sbitADDC=P3^6;
sbitALE=P3^7;
unsignedchardispbuf[]={"0.000V"};
unsignedchargetdata;
unsignedinttemp;
uchari,j;
voidt1(void)interrupt3using0
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
CLK=!CLK;
}
voidTimeInitial()
{
TMOD=0x10;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
EA=1;
ET1=1;
TR1=1;
}
voidmain(void)
{
TimeInitial();
P0=0XFF;
P1=0XFF;
P2=0XFF;
P3=0XFF;
lcd_init();
lcd_clr();
while(1)
{
ALE=0;
ADDA=1;
ADDB=1;
ADDC=1;
ALE=1;
ST=0;
ALE=0;
OE=0;
ST=1;
ST=0;
while(EOC==0){printchars(0,0,dispbuf,0);}
OE=1;
getdata=P0;
OE=0;
temp=getdata*1.0/255*5000;
dispbuf[4]=temp%10+0x30;
dispbuf[3]=temp/10%10+0x30;
dispbuf[2]=temp/100%10+0x30;
dispbuf[0]=temp/1000+0x30;
printchars(0,0,dispbuf,0);
}
}