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-16 18:28
半天云 发表于 2015-4-9 21:57
但是二进制数仿真出来跟理论值不符啊。

ad=11010101;??
这叫二进制?
呵呵。在想想。
半天云
2楼-- · 2019-07-16 21:44
 精彩回答 2  元偷偷看……
武力戡乱
3楼-- · 2019-07-16 22:00
半天云 发表于 2015-4-10 22:22
仿真加入直流电压还是出不来值。。。。还请你帮我看看哪不对了

哥们这下载东西要积分了!我要慎重啊!我还想申请书和板子呢!要不你加我qq吧

一周热门 更多>