51单片机:利用TLC549测量电压,并将测量值显示在LCD上

51单片机:利用TLC549测量电压,并将测量值显示在LCD上

之前有段时间做单片机课设,同学在做电压比较器,找我帮忙写个要求,利用TLC549测量电压,并将测量值显示在LCD上,想到之前自己写过TLC549测量电压,并将测量值显示在数码管上,还没用过LCD,便试着写了一下(LCD我学的不好)。

代码实现:

#include
#include

#define uchar unsigned char 
#define uint unsigned int 

void delay(uchar ms);    //延时函数
void wr_com(unsigned char com);    //写入指令数据到LCD
void wr_dat(unsigned char dat);    //写入字符显示数据到LCD
void xianshi(uchar dizhi, uchar suzi);   //单独写数到液晶函数 ( 地址  数据 )
uchar TLC549_ADC(void);   //TLC549模数转换
void uart_init();         //串口初始化函数

sbit rs = P2^0;
sbit rw = P2^1;
sbit e = P2^2;

sbit DI  = P1^0;
sbit CS  = P1^1;
sbit CLK = P1^2;

uchar ad_0;
uint AD;


//-------------------------------------
//	            主函数 
//-------------------------------------
void main()
{
	uart_init();
	wr_com(0x01);    //显示清屏
	wr_com(0x38);   //显示模式设置
    wr_com(0x0c);     //光标设置
	while(1)
	 {
	  delay(100);
	  ad_0=TLC549_ADC();
	  AD=ad_0*1.97;
	  xianshi(0x80+2,'v');
	  xianshi(0x80+3,'=');
	  xianshi(0x80+5,0x30+AD%1000/100);
	  xianshi(0x80+6,'.');
	  xianshi(0x80+7,0x30+AD%100/10);
	  xianshi(0x80+8,0x30+AD%10);
	  xianshi(0x80+9,'V');
	}
}

//----------------------------------
//               延时子程序
//----------------------------------
void delay(uchar ms)    
{       
	 uchar i ;
	 while(ms--)
	 {
	  	for(i = 0 ; i<250;i++) ;
	 }
}

 //-------------------------------------
 //         写入指令数据到LCD
 //-------------------------------------
void wr_com(unsigned char com)   
{       
      
 	rs = 0 ;
  	rw = 0 ;
  	e = 0 ;
  	P0 = com ;
	delay(1);
  	e = 1 ;
	delay(1);
  	e = 0 ; 
}		
	   
//-------------------------------------------------
//             写入字符显示数据到LCD
//--------------------------------------------------
void wr_dat(unsigned char dat)
{      
      
 	rs = 1 ;
  	rw = 0 ;
  	e = 0 ;
  	P0 = dat ;
    delay(1);
  	e = 1 ;
	delay(1);
  	e = 0 ; 
}

//------------------------------------------------------
//     单独写数到液晶函数 ( 地址  数据 )
//------------------------------------------------------
void xianshi(uchar dizhi, uchar suzi)
{ 
     wr_com(dizhi);
	 wr_dat(suzi);
}

//-----------------------------------------
//            TLC549模数转换
//-----------------------------------------
uchar TLC549_ADC(void)
{
	   uchar n, tmp;

        CS  = 1;                     //CS置高,片选无效
        CLK = 0;

        CS  = 0;                     //CS置低,片选有效,同时DO输出高位
        _nop_();
        _nop_();                     //适当延迟时间1.4us Setup Time

        for(n = 0; n < 8; n++) //串行数据移位输入
        { 
                tmp <<= 1;
                tmp |=  DI;

                CLK = 1;        //0.4us
                _nop_();        //延迟0.1us
                CLK = 0;        //0.4us
        }
        CS = 1;            //CS置高,片选无效
        for(n = 17; n != 0; n--) _nop_();  //下一次转换需要延迟17us
        return (tmp);

}
//------------------------------------------
//      	串口初始化函数 
//------------------------------------------
void uart_init()
{
	TMOD=0x20;		//9600bps
	SCON=0x50;
	TH1=0xFD;
	TL1=0xFD;
	TR1=1;
	EA=1;
}

仿真结果:

(结果有点误差,大概为0.02v)
51单片机:利用TLC549测量电压,并将测量值显示在LCD上_第1张图片
51单片机:利用TLC549测量电压,并将测量值显示在LCD上_第2张图片
51单片机:利用TLC549测量电压,并将测量值显示在LCD上_第3张图片

你可能感兴趣的:(51单片机)