【C51单片机】数字电压表设计

数字电压表要求:在AT89C52系统中采用PCF8591芯片,测量0-5V范围内的直流电压,并在2位数码管上显示电压值。

问题咨询请联系-》群名:IT项目交流群    群号:245022761


PROTEUS仿真电路:

【C51单片机】数字电压表设计_第1张图片

 在KEIL中编写的源程序:

#include    
#include  

#define  AddWr 0x90    //PCF8591 地址

sbit scl=P2^0;       //I2C  时钟 
sbit sda=P2^1;       //I2C  数据 
bit ack;             //应答标志位

unsigned char date;
sbit C1=P2^6;//数码管1
sbit C2=P2^7;//数码管2
sbit Dp=P2^5;//小数点
table[10]=
{0x3f,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F};//0~9
unsigned int data dis[3]={0x00,0x00,0x00}; 
unsigned int getData;
/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:     启动I2C总线,即发送I2C起始条件.  
********************************************************************/
void Start_I2c()
{
  sda=1;         /*发送起始条件的数据信号*/
  _nop_();
  scl=1;
  _nop_();        /*起始条件建立时间大于4.7us,延时*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();    
  sda=0;         /*发送起始信号*/
  _nop_();        /* 起始条件锁定时间大于4μs*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();       
  scl=0;       /*钳住I2C总线,准备发送或接收数据 */
  _nop_();
  _nop_();
}

/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:     结束I2C总线,即发送I2C结束条件.  
********************************************************************/
void Stop_I2c()
{
  sda=0;      /*发送结束条件的数据信号*/
  _nop_();       /*发送结束条件的时钟信号*/
  scl=1;      /*结束条件建立时间大于4μs*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  sda=1;      /*发送I2C总线结束信号*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/*******************************************************************
                 字节数据发送函数               
函数原型: void  I2C_SendByte(UCHAR c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
          此状态位进行操作.(不应答或非应答都使ack=0)     
           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  I2C_SendByte(unsigned char  c)
{
 unsigned char  i;
 
 for(i=0;i<8;i++)  /*要传送的数据长度为8位*/
    {
     if((c<0;j--)
    for(k=125;k>0;k--);
}
/*------------------------------------------------
把读取值转换成一个一个的字符,给串口显示
------------------------------------------------*/
void To_ascii(unsigned char num)
{	
	 SBUF=num/100+'0';		   	   
	 delay(200);		  
	 SBUF=num/10%10+'0';			   
	 delay(200);	
	 SBUF=num%10+'0';
	 delay(200);
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
int main()
{  
	while(1)
	{
	 	PCF8591_SendByte(AddWr,0);	 //启动转换
	 	getData=PCF8591_RcvByte(AddWr);  //读转换完的数字信号
	 	dis[1]=getData/51;   //整数位
		dis[2]=getData%51;   //dis[2]位中间暂存数据位
		dis[2]=dis[2]*10;    
		dis[0]=dis[2]/51;    //计算输出电压的小数值	
	C1=1;                		                
	Dp=0;                //打开小数点
	P0=table[dis[0]];    //显示整数部分及小数点
			     
	C1=0; 
	delay(10);    
			
	C2=1;                //打开第二位数码管
	Dp=1;                //关闭小数点
	P0=table[dis[1]];     //显示小数部分
	C2=0;	
	}
}

 

仿真效果:

 【C51单片机】数字电压表设计_第2张图片

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