本帖最后由 Galway-Zhang 于 2010-12-17 08:49 编辑
无法显示AD读到的数据.也不知是否读到数据了.
/****************http://bbs.cepark.com/register.php?fromuid=2975 ********
显示格式(单位V):
H0:4.03 H1:4.03
bbs.cepark.com
/*Writen by kidcao1987 2009-3-7*/
/****************http://bbs.cepark.com/register.php?fromuid=2975 *********/
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit lcd_rs=P2^0;
sbit lcd_rw=P2^1;
sbit lcd_en=P2^2; //液晶控制端
sbit cs=P1^0;
sbit clk=P1^1;
sbit dio=P1^2;//adc0832控制端
uchar temp;
float result;
uchar code name[]=" 13760160570";
void lcd_delay(uint m) //延时函数
{
while(m--);
}
void read1602() //忙检测
{
uchar i;
i=254;
P0=0xff;
lcd_rs=0;
lcd_rw=1;
lcd_en=1;
while((i--)&&(P0&0x80));//若一段时间以后仍低,则认为是不忙
lcd_en=0;
}
void write1602(uchar wdata,bit rw)//向LCD1602写数据(rw=1)或者命令(rw=0)
{
read1602();
P0=wdata;
lcd_rs=rw;
lcd_rw=0;
lcd_en=1;
lcd_delay(1);
lcd_en=0;
}
void lcd_init() //LCD1602液晶的初始化
{
lcd_delay(1500);
write1602(0x38,0);
lcd_delay(500);
write1602(0x38,0);
lcd_delay(500);
write1602(0x38,0);
write1602(0x38,0);
write1602(0x0c,0);
write1602(0x06,0);
write1602(0x01,0); //清屏
}
void lcd_printf(uchar *str)//显示字符串
{
while(*str!='\0')
{
write1602(*str,1); //写入数据
str++;
}
}
void lcd_moveto(uchar x,uchar y)//指定显示的行列坐标
{
if(x==0)
write1602(0x80|y,0);
if(x==1)
write1602(0xc0|y,0);
}
uchar readadc0832(bit ch) //获取数值
{
uchar i,data1=0,data2=0;
clk=0;
dio=1;
cs=0; //cs=0时ADC0832有效
clk=1;
clk=0; //第一个脉冲,开始位
dio=1;
clk=1;
clk=0; //第二个脉冲,模式选择
dio=ch; //通道选择
clk=1;
clk=0; //第三个脉冲,通道选择
dio=1;
for(i=0;i<8;i++) //第一次读数从高到低 ,时钟下降沿有效
{
clk=1;
clk=0;
if(dio)data1|=0x80>>i;
}
for(i=0;i<8;i++) //第二次从低到高读数,下降沿有效
{
if(dio)data2|=0x01<<i;
clk=1;
clk=0;
}
cs=1;
dio=1;
clk=1;
if(data1==data2)return(data1);
}
void main() //测试用MAIN函数
{
lcd_init();
lcd_moveto(1,1);
lcd_printf(name);
while(1)
{
lcd_moveto(0,0); //定位在第一行第一列
lcd_printf("V:");
temp=readadc0832(0); //读取通道0的电压值
result=temp*0.01953125; //得到实际的电压值
temp=(uchar)(result); //取得电压值的整数部分
write1602(temp+48,1); //显示电压值的整数部分
write1602('.',1); //显示小数点
result=(result-temp)*10; //此句用KEIL仿真时.是未被列入执行程序中
temp=(uchar)(result); //获得电压值的小数点后第一位 //此句用KEIL仿真时.是未被列入执行程序中
write1602(temp+48,1);
result=(result-temp)*10; //此句用KEIL仿真时.是未被列入执行程序中
temp=(uchar)(result); //获得电压值的小数点后第二位
write1602(temp+48,1);
lcd_moveto(0,8); //定位在第一行第八列
lcd_printf("I:");
temp=readadc0832(1); //读取通道1的电压值
result=temp*0.01953125; //得到实际的电压值
temp=(uchar)(result); //取得电压值的整数部分
write1602(temp+48,1); //显示电压值的整数部分
write1602('.',1); //显示小数点
result=(result-temp)*10; //此句用KEIL仿真时.是未被列入执行程序中
temp=(uchar)(result); //获得电压值的小数点后第一位
write1602(temp+48,1);
result=(result-temp)*10; //此句用KEIL仿真时.是未被列入执行程序中
temp=(uchar)(result); //获得电压值的小数点后第二位
write1602(temp+48,1);
}
} |