找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2989|回复: 3
打印 上一主题 下一主题
收起左侧

用51和TLC2543AD 做电压表,12864作显示

[复制链接]
跳转到指定楼层
楼主
ID:120628 发表于 2016-9-4 18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用51和TLC2543AD 做电压表,12864作显示,当TLC2543一上电那显示就乱跳,不知道怎么搞的?



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:105206 发表于 2016-9-5 12:37 | 只看该作者
你把程序贴出来看了才知道。
回复

使用道具 举报

板凳
ID:123289 发表于 2016-9-5 13:10 | 只看该作者
上电后先做硬件处理,其中优先关闭LCD显示即可。
原因:在LCD屏未受控时,无法预估其显示形式,所以需要尽快使之受控(在人眼未察晓之前)。
当然也可能是其它原因。
回复

使用道具 举报

地板
ID:120628 发表于 2016-9-5 23:09 | 只看该作者
jubaolun 发表于 2016-9-5 12:37
你把程序贴出来看了才知道。

#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) //显示函数
                {
                        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); // 显示开,关光标 delay_ms(5);
                write_com(0x01); // 清除LCD的显示内容 delay_ms(5);

}
unsigned int  A_D(unsigned char CH_i)           //CH_i,通道值
{
  unsigned int AD_Val;         //储存12位的A/D转换结果
   unsigned char i;
   AD_Val=0;
   CS=1;   //一个转换周期开始
   EOC=0;
   CLK=0;      //为第一个脉冲作准备
   _nop_();
   _nop_();         
   CS=0;      //CS置0,片选有效
   EOC=1;     //EOC开始应设为高电平
   CH_i<<=4;  //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置
   CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位

for(i=0;i<8;i++)         //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果
        {
          AD_Val>>=1;   //将读取结果逐位右移(先输出的是低位)   
          CLK=0;
          _nop_();
      if((CH_i&0x80)==0x80)       
            SDI=1;            
          else
            SDI=0;
           CH_i<<=1;        //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543
       CLK=1;       
       _nop_();
          if(SDO==1)                    //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
           {
              AD_Val|=0x800;         
           }
          else
           {
             AD_Val|=0x000;
           }
        }
   SDI=0;        //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高
   for(i=8;i<12;i++)          //读取转换值的第8至第11位
   {
      AD_Val>>=1;
          CLK=0;                      
           _nop_();
      CLK=1;      
           _nop_();
          if(SDO==1)  
           {
            AD_Val|=0x800;        //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
           }
          else
           {
            AD_Val|=0x000;         //第12位写 ‘0’
           }
        }
   CLK=0;         //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
   _nop_();         //给硬件一点转换时间
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   CS=1;      // 停止转换,高电平无效
   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;//显示小数点
        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测试


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

}
}
这是和谐别人的,帮忙看下,我测了一下通道0与地,发现有1~2V的电压,然后我并一只10k的电阻,然发现不乱跳了显示为0000,但是有模糊重影,但测量是还是乱跳
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表