AD按键模拟程序(STC12)(初学者)

AD模拟按键
在设计板子时,经常遇到IO口不够用的情况,除了用译码器和锁存器之外,还可以在按键上下功夫。
本篇文章在 STC12自带的AD转换模块上介绍如何利用 AD就使用一个IO口控制多个按键,比传统的矩阵键盘扫描更加灵活使用,而且理论上支持 无限制按键的控制。

原理
AD转化就是将电压转化为数字,在每个按键串联(并联)相对应的电阻,利用计算可以得出相对应按键按下的电压,通过AD转化就可以得到数字,并进行判断,就可以知道哪个按键被按下了。

延时程序(STC12)(12MHZ)
//延时1ms
void delay(unsigned int z)

{

unsigned int x,y;

for(x=z; x>0; x--)

for(y=920; y>0; y--);

}



//延时10us
void delay10us( unsigned int n)
{
n=8*n;
while(n--);
}
延时程序根据实际情况修改

STC12相关寄存器
sfr  P1ASF      =   0x9d;
sfr  ADC_CONTR  =   0xbc;
sfr  ADC_RES    =   0xbd; 
sfr  ADC_RESL   =   0xbe; 



AD读值程序
void AD_initialize()   //初始化AD
{  
  P1ASF=0x42;		 //P16和P11作为ad
  ADC_RES=0x00;
  ADC_RESL=0x00;
  AUXR1=0x00;
  ADC_CONTR=ADC_POWER;
  _nop_();   // 在  intrins.h  头文件中
  _nop_();
  _nop_();
  _nop_();
 //delay(1);
}

unsigned int AD_start(unsigned char chs)	  // 1 6
{
    ADC_CONTR=0xa8+chs;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	while(ADC_CONTR!=0xb0+chs);
	ADC_CONTR=0xa0+chs;
   return(ADC_RES*4+ADC_RESL);
}

float AD_dat(unsigned char chs)
{
 float AD_value;
 unsigned char i;
 for(i=0;i<10;i++)
 AD_value+=AD_start(chs);
 AD_value/=10;
 AD_value=(AD_value*5)/1024;
 return(AD_value) ;
}
其中的P1ASF为开启AD转换的P1的端口
如果开启P10、P13 则赋值 00001001(B),即0x0a;

float AD_dat(unsigned char chs)
得到的值是浮点类型,chs是检测的端口,输入6就是检测P16的AD值

按键判断程序
//键盘扫描
//  0.015    0.3	         1	    1.3     1.7	   2.15	      2.8  3.9	 4.5
//  电阻值		0   510   2k   3k3   4k7   6k8   10k   31k    68k
void keyscan()		
{
  
  if(AD_dat(1)>=0&&AD_dat(1)<0.015)		
  {
  delay(1);
  if(AD_dat(1)>=0&&AD_dat(1)<0.015)
   {

   }
  }	
  
  										  
  else if(AD_dat(1)>0.015&&AD_dat(1)<=0.3) 	  
  {
  delay(1);
  if(AD_dat(1)>0.015&&AD_dat(1)<=0.3) 
   {

   }  
  }	
  
 
  else if(AD_dat(1)>0.3&&AD_dat(1)<=1)    
  {
  delay(1);
  if(AD_dat(1)>0.3&&AD_dat(1)<=1)  
   {

   }  
  }	
  
 
  else if(AD_dat(1)>1&&AD_dat(1)<=1.3)  
  {
  delay(1);
  if(AD_dat(1)>1&&AD_dat(1)<=1.3)  
   {

   }  
  }	 
 
  else if(AD_dat(1)>1.3&&AD_dat(1)<=1.8)   
  {
  delay(1);
  if(AD_dat(1)>1.3&&AD_dat(1)<=1.8)  
   {

   }  
  }	 
  
  
  else if(AD_dat(1)>1.8&&AD_dat(1)<=2.3)  
  {
  delay(1);
  if(AD_dat(1)>1.8&&AD_dat(1)<=2.3)  
   {

   }  
  }	 
  
  
  else if(AD_dat(1)>2.3&&AD_dat(1)<=2.9)  
  {
  delay(1);
  if(AD_dat(1)>2.3&&AD_dat(1)<=2.9)  
   {

   }  
  }	 
 
 
  else if(AD_dat(1)>=2.9&&AD_dat(1)<=4.3)   
  {
  delay(1);
  if(AD_dat(1)>=2.9&&AD_dat(1)<=4.3) 
   {

   }  
  }	 
  
  
  else if(AD_dat(1)>4.3&&AD_dat(1)<=4.6)  	  
  {
  delay(1);
  if(AD_dat(1)>4.3&&AD_dat(1)<=4.6)  
   {

   }  
  }	 
}
其中默认P11为按键的端口,delay(1)为延时,否则键值会乱漂,造成读值不准的情况;
注意的是AD取值我是取5次的平均值,若是多次取会造成读取的键值误差反而误差更大,有兴趣的可以尝试。
具体的电阻值也根据具体的计算
接线图


电阻计算公式

V=5*R/(10000+R)
其中5v为单片机工作电压、10000为原本的限流电阻


  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值