简单的数字电压表
桂林电子科技大学 梁宇彤
这是本人比较早之前的做的课程设计,在这里放出来和大家分享一下:
通过以AT89S52芯片为基础以LCD1602作为显示屏设计的数字电压表。主要是使用8051连接A/D转换器ADC0804,并从ADC0804输入0V到5V的类比电压,然后把输入的类比电压值在LCM上显示出来.
ADC0804的引脚说明:
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
(1)CS:芯片选择,低电位动作。
(2)RD:读取转换的数字数据,低电位动作。
(3)WR:要求ADC0804执行转换,低电位动作。
(4)CLKIN CLKR:AD转换时的始终脉冲。
(5)INTR:转换完成时,此引脚会变成低电位,所以将此引脚接到微处理器的中断引脚输入。
(6)+IN和-IN:类比电压输入
(7)DB0-DB7:转换数据的输出。
(8)Vref/2:类比电压输入最高值的一半,如果输入最高的类比电压是Vcc,这一支引脚可以空接。
(9)Vref:类比电压输入最高值
使用ADC0804时必须有工作时钟,工作时钟可以直接在CLKIN与CLKR两支引脚外接RC电路产生频率。当ADC0804在CLKIN和CLKR两支引脚外接RC电路产生频率时,其转换时间大约为1/1.1RC;所以当ADC0804电阻10K、电容 200pf时,其转换频率大约是:1/(1.1x10kx200pf)=454kHz
转换时间约为1.1x10kx200pf=2.2us。
ADC0804电压输入与数字输出关系如表所示:
十六进制 |
二进制码 | 与满刻度的比率 | 相对电应值VREF=2.560伏 | ||
高四位字节 | 低四位字节 | 高四位字节电压 | 低四位字节电压 | ||
F | 1111 | 15/16 | 15/256 | 4.800 | 0.300 |
E | 1110 | 14/16 | 14/256 | 4.480 | 0.280 |
D | 1101 | 13/16 | 13/256 | 4.160 | 0.260 |
C | 1100 | 12/16 | 12/256 | 3.840 | 0.240 |
B | 1011 | 11/16 | 11/256 | 3.520 | 0.220 |
A | 1010 | 10/16 | 10/256 | 3.200 | 0.200 |
9 | 1001 | 9/16 | 9/256 | 2.880 | 0.180 |
8 | 1000 | 8/16 | 8/256 | 2.560 | 0.160 |
7 | 0111 | 7/16 | 7/256 | 2.240 | 0.140 |
6 | 0110 | 6/16 | 6/256 | 1.920 | 0.120 |
5 | 0101 | 5/16 | 5/256 | 1.600 | 0.100 |
4 | 0100 | 4/16 | 4/256 | 1.280 | 0.080 |
3 | 0011 | 3/16 | 3/256 | 0.960 | 0.060 |
2 | 0010 | 2/16 | 2/256 | 0.640 | 0.040 |
1 | 0001 | 1/16 | 1/256 | 0.320 | 0.020 |
0 | 0000 |
|
| 0 | 0 |
LCD1602
功能介绍:
2.3 LCD1602
功能介绍:
LCD1602C是一款常用的液晶,可以显示2行16个字符,有8位数据总线D0- D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节(VO:LCD对比度调节端,电压调节范围为0-5V。接正电源时对比度最弱,接地电源时对比度最高,通常使用一个10K的电位器来调整对比度,或者直接串接一个1K的电阻到地)。
管脚 | 名称 | 引脚说明 | 管脚 | 名称 | 引脚说明 |
1 | GND | 电源地 | 9 | DB2 | 双向数据口 |
2 | VDD | 电源正极 | 10 | DB3 | 双向数据口 |
3 | V0 | 对比度调节 | 11 | DB4 | 双向数据口 |
4 | RS | 数据/命令选择 | 12 | DB5 | 双向数据口 |
5 | RW | 读/写选择 | 13 | DB6 | 双向数据口 |
6 | E | 模块使能端 | 14 | DB7 | 双向数据口 |
7 | DB0 | 双向数据口 | 15 | BLA | 背光正极 |
8 | DB1 | 双向数据口 | 16 | BLK | 背光负极 |
电路图及原理说明:
程序描述:数字电压表*/
/* **************************************************** */
#include
#define TIMER0_COUNT 0xDC11 /* 10000h-(11,059,200/(12*
FREQ))-17 */
/* LCD command */
#define DISPLAY_ON 56
#define CURSOR_OFF 12
#define CURSOR_RIGHT 6
#define CLEAR 1
#define CURSOR_HOME 2
#define GOTO_LINE_2 192
#define GOTO_LINE_1 128
/* LCD control lines */
#define ENABLE 1
#define DISABLE 0
#define READ 1
#define WRITE 0
#define COMMAND 0
#define DATA 1
#define rs P3_5
#define rw P3_4
#define enable P3_3
#define adc_in P0
#define adc_rd P2_0
#define adc_wr P2_1
static unsigned timer0_tick;
const char int2char[]="0123456789";
void delay_2ms(void) { /* 时间延迟函数 */
unsigned char i,j; /* 延迟2 ms */
for (i=0;i<3;i++)
for(j=0;j<255;j++)
;
}
void write_LCD_command(unsigned command)
{
rw=WRITE;
rs=COMMAND;
enable=ENABLE;
P1=command;
enable=DISABLE;
rs=1;
rw=1;
delay_2ms();
}
void write_LCD_data(unsigned LCDdata)
{
rw=WRITE;
rs=DATA;
enable=ENABLE;
P1=LCDdata;
enable=DISABLE;
rs=0;
rw=1;
delay_2ms();
}
void set_LCD(void)
{
write_LCD_command(DISPLAY_ON);
write_LCD_command(CURSOR_OFF);
write_LCD_command(CURSOR_RIGHT);
}
void clear_LCD()
{
write_LCD_command(CLEAR);
write_LCD_command(CURSOR_HOME);
}
display_LCD_string(char *p)
{
while(*p)
{
write_LCD_data(*p);
p++;
}
}
void gotoxy(unsigned x,unsigned y)
{
if(x==1)
write_LCD_command(GOTO_LINE_1+y);
else
write_LCD_command(GOTO_LINE_2+y);
}
void display_LCD_number(unsigned char number)
{
unsigned char x,y,i=2;
int z;
z=(int) number;
z=z<<1;
x=z/10;
y=z-x*10;
gotoxy(2,3);
write_LCD_data(int2char[y]);
z=x;
x=z/10;
y=z-x*10;
gotoxy(2,2);
write_LCD_data(int2char[y]);
gotoxy(2,1);
display_LCD_string(".");
z=x;
x=z/10;
y=z-x*10;
gotoxy(2,0);
write_LCD_data(int2char[y]);
gotoxy(2,4);
display_LCD_string("Volt");
}
static void timer0_isr(void) interrupt 1 using 1
{
TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
timer0_tick++;
if (timer0_tick==200) {
adc_wr=0;
timer0_tick=0;
adc_wr=1;
}
}
static void int0_isr(void) interrupt 0 using 0
{
unsigned char voltage;
adc_in=0xFF;
adc_rd=0;
voltage=adc_in;
voltage=voltage <<1;
adc_rd=1;
gotoxy(2,0);
display_LCD_number(voltage);
}
static void timer0_initialize(void)
{
EA=0;
timer0_tick=0;
TR0=0;
TMOD &= 0XF0;
TMOD |=0x01;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
PT0=0;
ET0=1;
TR0=1;
EA=1;
}
void main (void) {
set_LCD();
clear_LCD();
display_LCD_string("Input voltage=");
timer0_initialize();
IT0=1;
EX0=1;
while(1); /* 无穷循环 */
}
用户1589396 2009-2-8 11:59
wang1jin 2007-4-22 19:27
顶一下.HE HE...
做的不错.