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

📄 v.c

📁 8输入简易数字电压表
💻 C
字号:
#include<reg51.h>
#include<intrins.h>                 //调用_nop_()延时函数用  
#define ad_con P2                   //0809的控制口? 
#define addata P0                   //0809的数据口    
#define disdata P1                  //数码管的字段码码输出口   
#define uchar unsigned char 
#define uint unsigned int

uchar num=0x00;                     //存放单通道显示时的当前通道数       

sbit ALE=P2^3;                      //0809的地址锁存信号                 
sbit START=P2^4;                    //0809的启动信号     
sbit OE=P2^5;                       //0809的输出允许信号    
sbit KEY1=P3^5;                     //循环或单路显示选择按键   
sbit KEY2=P3^6;                     //通道选择?按键     
sbit EOC=P3^7;                      //0809的转换结束?信号 
sbit DISX=disdata^7;                //小数点位   
sbit FLAG=PSW^0;                    //循环或单路显示标志位   
uchar code dis_7[11]={0x3f,0x06,0x5b,0x4f,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};  //LED数码管的字段码    
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};          //4个LED数码管的位选码     
uchar  ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};    //0809的8个通道转换数据缓冲区    
uint  dis[5]={0x00,0x00,0x00,0x00,0x00};            //显示缓冲区   

delay1ms(uint t)          //1ms延时子函数   
{uint i,j;
  for(i=0;i<t;i++)
  for(j=0;j<120;j++);
 }


 keytest()     //检测按键子函数   
 { if(KEY1==0)           //检测循环或单路选择按键是否按下     
      {FLAG=!FLAG;       //标志位取反  ,循环,单路显示切换   
	   while(KEY1==0);
	   }
	   if(FLAG==1)       //单路显示方式时,检测通道选择按键是否按下     
	   { if(KEY2==0)
	     {num++;
		 if(num==8)
		 {num=0;}
		 while(KEY2==0);
		 }
		 }
		 }
scan()     ?/显示扫面子函数   
{ 
uchar k,n;
int h;
if(FLAG==0)            //循环显示子程序   
{dis[3]=0x00;          //通道值清0    
 for(n<0;n<8;n++)      //8路通道循环8次  
 {dis[2]=ad_data[n]/51;  //当前 通道数据转换为BCD码    ?
  dis[4]=ad_data[n]%51;
  dis[4]=dis[4]*10;
  dis[1]=dis[4]/51;
  dis[4]=dis[4]%51;
  dis[4]=dis[4]*10;
  dis[0]=dis[4]/51;
  for(h=0;h<500;h++)         //每个通道显示时间控制为1s    
  {
    for(k=0;k<4;k++)             //4位LED扫描显示    
  {
 	disdata=dis_7[dis[k]];
	if(k==2)
	{DISX=0;}
	P3=scan_con[k];
	delay1ms(1);
	P3=0xff;
	}
	}
	dis[3]++;          //通道值加1   
	keytest();         //检测按键  
	}
}
if(FLAG==1)           //单路显示子程序  
{  
  dis[3]=num;         //当前通道数送通道显示位      
for(k=0;k<4;k++)      //4位LED扫描显示    
{disdata=dis_7[dis[k]];
if(k==2)
{DISX=0;}
P3=scan_con[k];
delay1ms(1);
P3=0xff;
}
keytest();            //检测按键  
}
  }

test()       //ADC0809转换子函数   
{  uchar m;
   uchar s=0x00;                                        //初始通道为0;
   ad_con=s;                                            //第一通道地址送0809控制口     
   for(m=0;m<8;m++)
   {ALE=1;_nop_();_nop_();ALE=0;                        //锁存通道地址   
    START=1;_nop_();_nop_();START=0;                    //启动转换   
	_nop_();_nop_();_nop_();_nop_();
	while(EOC==0);                                      //等待转换结束   
	OE=1;ad_data[m]=addata;OE=0;                        //读取当前通道转换数据   
	s++;ad_con=s;                                       //改变通道地址   
	}
	ad_con=0x00;                                        //通道地址恢复初值    
	}

main()                            //主函数   
{P0=0xff;                         //初始化端口   
 P2=0x00;
 P1=0xff;
 P3=0xff;
 while(1)
 {test();
  scan();
  }
}

⌨️ 快捷键说明

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