找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3510|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

用51和TLC2543AD 做電壓表,12864作顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:120628 發(fā)表于 2016-9-4 18:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用51和TLC2543AD 做電壓表,12864作顯示,當(dāng)TLC2543一上電那顯示就亂跳,不知道怎么搞的?



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:105206 發(fā)表于 2016-9-5 12:37 | 只看該作者
你把程序貼出來(lái)看了才知道。
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2016-9-5 13:10 | 只看該作者
上電后先做硬件處理,其中優(yōu)先關(guān)閉LCD顯示即可。
原因:在LCD屏未受控時(shí),無(wú)法預(yù)估其顯示形式,所以需要盡快使之受控(在人眼未察曉之前)。
當(dāng)然也可能是其它原因。
回復(fù)

使用道具 舉報(bào)

地板
ID:120628 發(fā)表于 2016-9-5 23:09 | 只看該作者
jubaolun 發(fā)表于 2016-9-5 12:37
你把程序貼出來(lái)看了才知道。

#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_data P0
uchar table[5];
//uint sda=8000;


//sbit eoc=P1^1;//EOC
//sbit clk=P1^2;//clock
//sbit sdi=P1^3;//data input
//sbit sdo=P1^4;//data  ouput
//sbit cs=P1^5;//cs
//sbit lcd_rs=P2^6;
//sbit lcd_rw=P2^5;
//sbit lcd_en=P2^7;
//sbit lcd_psb=P3^2;
//sbit lcd_rst=P3^4;


sbit CS=P1^2;
sbit CLK=P1^3;
sbit SDO=P1^0;
sbit SDI=P1^1;
sbit EOC=P1^4;
//sbit eoc=P3^3;//EOC
//sbit clk=P3^4;//clock
//sbit sdi=P3^5;//data input
//sbit sdo=P3^6;//data  ouput
//sbit cs=P3^7;//cs
sbit lcd_rs=P2^7;
sbit lcd_rw=P2^6;
sbit lcd_en=P2^5;
sbit lcd_psb=P2^4;
sbit lcd_rst=P2^3;
void delay_ms(uchar t)
{
                uint j,k;
                for(k=t;k>0;k--)
                for(j=110;j>0;j--);
}
void write_com(uchar com)
{
                lcd_rs=0;
                lcd_rw=0;
                lcd_en=0;
                P0=com;
                delay_ms(5);
                lcd_en=1;
                delay_ms(5);
                lcd_en=0;
}

void write_dat(uchar date)
{
                lcd_rs=1;
                lcd_rw=0;
                lcd_en=0;
                P0=date;
                delay_ms(5);
                lcd_en=1;
                delay_ms(5);
                lcd_en=0;
}

void clear()
{
                write_com(0x01);
                delay_ms(2);
}

void lcd_pos(uchar X,uchar Y)
{
                uchar pos;
                if(X==0)
                                {X=0x80;}
                else if(X==1)
                                {X=0x90;}
                else if(X==2)
                                {X=0x88;}
                else if(X==3)
                                {X=0x98;}
                pos=X+Y;
                write_com(pos);
}

void display1(uchar x,uchar y,uchar *disp)
{
                lcd_pos(x,y);
                while(*disp) //顯示函數(shù)
                {
                        write_dat(*disp);
                        disp=disp+1;
                        delay_ms(1);
                }
}

void lcd_init()
{
                lcd_psb=1;
                lcd_rst=0;
                delay_ms(5);
                lcd_rst=1;
                delay_ms(5);
                write_com(0x30); // 基本操作指令 delay_ms(5);
                write_com(0x0c); // 顯示開,關(guān)光標(biāo) delay_ms(5);
                write_com(0x01); // 清除LCD的顯示內(nèi)容 delay_ms(5);

}
unsigned int  A_D(unsigned char CH_i)           //CH_i,通道值
{
  unsigned int AD_Val;         //儲(chǔ)存12位的A/D轉(zhuǎn)換結(jié)果
   unsigned char i;
   AD_Val=0;
   CS=1;   //一個(gè)轉(zhuǎn)換周期開始
   EOC=0;
   CLK=0;      //為第一個(gè)脈沖作準(zhǔn)備
   _nop_();
   _nop_();         
   CS=0;      //CS置0,片選有效
   EOC=1;     //EOC開始應(yīng)設(shè)為高電平
   CH_i<<=4;  //將通道值(D7,D6,D5,D4)移入高四位,轉(zhuǎn)換通道設(shè)置
   CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,輸出數(shù)據(jù)為12位,先輸出低位

for(i=0;i<8;i++)         //將A/D轉(zhuǎn)換方式控制字寫入TLC2543,并讀取低8位轉(zhuǎn)換結(jié)果
        {
          AD_Val>>=1;   //將讀取結(jié)果逐位右移(先輸出的是低位)   
          CLK=0;
          _nop_();
      if((CH_i&0x80)==0x80)       
            SDI=1;            
          else
            SDI=0;
           CH_i<<=1;        //在脈沖上升沿,從高位至低位依次將控制字寫入TLC2543
       CLK=1;       
       _nop_();
          if(SDO==1)                    //在脈沖下降沿,TLC2543輸出數(shù)據(jù),寫入AD_Val的第12位
           {
              AD_Val|=0x800;         
           }
          else
           {
             AD_Val|=0x000;
           }
        }
   SDI=0;        //8個(gè)數(shù)據(jù)流輸入后,SDI端必須保持在一個(gè)固定的電平上,指引EOC變高
   for(i=8;i<12;i++)          //讀取轉(zhuǎn)換值的第8至第11位
   {
      AD_Val>>=1;
          CLK=0;                      
           _nop_();
      CLK=1;      
           _nop_();
          if(SDO==1)  
           {
            AD_Val|=0x800;        //在脈沖下降沿,TLC2543輸出數(shù)據(jù),寫入AD_Val的第12位
           }
          else
           {
            AD_Val|=0x000;         //第12位寫 ‘0’
           }
        }
   CLK=0;         //在第12個(gè)時(shí)鐘下降沿來(lái)臨時(shí),EOC開始變低,開始對(duì)本次采樣的模擬量進(jìn)行A/D轉(zhuǎn)換,
   _nop_();         //給硬件一點(diǎn)轉(zhuǎn)換時(shí)間
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   CS=1;      // 停止轉(zhuǎn)換,高電平無(wú)效
   EOC=0;  
   return AD_Val;
  
  }


void display(uchar x,uchar y,uint temp)
{       
         uchar i=0;
        temp=temp*5000.0/4096;
        table[0]=temp/1000;
        table[1]=-2;//顯示小數(shù)點(diǎn)
        table[2]=temp%1000/100;
        table[3]=temp%1000%100/10;
        table[4]=temp%1000%100%10;
        lcd_pos(x,y);
                for(i=0;i<5;i++)
                {
                                write_dat('0'+table);
                        delay_ms(5);
                }
}

void main()

{
                double AD2=0;
                lcd_init();
                clear();
           //read();
                display1(0,0,"電壓值");
                ;
while(1)
{

        AD2=A_D(0x00);//通道0測(cè)試


display(0,5,AD2);
delay_ms(10);

}
}
這是和諧別人的,幫忙看下,我測(cè)了一下通道0與地,發(fā)現(xiàn)有1~2V的電壓,然后我并一只10k的電阻,然發(fā)現(xiàn)不亂跳了顯示為0000,但是有模糊重影,但測(cè)量是還是亂跳
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表