Proteus数模转换范例(ADC0808+LCD1602)

任务:读取外部0~5V的电压变化,将之输出到LCD显示

 

1。建立如下原理图

 

2.生成代码

 

 

//*************************************************** //main.c //latest revise:2010-009-20 //by:alex shoal //email:[email protected] #include #include #include"global.h" #include "ADC0808.h" #include "ks0066.h" // for lcd 1602 main(){ //float res=0; int res=0; float vol=0.0; char pr[8]; lcd_init(); while(1) { res=read_data(); vol=5.0*res/255; sprintf(pr,"%.2f",vol); //sprintf(pr,"%d",res); //LCD_clear(); LCD_home(); print_string("Read:"); print_string(pr); print_string("V ");} } //******************************************************** //ADC0808.H //#include"global.h" sbit START= P2^3; sbit ALE= P2^4; sbit EOC= P2^5; sbit OE= P2^6; void conv_start(void); void conv_check(void); int read_data(void); //-------------------------------------------- // start ADC convert //-------------------------------------------- void conv_start(){ ALE=1; START=1; delay_ms(1); //当晶振较高时加延时 ALE=0; START=0; // delay_ms(5); //当晶振较高时加延时 } int read_data(){ int i=0; //delay_ms(5); //while(!EOC); //IF EOC==0,means busy OE=1; conv_start(); while(!EOC); //delay_ms(5); i=P3; OE=0; return i; } //*******************************************************] //filename:glocal.h //latest revise:2010-07-01 //by:alex shoal //email:[email protected] #define uchar unsigned char #define uint unsigned int void delay_ms(int t){ int j; for( ;t!=0; t--) for (j=0;j<255;j++); } //******************************************************** //filename:ks0066.H //latest revise:2010-07-01 //by:alex shoal //email:[email protected] //#include"global.h" #define DATA_PORT P1 //------------------------------------------- // 管脚定义 //------------------------------------------ sbit RS=P2^0; //数据(L)/命令(H)选择 sbit LCDRW=P2^1; //写,低电平有效 sbit EN=P2^2; //使能,低电平有效 //=========================================== // 函数声明 //------------------------------------------- void delay_lcd(char); void write_data(char); void write_com(char); void LCD_clear(void); void LCD_home(void); void lcd_init(); void print_string(char*); //-------------------------------------------- // 写数据函数 //-------------------------------------------- void write_data(char dat){ RS=1; //数据 LCDRW=0; //写 DATA_PORT=dat; //把数据送到P口 delay_ms(5); //当晶振较高时加延时 EN=1; delay_ms(5); //当晶振较高时加延时 EN=0; //关使能 } //-------------------------------------------- // 写命令函数 //-------------------------------------------- void write_com(char com){ RS=0; //命令 LCDRW=0; //写 DATA_PORT=com; delay_ms(5); //当晶振较高时加延时 EN=1; delay_ms(5); //当晶振较高时加延时 EN=0; } void LCD_clear(void){ write_com(0x01); } void LCD_home(void){ write_com(0x02); } //-------------------------------------------- // 1602初始化函数 //-------------------------------------------- void lcd_init(){ LCDRW=0; RS=0; write_com(0x36); //set text home address //write_com(0x0f); //display switch,display on,cursor on,blink on. write_com(0x0c); //display on,cursor off,blink off write_com(0x38); write_com(0x06); //input set. write_com(0x01); //screen clear write_com(0x80); //DDRAM AD set to 00h, } void print_string(char* str){ int i; for(i=0;str[i]!=0;i++) { write_data(str[i]); } } //********************************************************

 

3.运行

 

4。注意点。

ADC0808的OUT1和OUT8上前者实际是高位,后者是低位。所以和P口连接应颠倒一下,否则显示的数据会很乱,看上去没规则。

本人开始的时候一度认为是程序里面有问题,浪费了不少时间。

  其实datasheet也有说明,只是不容易引起注意。见如下。

	LSB(Least Significant Bit),意为最低有效位;
	MSB(Most Significant Bit),意为最高有效位

你可能感兴趣的:(电子技术)