初级会员
- 积分
- 160
- 金钱
- 160
- 注册时间
- 2016-4-2
- 在线时间
- 33 小时
|
楼主 |
发表于 2016-5-2 15:30:24
|
显示全部楼层
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint LCD[6]; //电压数据转换成LCD1602液晶字符显示
uint Volt;
//***********TLC549管脚配置*********//
//sbit DO = P1^0; //时钟
//sbit CS = P1^1; //片选
//sbit CLK = P1^2; //数据输出
//*********************************//
sbit RS = P2^0; //1602液晶数据/命令选择端
sbit RW = P2^1; //1602液晶读写端
sbit E = P2^2; //1602液晶使能端
sbit X1 = P2^3;
sbit X2 = P2^4;
sbit X3 = P2^5;
sbit CS=P1^2; //片选引脚
sbit CLK=P1^3; //时钟脉冲引脚
sbit SDO=P1^0; //数据输出引脚
sbit SDI=P1^1; //数据输入引脚
sbit EOC=P1^4; //转换结束引脚
//*********ADC0809管脚配置************//
//sbit ALE = P1^3; //地址锁存允许信号
//sbit CLK = P1^4; //时钟脉冲输入端
//sbit ST = P1^5; //A/D转换启动信号
//sbit EOC = P1^6; //A/D转换结束信号
//sbit OE = P1^7; //数据输出允许信号
//sbit ADD_A = P1^0; //地址选择输入端
//sbit ADD_B = P1^1;
//sbit ADD_C = P1^2;
//************************************//
// Function Prototypes
void check_busy(void);
void write_command(uchar com);
void write_date(uchar date);
void LCD_init(void);
void string(uchar ad ,uchar *s);
//void lcd_test(void);
void delay(uint);
void Volt_To_LCD1602(void);
void delay_ms(uint xms);
void Data_Conversion(void);
//uchar TLC549_ADC(void);
/*******************************************
LCD1602 Driver mapped as IO peripheral
*******************************************/
// Delay
// Delay
void delay(uint j)
{
uchar m = 60;
for(; j>0; j--)
{
while(--m);
m = 59;
while(--m);
m = 60;
}
}
// Test the Busy bit
void check_busy(void)
{
do
{
P0 = 0xff;
E = 0;
RS = 0;
RW = 1;
E = 1;
_nop_();
} while(P0 & 0x80);
E = 0;
}
// Write a command
void write_command(uchar com)
{
check_busy();
E = 0;
RS = 0;
RW = 0;
P0 = com;
E = 1;
_nop_();
E = 0;
delay(1);
}
// Write Data
void write_date(uchar date)
{
check_busy();
E = 0;
RS = 1;
RW = 0;
P0 = date;
E = 1;
_nop_();
E = 0;
delay(1);
}
// Initialize LCD controller
void LCD_init(void)
{
write_command(0x38); // 8-bits, 2 lines, 7x5 dots
write_command(0x0C); // no cursor, no blink, enable display
write_command(0x06); // auto-increment on
write_command(0x01); // clear screen
delay(1);
}
// Display a string
void string(uchar ad, uchar *s)
{
write_command(ad);
while(*s>0)
{
write_date(*s++);
delay(100);
}
}
//****************************************************//
//函数名:delay_ms(uint xms)
//函数功能:ms级延时函数
//***************************************************//
void delay_ms(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/*
void ADC0808_Init()
{
ST=0;
OE=0;
}
*/
//***************************************************//
//函数名称:ADC0808_ADC()
//函数功能:读取一次A/D转换的数据
//***************************************************//
/*
void ADC0808_ADC()
{
ST=0;
ST=1;
ST=0;
//OE=0;
while(EOC==0); //自动发送
OE=1;
}
*/
//***************************************************//
//函数名称:TLC549_ADC()
//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换
//**************************************************//
/*
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 |= DO;
CLK = 1; //0.4us
_nop_(); //CLK transition time Max 0.1us
CLK = 0; //0.4us
}
CS = 1; //CS置高,片选无效
for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us
return (tmp);
}
*/
//****************************************//
//函数功能:将模拟信号转换为数字信号
//函数名称:TLC2543_ADC()
//输入参数:uchar CH_i
//输出参数:uint类型
//****************************************//
unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值
{
unsigned int AD_Val = 0;
unsigned char i;
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;
}
//****************************************//
//函数名称ata_Conversion()
//函数功能:电压换算
//*****************************************//
void Data_Conversion(void)
{
uint ad_val;
unsigned char o,p,k,l;
ad_val = TLC2543_ADC(4);
o=ad_val/1000; //取千位数字
p=(ad_val%1000)/100; //取百位数字
k=(ad_val%100)/10; //取十位数字
l=ad_val%10; //取个位数字
write_command(0x80+0x40);
write_date(0x30+o);
write_date(0x30+p);
write_date(0x30+k);
write_date(0x30+l);
//delay_ms(1000);
if((X3==0)&&(X2==0)) //0-5V
{
//ADD_A = 0;
//ADD_B = 1;
//ADD_C = 0;
Volt = 5.0 / 4096 * ad_val*1000; //(100-500)
LCD[0] = Volt/1000; //千位
LCD[1] = Volt/100%10; //百位
LCD[2] = Volt/10%10; //十位
LCD[3] = '.'; //小数点
LCD[4] = Volt%10; //个位
LCD[5] = 'V'; //字符V
write_command(0x80+8);
write_date(0x30+LCD[0]);
write_date(0x30+LCD[1]);
write_date(0x30+LCD[2]);
write_date(LCD[3]);
write_date(0x30+LCD[4]);
write_date(LCD[5]);
}
if((X3==1)&&(X2==0)) //5-50V
{
//ADD_A = 1;
//ADD_B = 0;
//ADD_C = 0;
Volt = 5.0/4096*ad_val*1000; //(50-500)
LCD[0] = Volt/1000; //千位
LCD[1] = Volt/100%10; //百位
LCD[2] = Volt/10%10; //十位
LCD[3] = '.'; //小数点
LCD[4] = Volt%10; //个位
LCD[5] = 'V'; //字符V
write_command(0x80+8);
write_date(0x30+LCD[0]);
write_date(0x30+LCD[1]);
write_date(0x30+LCD[2]);
write_date(LCD[3]);
write_date(0x30+LCD[4]);
write_date(LCD[5]);
}
if((X3==1)&&(X2==1)) //50V-500V
{
//ADD_A = 0;
//ADD_B = 0;
//ADD_C = 0;
Volt = 5.0/4096*ad_val*1000; //(500-5000)
LCD[0] = Volt/1000; //千位
LCD[1] = Volt/100%10; //百位
LCD[2] = Volt/10%10; //十位
LCD[3] = '.'; //小数点
LCD[4] = Volt%10; //个位
LCD[5] = 'V'; //字符V
write_command(0x80+8);
write_date(0x30+LCD[0]);
write_date(0x30+LCD[1]);
write_date(0x30+LCD[2]);
write_date(LCD[3]);
write_date(0x30+LCD[4]);
write_date(LCD[5]);
}
}
void Volt_To_LCD1602(void)
{
Data_Conversion(); //电压换算并放大1000倍
}
int main()
{
//uint m;
LCD_init();
//ADC0808_Init();
//ADC0808_ADC();
delay_ms(100);
write_command(0x01);
write_command(0x80);
string(0x80,"Voltage:");
//delay_ms(2000);
while(1)
{
delay_ms(50);
Volt_To_LCD1602();
//delay_ms(4000);
}
} |
|