⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 digital-v-lcd-ok-11-17.c

📁 基于AT89C51的数字电压表
💻 C
字号:

//Editor: zhangmin
//Version: V1.0
//Description: LCD1602显示数字电压表,精度:0.01V 
//Date:2008.11.17
//CPU:10%
/**********************************************************
                   头文件定义 
**********************************************************/

#include<at89x51.h>

#include<intrins.h>

/**********************************************************
                   自变量定义 
**********************************************************/
#define uchar unsigned char
#define uint unsigned int
//#define INTERVAL 20  //定义采样周期 
sbit RS=P3^4;  //LCD数据/指令选择端 
sbit RW=P3^3;  //LCD读写选择端 
sbit E=P3^2;  //LCD使能信号,从低到高有效 
sbit busyFlag=P2^7;  //LCD读忙标志位 
sbit dataIn=P1^1;   //TLC2543控制字输入端 
sbit dataOut=P1^0;  //TLC2543数据输出 
sbit CS=P1^2;       //TLC2543片选端 
sbit CLK=P1^3;      //TLC2543时钟信号输入端 
//bit ADFlag; //是否进行采样标志 
/**********************************************************
函数名称: delay
函数描述: 延时ms (11.0592MHz) 
入口参数: uint i 
**********************************************************/

void delay(uint i) 
{ 
 uchar a;
 while(i--)
 {
   for(a=0;a<250;a++)
     {
      _nop_();_nop_();_nop_();_nop_();
          }
 }    
}
/**********************************************************
函数名称: delayAD
函数描述: AD转换时间延时us (11.0592MHz) 
入口参数: uint i 
**********************************************************/
void delayAD(uint i)
{
  while(--i);   
  } 

/**********************************************************
函数名称: adConvert 
函数描述: TLC2543驱动程序 
入口参数: 转换地址 
返回值:   转换结果 uint ad
**********************************************************/
uint adConvert(uchar port) 
{
  uint ad=0;
  uchar i;
  CS=0;
  CLK=0;
  port<<=4;
  for(i=0;i<12;i++)
   {
    if(dataOut)
      ad|=0x01;
    dataIn=(bit)(port&0x80);
    CLK=1;    //时钟上升沿,读入一个字符 
    delayAD(3);  //采样时间 
    CLK=0;    //下降沿,输出一个字符 
    delayAD(3);  //转换时间 
    port<<=1;  //移出下一个字符 
    ad<<=1;    //移出下一位空间 
      }
   CS=1;
   ad>>=1;
   return (ad);   
}


/**********************************************************
函数名称: dataConvert 
函数描述: AD转换数据处理,精度0.01 
入口参数: uint adRusult 
**********************************************************/
/*uint dataConvert(uint adResult)
{
  uint data;
  uchar hundredBit,tenBit,oneBit;
  data=adResult*1.0/4096*500; //设置精度为0.01,AD参考电压为5V 
  oneBit=data%10;            //个位数 
  tenBit=(data/10)%10;       //十位数 
  hundredBit=(data/100)%10;  // 百位数 
     }
     
     
//以下是LCD1602驱动程序 
  
/**********************************************************
函数名称: testBusy 
函数描述: LCD检测是否忙碌函数
入口参数: 无
**********************************************************/


uchar testBusy(void)
{  
  bit flag;
  P2=0xff;
  RS=0;         //选择指令端 
  RW=1;         //选择读取 
  E=1;          //使能端由低到高有效  
  if (busyFlag==1) flag=1;
    else flag=0;
   E=0;
  return flag; 
     } 	 	
   

/**********************************************************
函数名称: writeCommand 
函数描述: LCD写入指令函数
入口参数: 指令参数command 
**********************************************************/
     
void writeCommand(uchar command)
{  while(testBusy());
  
   RS=0;   //选择指令端 
   RW=0;   //选择写入 
   E=1;    //下降沿读入 
   P2=command;
   E=0;
 }
  
/**********************************************************
函数名称: writeData
函数描述: LCD写入数据函数
入口参数: 指令参数writedata 
**********************************************************/
     
void writeData(uchar writedata)
{  
   while(testBusy());
   RS=1;    //选择数据端 
   RW=0;    //选择写入
   E=1;
   P2=writedata;
   E=0;
 }   
 
/**********************************************************
函数名称: initialLcd1602() 
函数描述: LCD写入指令函数
入口参数: 无
**********************************************************/
     

void initialLcd1602(void)
{ 
     
  /*delay(100);
  writeCommand(0x38);
  delay(10);
  writeCommand(0x38); 
  delay(10);
  writeCommand(0x38); 
  delay(10);	*/     //初次使用 
  
  writeCommand(0x38); //设置显示格式为:8位,双行显示,5X7点阵 
  writeCommand(0x80);
  writeCommand(0x01);                  
  writeCommand(0x0c);//设置显示状态:显示器开,有光标,关闪烁 writeCommand(0x0f)
                     //writeCommand(0x0c);writeCommand(0x0e)
  writeCommand(0x06);
  }
 
/**********************************************************
函数名称: display_xy
函数描述: LCD确定光标位置函数
入口参数: 列坐标x,行坐标y 
**********************************************************/

 void display_xy(uchar x,uchar y)
 {
    if(y==1)         //若第二行则光标地址加0x80 
   x+=0x40;         
   x+=0x80;
   writeCommand(x);
   }
   
/**********************************************************
函数名称: display_char
函数描述: 显示字符函数
入口参数: 列坐标x,行坐标y,输入数据 
**********************************************************/
 
 void display_char(uchar x,uchar y,uchar inputData) 
 {
   display_xy(x,y);  //确定光标位置
   writeData(inputData);  //输入字符数据 
   }
 
/**********************************************************
函数名称: display_string
函数描述: 显示字符串函数
入口参数: 列坐标x,行坐标y,输入数据串 
**********************************************************/
 
 void display_string(uchar x,uchar y,uchar *stringData)
 {
  uchar columnCoordinate=x; //定义列坐标 
  uchar rowCoordinate=y;    //定义行坐标 
 
   while(*stringData!='\0') //循环条件:字符串没有结束 
    { 
      display_char(columnCoordinate,rowCoordinate,*stringData);
      columnCoordinate++;
      stringData++;
     /* if(*stringData==0x60)   //设置是否回车显示 
      rowCoordinate++;
         if(rowCoordinate==2)
            rowCoordinate=0;  */
      if(columnCoordinate==16)
      {
        columnCoordinate=0;
        rowCoordinate++;  
         if(rowCoordinate==2)   //当前页面显示完,准备下一页显示 
           {
           delay(400); //翻页速度
           writeCommand(0x01); //显示完一页后清屏,下一页内容更新 
           rowCoordinate=0;    //重新在第一行显示 
           }
      }
    //writeCommand(0x01);
    }  
     
    //一次显示结束 
    //delay(400);//停留时间,全部内容重新显示 
       
  } 
 
 //以上是TLC1602的驱动程序 
 
 
 /**********************************************************
函数名称:initialSerial
函数描述:串行口初始化 
入口参数: 无 
**********************************************************/ 

/*void initialSerial()
{
  TMOD=0x20;
  SCON=0x50;
  TH1=0xfd;
  TL1=0xfd; 
  TR1=1; 
   EA=1;  
  }

 /**********************************************************
函数名称:serialSend 
函数描述:串行口发送函数 
入口参数: AD转换结果 
**********************************************************/ 
/*void serialSend(uchar send[])
{
 uchar i;
 while(1)   //设置发送的数组元素个数 
  {
   SBUF=send[i];
   while(!TI);
   TI=0; 
   i++;
   if(i==5)   
   break;        
   }
  }
  
 /**********************************************************
函数名称:T0interrupt
函数描述:T0定时函数,控制采样时刻 
入口参数: 无 
**********************************************************/
/*void T0interrupt() interrupt 1 using 1
{   
   uchar nCounter;         
   TH0=0x3C;
   TL0=0XB0;
   if(nCounter==INTERVAL)
     {
     nCounter=0;
     ADFlag=1;
     }
   nCounter++;
    
}
  

 /**********************************************************
函数名称: main
函数描述:主函数
入口参数: 无 
**********************************************************/
 
 void main(void)
 { 
   uint  adData,adResult;
   uchar hundredBit,tenBit,oneBit;
   uchar dataString[6];  //转换结果数据 
   uchar inputdata[]="The Voltage is:";//待显示的内容 
   delay(100);  //等待LCD进入工作状态 
   initialLcd1602();
   //initialSerial();
    //循环显示内容 
 while(1)
 { 
   
    display_string(0,0,inputdata);   //起始显示位置 
    adResult=adConvert(0); 
    adData=adResult*1.0/4096*500; //设置精度为0.01,AD参考电压为5V 
    oneBit=adData%10;            //个位数 
    tenBit=(adData/10)%10;       //十位数 
    hundredBit=(adData/100)%10;  // 百位数 
    
    dataString[0]=hundredBit+0x30;
    dataString[1]=0x2E;//设置小数点 
    dataString[2]=tenBit+0x30;
    dataString[3]=oneBit+0x30; 
    dataString[4]=0x56; //设置'V' 
    //以上为对AD转换数据的处理 
  
    display_string(6,1,dataString); 
    
    delay(100); //*****避免CPU时刻扫描LCD 
   // serialSend(dataString);
   
  }
 }
 
  
  
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -