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

📄 adc0832电压表.c

📁 数码管显示—ADC0832电压表PROTUES仿真
💻 C
字号:
/*********************************包含头文件********************************/
#include <reg51.h>	
#include <intrins.h> 
/*********************************端口定义**********************************/
sbit CS   = P3^5;
sbit Clk = P3^6; 
sbit DATI = P3^7;
sbit DATO = P3^7; 
/*******************************定义全局变量********************************/
unsigned char dat = 0x00;       //AD值 .
	//若dat=adc0832(CH)*500.0/255; 不可用unsigned char dat
	 //500不可以。用500.0 
	//如 下面unsigned int disdat; 不可unsigned char disdat 
unsigned char count = 0x00;      //定时器计数  
unsigned char CH;                //通道变量	
unsigned int dis[] = {0x00, 0x00, 0x00}; //显示数值	 
/*******************************共阳LED段码表*******************************/ 
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe  };	 
/****************************************************************************
函数功能:AD转换子程序 
入口参数:CH			
出口参数:dat	
****************************************************************************/ 
unsigned char adc0832(unsigned char CH)
{
    unsigned char i,test,adval;	
     adval = 0x00;
     test = 0x00;

    Clk = 0;       //初始化
	CS=1;
    DATI = 1;     
    CS = 0;
    _nop_();
    Clk = 1;
    _nop_(); 

   if ( CH == 0x00 )      //通道选择
   {
       Clk = 0;           //写入10,选单极性0通道
       DATI = 1;      //通道0的第一位
       _nop_();         //clk上升沿写进去
       Clk = 1;	
       _nop_();

      Clk = 0;
      DATI = 0;      //通道0的第二位
      _nop_();
      Clk = 1;
      _nop_();
    } 
    else
    {                   //写入11,选单极性1通道
      Clk = 0;
      DATI = 1;      //通道1的第一位
       _nop_();          //clk上升沿写进去
       Clk = 1;
       _nop_();

      Clk = 0;
      DATI = 1;      //通道1的第二位
      _nop_();
      Clk = 1;
      _nop_();
    }

      Clk = 0;    //写进空闲位 //clk上升沿写进去
      DATI = 1;
	  _nop_();
      Clk = 1;
	  _nop_();

    //读取前8位的值
    for( i = 0;i < 8;i++ )      //读取前8位的值
    {                           //clk下升沿读出来
       _nop_();                  //高位先行
       adval <<= 1;
       Clk = 1;
       _nop_();
       Clk = 0;
       if (DATO)
          adval |= 0x01;
           //else
           // adval |= 0x00;
     }  

     for (i = 0; i < 8; i++)      //读取后8位的值
      {                          //clk下升沿读出来
           test >>= 1;           //低位先行,时序图上
           if (DATO)
              test |= 0x80;
              //else 
              //test |= 0x00;
          _nop_();
          Clk = 1;
          _nop_();
          Clk = 0;
      }

      if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。
           dat = adval;       //若一直出现显示为零,请将该行去掉

       _nop_();
       CS = 1;        //释放ADC0832,关闭
       DATO = 1;
       Clk = 1;

      return dat;			
}						   
/****************************************************************************	
函数功能:延时子程序
入口参数:  
出口参数:
****************************************************************************/  
void delay(void)				 
{
   unsigned int k;
    for(k=10;k<100;k++);		
}							  
/**************************************************************************** 
函数功能:将0-255级换算成0.00-5.00的电压数值	  
入口参数:i			 
出口参数:  					
****************************************************************************/  
void convdata(unsigned char i) 	 //i=dat*5/255=51,是255份; 256份误差大	                               
{	  
     unsigned int disdat;	   //不可unsigned char disdat
     disdat=i*500.0/255;		 //500不可以。用500.0        
             /* 验证读数
              dis[0] = i/100;     //个位
              dis[1] = i/10%10;   //小数点后第一位
              dis[2] = i%10;     //小数点后第二位	 */	 
	   
      dis[0] = disdat/100;     //个位
      dis[1] = disdat/10%10;   //小数点后第一位
      dis[2] = disdat%10;     //小数点后第二位
}
/**************************************************************************** 
函数功能:数码管显示子程序
入口参数: 
出口参数:
****************************************************************************/
void display(void)	
{      
    P2=0xf1;
    P0= tab[dis[0]] & 0x7f;      //显示个位和小数点
	delay();    
    
    P2=0xf2;
    P0=tab[dis[1]];       //显示小数点后第一位
	delay();    
    
    P2=0xf4;
    P0=tab[dis[2]];       //显示小数点后第二位
	delay();    
} 
/****************************************************************************  
函数功能:主程序	   
入口参数:		
出口参数:		
****************************************************************************/ 
void main(void)	 
{
    P1=0xff;       //端口初始化
    P0=0xff; 
	P2=0x00;   
    delay();
    CH = 0x00;    //在这里选择通道 0x00(单极性0通道)或0x01(单极性1通道)

    TMOD = 0x01;       //设置中断 
    TH0=(65536-50000)/256;//定时器1初值定时50ms
    TL0=(65536-50000)%256;
    IE = 0x82;
       TR0 = 1;	  //中端可去

    while(1)       //主循环		  
    { // dat=adc0832(CH); //中断读,去除偶尔闪动
	   //*500.0/255; 	 //500不可以。用500.0
       convdata(dat);      //数据转换
       display();      //显示数值
    } 
 }
 /****************************************************************************
函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次
 否侧显示的最后一位会不稳定
入口参数:  
出口参数: 
****************************************************************************/ 
void timer0(void) interrupt 1 
{     
    TH0=(65536-50000)/256;//定时器1初值定时50ms
	TL0=(65536-50000)%256;  
   
    count++;  
    if (count == 0x01)
    {
       count = 0x00;
       dat = adc0832(CH);
    } 
}	

⌨️ 快捷键说明

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