初级会员 
  
	- 积分
 - 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); 
                 
        } 
} |   
 
 
 
 |