51单片机:利用TLC549测量电压,并将测量值显示在LCD上
之前有段时间做单片机课设,同学在做电压比较器,找我帮忙写个要求,利用TLC549测量电压,并将测量值显示在LCD上,想到之前自己写过TLC549测量电压,并将测量值显示在数码管上,还没用过LCD,便试着写了一下(LCD我学的不好)。
代码实现:
#include<reg52.h>
#include<intrins.h>
#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)