打印

ADC0832+LCD1602做电压表.为何只显示0000

[复制链接]
2957|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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);
        }
}

相关帖子

沙发
kubuco| | 2010-12-17 09:01 | 只看该作者
别仿真了 直接上板

使用特权

评论回复
板凳
huangqi412| | 2010-12-17 09:10 | 只看该作者
一个个环节找   AD--->转换---》显示

使用特权

评论回复
地板
laoliang3064| | 2010-12-17 09:11 | 只看该作者
做这个试验,几十块钱搞定了。

使用特权

评论回复
5
Galway-Zhang|  楼主 | 2010-12-19 01:06 | 只看该作者
2# kubuco

郁闷..这就是相当于上板呀..这省了做PCB的时间.懂吗?

而且实验其他程序都OK.....兄弟呀...用这个比焊个PCB经快多了..直接画好就OK.

如果用万能板不小心搭错了..还折腾半天..

使用特权

评论回复
6
Galway-Zhang|  楼主 | 2010-12-19 01:07 | 只看该作者
4# laoliang3064

做这个实验..可以说不花钱..也达到效果..不要老以为只能用PCB..做事情要讲效率的.

使用特权

评论回复
7
mcu5i51| | 2010-12-19 08:16 | 只看该作者
result=temp*0.01953125;                        //得到实际的电压值
这里会不会等于零

使用特权

评论回复
8
xmchendaying| | 2013-3-9 17:28 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:LED电源,移动电源,充电器开发,PCBlayout, 电池研发设备开发,动力电池保护板 电池测试仪 QQ:551708558 E-mail:dy188@qq.com 淘宝:http://diy-power.taobao.com

0

主题

267

帖子

2

粉丝