LCD1602输入值与仿真的值不一样,程序如下,求各位大神帮忙

2019-07-15 17:34发布


#include<reg51.h>
#include"lcd.h"
// #include"temp.h"
        uint read2543(int port);
sbit _CS=P1^6;
sbit CLOCK=P1^3;
sbit D_IN=P1^4;
sbit D_OUT=P1^5;
//sbit EOC=P1^7;
  int ad;
   unsigned int port;
   //unsigned int a=8;
//  bit0 =ad_data^8;
// unsigned int B;
//sbit bit7=B^7;

void LcdDisplay(int);
/*******************************************************************************
* 函数名         : main
* 函数功能                   : 主函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void main()
{
        LcdInit();                         //初始化LCD1602
        LcdWriteCom(0x88);        //写地址 80表示初始地址
        LcdWriteData('C');
        while(1)
        {
                 
        //        read2543(0);
                ad=11010101;//这个值与仿真得出的值不一样
                 
                LcdDisplay(ad);
//                Delay1ms(1000);//1s钟刷一次
        }
}

/*******************************************************************************
* 函数名         : LcdDisplay()
* 函数功能                   : LCD显示读取到的温度
* 输入           : v
* 输出                  : 无
*******************************************************************************/

void LcdDisplay(int ad)          //lcd显示
{

          unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
        float tp;  
        if(ad< 0)                                //当温度值为负数
        {
                  LcdWriteCom(0x80);                //写地址 80表示初始地址            LcdWriteData('-');                  //显示负
                //因为读取的温度是实际温度的补码,所以减1,再取反求出原码        ad=ad-1;                ad=~ad;
                tp=ad;
                         //ad=tp*100+0.5;
                ad=(tp*5*100)/4095+0.5;        //TLC2543转换公式
                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
                //算由?.5,还是在小数点后面。

          }
        else
          {                       
                  LcdWriteCom(0x80);                //写地址 80表示初始地址
            LcdWriteData('+');                 //显示正
                tp=ad;//因为数据处理有小数点所以将温度赋给一个浮点型变量
                //如果温度是正的那么,那么正数的原码就是补码它本身
                //ad=tp*0.0625*100+0.5;
                ad=(tp*100*5)/4095+0.5;       
                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
                //算加上0.5,还是在小数点后面。
        }
        datas[0] = ad / 10000;
        datas[1] = ad % 10000 / 1000;
        datas[2] = ad % 1000 / 100;
        datas[3] = ad % 100 / 10;
        datas[4] = ad % 10;

        LcdWriteCom(0x82);                  //写地址 80表示初始地址
        LcdWriteData('0'+datas[0]); //百位

       
        LcdWriteCom(0x83);                 //写地址 80表示初始地址
        LcdWriteData('0'+datas[1]); //十位

        LcdWriteCom(0x84);                //写地址 80表示初始地址
        LcdWriteData('0'+datas[2]); //个位

        LcdWriteCom(0x85);                //写地址 80表示初始地址
        LcdWriteData('.');                 //显示 ‘.’

        LcdWriteCom(0x86);                 //写地址 80表示初始地址
        LcdWriteData('0'+datas[3]); //显示小数点  

        LcdWriteCom(0x87);                 //写地址 80表示初始地址
        LcdWriteData('0'+datas[4]); //显示小数点  
}
        uint read2543(int port)//file://从/TLC2543读取采样值,?
//file://形/参port是采样的通道号
{
int data ad;
uint data i;
uchar data al=0,ah=0;
CLOCK=0;
_CS=0;
//EOC=1;
for(i=0;i<8;i++) //file:前8个CLOCK?
{
D_IN=(bit)(port&0x80);
if(i<4)
{
if (D_OUT)ah =0x01;
ah<<=1;
}
else
{
if(D_OUT) al =0x01;
al<<=1;
}
port<<=1;
CLOCK=0;CLOCK=1;
}
for(i=0;i<4;i++)//file://填/充4个CLOCK?
{
if(D_OUT)al=0x01;
al<<=1;
CLOCK=0;CLOCK=1;
}
_CS=1;
ad=(uint)ah;ad<<=8;ad=al;//file://得/到AD值?
return(ad);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
武力戡乱
1楼-- · 2019-07-15 19:24
仿真?什么仿真?
半天云
2楼-- · 2019-07-16 00:55
武力戡乱 发表于 2015-4-8 23:02
仿真?什么仿真?

proteus的仿真。
武力戡乱
3楼-- · 2019-07-16 04:06
 精彩回答 2  元偷偷看……
半天云
4楼-- · 2019-07-16 08:14
武力戡乱 发表于 2015-4-9 13:23
哦,你看我就是proteus板块版主。上传你的仿真文件和编译文件吧。我看看。仿真可以的,实际的一定可以的 ...

只能仿真出十进制数,二进制的仿真出现的跟设定值不一样

程序.rar 下载积分: 积分 -1 分

45.35 KB, 下载次数: 6, 下载积分: 积分 -1 分

仿真.rar 下载积分: 积分 -1 分

38.82 KB, 下载次数: 4, 下载积分: 积分 -1 分

武力戡乱
5楼-- · 2019-07-16 13:15
        datas[0] = ad / 10000;
        datas[1] = ad % 10000 / 1000;
        datas[2] = ad % 1000 / 100;
        datas[3] = ad % 100 / 10;
        datas[4] = ad % 10;

        datas[0] = ad / 10000%10;
        datas[1] = ad / 1000%10 ;
        datas[2] = ad /100 %10;
        datas[3] = ad /10%10;
        datas[4] = ad %10;
第一:你仔细看看!这什么情况!
第二:ad=tp*5*100/4095+0.5;这个转换是0-5V。我给定一个4000,差不多
123.gif
半天云
6楼-- · 2019-07-16 16:58
武力戡乱 发表于 2015-4-9 21:34
datas[0] = ad / 10000;
        datas[1] = ad % 10000 / 1000;
        datas[2] = ad % 1000 / 100;

但是二进制数仿真出来跟理论值不符啊。

一周热门 更多>