打印
[程序源码]

大神帮忙看看,这个程序哪错了!!!

[复制链接]
1241|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qaz411140525|  楼主 | 2014-11-9 23:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************************************

* 实 验 名                 : AD显示试验
* 实验说明       : 使用LCD1602显示AD读取到的各个数值
         :
*******************************************************************************/

#include<reg51.h>
#include"i2c.h"
#include"lcd.h"

//--定义PCF8591的读写地址--//
#define  WRITEADDR 0x90           //写地址
#define  READADDR  0x91           //读地址

//--声明全局函数--//
void Pcf8591SendByte(unsigned char channel);
unsigned char Pcf8591ReadByte();
void Pcf8591DaConversion(unsigned char value);

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void main()
{
        unsigned int adNum[5];
        float value0;
        LcdInit();
        while(1)
        {       
                //--显示电位器电压--//
                Pcf8591SendByte(0);             //发送电位器转换命令

                //--由于8591在第一次读取的时候是读取到的上次转换的结果--//
                //--所以我们先读一次,只是读到的数据不做处理--(crazybc.com)//
                adNum[0]=        Pcf8591ReadByte()*2;//将前一次转换结果读走

                //--在读走上一次转换结果之后,才开始启动下一次转换,需要一点时间--//
                //--为了不浪费单片机的资源,让单片机空着,我们直接发送给我们下次--//
                //--要读取的命令,做一些数据处理和显示当做延时--//
                LcdWriteCom(0x80+0x46);                              //发送显示坐标
                LcdWriteData('0'+adNum[3]/1000);          //发送显示数据
                LcdWriteData('0'+adNum[3]%1000/100);
                LcdWriteData('0'+adNum[3]%100/10);
                LcdWriteData('0'+adNum[3]%10);
                Pcf8591SendByte(1);             //发送热敏转换命令
                adNum[0]=        Pcf8591ReadByte()*2;//读取电位器转换结果

                //--读取走了,上一次转换结果就是电位器的转换结果之后,热敏的转换开始--//
                //--我们继续做一些处理当延时。--//
                //--我们8591每读取到一个1就表示5/256V,所以要知道电压值就乘以0.01953--//
                value0=adNum[0]/2*0.01953;  //转为电压值
                adNum[0]=value0*100;        //保留两位小数
                LcdWriteCom(0x80);
                LcdWriteData('0'+adNum[0]%1000/100);
                LcdWriteData('.');
                LcdWriteData('0'+adNum[0]%100/10);
                LcdWriteData('0'+adNum[0]%10);
                LcdWriteData('V');

                Pcf8591SendByte(2);               //发送光敏转换命令
                adNum[1]=Pcf8591ReadByte()*2; //ADC1读取热敏

                //--一下读取的方式跟上面一样处理--//
                //--读光敏--//
                LcdWriteCom(0x86);
                LcdWriteData('0'+adNum[1]/1000);       
                LcdWriteData('0'+adNum[1]%1000/100);
                LcdWriteData('0'+adNum[1]%100/10);
                LcdWriteData('0'+adNum[1]%10);
               
                Pcf8591SendByte(3);                   //发送外部输入电压转换命令
                adNum[2]=Pcf8591ReadByte()*2;  //ADC2读取光敏

                //--读取外部输入电压--//
                LcdWriteCom(0x80+0x40);
                LcdWriteData('0');
                LcdWriteData('0'+adNum[2]/1000);       
                LcdWriteData('0'+adNum[2]%1000/100);
                LcdWriteData('0'+adNum[2]%100/10);
                LcdWriteData('0'+adNum[2]%10);
                adNum[3]=Pcf8591ReadByte()*2;  //ADC3读取外部输入电压

                //--DA输出--//
                adNum[4]=adNum[0];
                Pcf8591DaConversion(adNum[4]/2); //DAC          数模转换
               
                                                                               
        }
                                 
}
/*******************************************************************************
* 函 数 名         : Pcf8591SendByte
* 函数功能                   : 写入一个控制命令
* 输    入         : channel(转换通道)
* 输    出         : 无
*******************************************************************************/

void Pcf8591SendByte(unsigned char channel)
{       
        I2C_Start();
        I2C_SendByte(WRITEADDR, 1);    //发送写器件地址
        I2C_SendByte(0x40|channel, 0); //发送控制寄存器
        I2C_Stop();
}
/*******************************************************************************
* 函 数 名         : Pcf8591ReadByte
* 函数功能                   : 读取一个转换值
* 输    入         : 无
* 输    出         : dat
*******************************************************************************/

unsigned char Pcf8591ReadByte()
{
        unsigned char dat;
        I2C_Start();
        I2C_SendByte(READADDR, 1);//发送读器件地址
        dat=I2C_ReadByte();    //读取数据
        I2C_Stop();            //结束总线
    return dat;
}
/*******************************************************************************
* 函 数 名         : Pcf8591DaConversion
* 函数功能                   : PCF8591的输出端输出模拟量
* 输    入         : value(转换的数值)
* 输    出         : 无
*******************************************************************************/

void Pcf8591DaConversion(unsigned char value)
{
        I2C_Start();
        I2C_SendByte(WRITEADDR, 1);//发送写器件地址
        I2C_SendByte(value, 0);    //发送转换数值
        I2C_Stop();       
}

相关帖子

沙发
qqljhang| | 2014-11-10 20:26 | 只看该作者
报什么错?

使用特权

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

本版积分规则

5

主题

11

帖子

0

粉丝