导航:首页 > 操作系统 > 51单片机ADC按键检测

51单片机ADC按键检测

发布时间:2022-05-26 06:42:11

1. 怎样用51单片机的四个带ADC的I/O口来检测四个电容触摸按键的触摸

怎样用51单片机的四个带ADC的I/O口来检测四个电容触摸按键的触摸10分
相关说明:
只用I/O口,不要再额外加振荡电路电路。现在使用的是STC12c2052ad单片机
at的51本身就不带ad
是无需外加电路,需要用到其pwm,还有电容
触摸处理看一下杜洋的触摸电子琴就差不多了,网站上面有开源

2. 用汇编语言写一个51单片机adc0809的程序

正好做过,就给你吧!
*************************************
;* *
;* 主程序和中断程序入口 *
;* *
;*************************************
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
;
;*************************************
;* *
;* 初始化程序中的各变量 *
;* *
;*************************************
CLEARMEMIO: CLR A
MOV P2,A
MOV R0,#70H
MOV R2,#0DH
LOOPMEM: MOV @R0,A
INC R0
DJNZ R2,LOOPMEM
MOV 20H,#00H
MOV A,#0FFH
MOV P0,A
MOV P1,A
MOV P3,A
RET
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;初始化
MAIN: LCALL TEST ;测量一次
LCALL DISPLAY ;显示数据一次
AJMP MAIN
NOP ;PC值出错处理
NOP
NOP
LJMP START
;
;*************************************
;* 显 示 控 制 程 序 *
;*************************************
;
DISPLAY: JB 00H,DISP11 ;
MOV R3,#04H ;4路信号循环显示控制
MOV R0,#70H ;显示数据初址70H~73H
MOV 77H,#00H ;显示通道路数初值
DISLOOP1: LCALL TUNBCD ;显示数据转为三位BCD码存入76H、75H、74H(最大5.00v)
MOV R2,#0FFH ;每路显示时间控制 4MS*255
DISLOOP2: LCALL DISP ;调四位显示程序
LCALL KEYWORK1 ;
DJNZ R2,DISLOOP2 ;
INC R0 ;显示下一路
INC 77H ;通道显示数加一
DJNZ R3,DISLOOP1
RET
;
DISP11: MOV A,77H ;
SUBB A,#01H ;
MOV 77H,A ;
ADD A,#70H ;
MOV R0,A ;
DISLOOP11: LCALL TUNBCD ;显示数据转为三位BCD码存入7AH、79H、78H(最大5.00v)
MOV R2,#0FFH ;每路显示时间控制 4MS*25
DISLOOP22: LCALL DISP ;调四位显示程序
LCALL KEYWORK2 ;
DJNZ R2,DISLOOP22
INC 77H ;通道显示数加一
RET
;
;*************************************
;* 显示数据转为三位BCD码程序 *
;*************************************
;显示数据转为三位BCD码存入76H、75H、74H(最大值5.00v)
;
TUNBCD: MOV A,@R0 ;255/51=5.00V运算
MOV B,#51 ;
DIV AB ;
MOV 76H,A ;个位数放入76H
MOV A,B ;余数大于19H,F0为1,乘法溢出,结果加5
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10 ;
MUL AB ;
MOV B,#51 ;
DIV AB
JB F0,LOOP2 ;
ADD A,#5
LOOP2: MOV 75H,A ;小数后第一位放入75H
MOV A,B
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10 ;
MUL AB ;
MOV B,#51 ;
DIV AB
JB F0,LOOP3 ;
ADD A,#5
LOOP3: MOV 74H,A ;小数后第二位放入74H
RET
;
;*************************************
;* ? 显?示 程 序 *
;*************************************
;共阳显示子程序,显示内容在74H—77H
;
DISP: MOV R1,#74H ;共阳显示子程序,显示内容在74H—77H
MOV R5,#0FEH ;数据在P1输出,列扫描在P3.0-P3.3
PLAY: MOV P1,#0FFH
MOV A,R5
ANL P3,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
JB P3.2,PLAY1 ;小数点处理
CLR P1.7 ;小数点显示(显示格式为XX.XX)
PLAY1: LCALL DL1MS
INC R1
MOV A,P3
JNB ACC.3,ENDOUT
RL A
MOV R5,A
MOV P3,#0FFH
AJMP PLAY
ENDOUT: MOV P3,#0FFH
MOV P1,#0FFH
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;
;*************************************
;* ? ? 延时程序 *
;*************************************
;
DL10MS: MOV R6,#0D0H ;10MS延时子程序
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;
DL1MS: MOV R4,#0FFH ;513+513=1MS
LOOP11: DJNZ R4,LOOP11
MOV R4,#0FFH
LOOP22: DJNZ R4,LOOP22
RET
;
;*************************************
;* ? 电压测量(A/D)子程序 *
;*************************************
; 一次测量数据4个,依次放入70H-73H单元中
;
TEST: CLR A ;模数转换子程序
MOV P2,A
MOV R0,#70H ;转换值存放首址
MOV R7,#04H ;转换4次控制
LCALL TESTART ;启动测试
WAIT: JB P3.7,MOVD ;等A/D转换结束信号
AJMP WAIT
;
TESTART: SETB P2.3 ;测试启动
NOP
NOP
CLR P2.3
SETB P2.4
NOP
NOP
CLR P2.4
NOP
NOP
NOP
NOP
RET
;
MOVD: SETB P2.5 ;取A/D转换数据
MOV A,P0
MOV @R0,A
CLR P2.5
INC R0
MOV A,P2 ;通道地址加1
INC A
MOV P2,A
CJNE A,#04H,TESTEND ;等8路A/D转换结束
TESTEND: JC TESTCON
CLR A ;结束恢复端口
MOV P2,A
MOV A,#0FFH
MOV P0,A
MOV P1,A
MOV P3,A
RET
;
TESTCON: LCALL TESTART
LJMP WAIT
;
;*************************************
;* ? 按键检测子程序 *
;*************************************
;
KEYWORK1: JNB P3.5,KEY1
KEYOUT: RET
;
KEY1: LCALL DISP ;延时消抖
JB P3.5,KEYOUT
WAIT11: JNB P3.5,WAIT12
CPL 00H
MOV R2,#01H
MOV R3,#01H
RET
;
WAIT12: LCALL DISP ;键释放等待时显示用
AJMP WAIT11
;
KEYWORK2: JNB P3.5,KEY1
JNB P3.6,KEY2
RET
;
KEY2: LCALL DISP ;延时消抖用
JB P3.6,KEYOUT
WAIT22: JNB P3.6,WAIT21
INC 77H
MOV A,77H
CJNE A,#04H,KEYOUT11
KEYOUT11: JC KEYOUT1
MOV 77H,#00H
KEYOUT1: RET
;
WAIT21: LCALL DISP ;键释放等待时显示用
AJMP WAIT22
;
END

附录3:
单片机C源程序清单
/*********************************************************************/
// 四路电压表C程序
// 使用keil C51 ver7.09
/*********************************************************************/
/*使用AT89C52单片机,12MHZ晶振,P0口读入AD值,P2口作AD控制,用共阳LED数码管
P1口输出段码,P3口扫描,最高位指示通道(0-7)。*/
#include "reg52.h" //52系列单片机定义文件
#include "intrins.h" //调用_nop_();延时函数用
#define ad_con P2 //AD控制口
#define addata P0 //AD数据计入读入口
#define Disdata P1 //显示数据段码输出口
#define uchar unsigned char//无符号字符(8位)
#define uint unsigned int //无符号整数(16位)
sbit ALE=P2^3; //锁存地址控制位
sbit START=P2^4; //启动一次转换位
sbit OE=P2^5; //0809输出数据控制位
sbit EOC=P3^7; //转换结束标志位
sbit DISX=Disdata^7; //LED小数点
//
//
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/* 共阳七段LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" */
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //四位列扫描控制字
uchar data ad_data[8]={0x00,0x00,0x00,0x00};//定义4个数据内存单元
uint data dis[5]={0x00,0x00,0x00,0x00,0x00}; //定义4个显示数据单元、1个数据暂存单元
//
//
/********1毫秒延时子函数**********/
delay1ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
//
//
/***********显示扫描子函数**********/
scan()
{
uchar k,n;
int h;
dis[3]=0x00; //通道初值为0
for(n=0;n<4;n++) //每次显示4个数据
{
dis[2]=ad_data[n]/51; //测得值转换为三位BCD码,最大为5.00V
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++) //每个通道值显示时间控制(约1秒)
{
for(k=0;k<4;k++) //四位LED扫描控制
{
Disdata=dis_7[dis[k]];
if(k==2){DISX=0;}
P3=scan_con[k];delay1ms(1);P3=0xff;
}
}
dis[3]++; //通道值加1
}
}
//
//
/*******0809AD转换子函数***********/
test()
{
uchar m;
uchar s=0x00;
ad_con=s;
for(m=0;m<4;m++)
{
ALE=1;_nop_();_nop_();ALE=0; //转换通道地址锁存
START=1;_nop_();_nop_();START=0; //开始转换命令
_nop_();_nop_();_nop_();_nop_(); //延时4微秒
while(EOC==0); //等待转换结束
OE=1;ad_data[m]=addata;OE=0;s++;ad_con=s;//取AD值,地址加1
}
ad_con=0x00; //控制复位
}
//
//
/**************主函数****************/
main()
{
P0=0xff; //初始化端口
P2=0x00;
P1=0xff;
P3=0xff;
while(1)
{
scan(); //依次显示4个通道值一次
test(); //测量转换一次
}
}
//
//
//*********************结束**************************//

3. 单片机adc,检查电压值问题

1、希望你的意思不是说用数字口去检测模拟量;
2、如果1成立,那么,51单片机使用的是TTL电平,0.8V以下的输入被视为低电平,2V以上的输入被视为高电平,所以即使你VCC是7V,只要分压出来的电压落入高低电平范围就会被检测到,但只是检测“高”和“低”;
3、不要尝试供7V电,一般最大5.5V,7V对你的片子没啥好处,可能会烧的;

4. 51单片机的ADC请教

IO口接电源用大电阻。允许输入电流很小,大了会烧坏,热了也会烧坏。

5. 51单片机温度检测程序中ADC_CONTR什么意思

ADC有好几个控制寄存器,要弄懂它们的意义,要看STC的芯片手册

主要功能,启动AD转换,迁择通道,设置转换频率 ,查询是否完成转换 等
还要设置IO输入 /输出模式

6. STC单片机 ADC按键 求助!!

取那么多、那么长时间的平均值干什么?

连续取 20 次,其中有10 次,按的是这个键,有10 次,按的是那个键,

平均一下,判定结果:是按下了一个根本就没有按的键。
========
#include<reg52.h>
#include<intrins.h>

unsigned char code k_AD[] = {
10, 40, 70, 100, 130, 160, 190, 210, 230};//九个按键所对应的ADC值

unsigned char code an[] = { //共阳段码
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//--------------------------------------------
void delay(int x)
{
int i;
while(x--) for(i = 115; i > 0; i--);
}
//--------------------------------------------
unsigned char keyscan()
{
unsigned char k1, k2;

k1 = GetADCResult(0);//读出

if(k1 < 238) { //按下了

delay(20); //延时

k2 = GetADCResult(0); //再次读出

if((k1 > (k2 - 5) && (k1 < (k2 + 5)) { //两者相差无几

k1 /= 2; k2 /= 2; k1 += k2; //两次的平均值

for(k2 = 0; k2 < 9; k2++) //在表格中查找9次

if(k1 > (k_AD[k2]) - 5) && (k1 < (k_AD[k2]) + 5)) //找到了

return(k2); //就返回键值
}
}
return(255); //没有按键
}
//--------------------------------------------
void main()
{
unsigned char key;
while(1) {
key = keyscan();
if(key != 255) P0 = an[key];//显示键值
}
}
//--------------------------------------------

本程序未经验证,仅供参考。

7. 怎样用51单片机检测声音

首先要有传感器,将声音转为电信号,可以使用驻极体话筒,后面再加上音频放大电路,放大器输出接单片机的ADC(模数转换器)就可以了。单片机就可以通过编写相应的程序对声音识别处理,不过要做复杂的运算处理,需要使用DSP芯片,单片机的运算能力很有限。

8. 51单片机_键盘响应

系统主程序不能只扫描按键,还应该干点其他的事情吧?所以按键应当使用中断扫秒的方法。
最高效的方法是利用外部中断INT0,多个按键使用个多输入的与门共用这一个中断,当有中断响应时,单片机再去扫描按键,判断究竟是那个按键按下,这样是最高效的。
还有种方法就是开启定时器中断,在中断服务程序中去扫描按键,因为定时器中断程序是周期性的,所以判断按键不需要再延时,第一次中断响应,判断是否是第一次按键按下,如果是跳出中断;否则是按键按下。同样是因为周期性,其执行效率较上面的方法要低。
效率最差的就是你讲的那种不需要中断的,系统主程序要一直不断的调用按键扫描程序。如果还要ADC数据采集,显示,上位机通信等等,这样的方案执行起来比较繁琐,乃至于不能运行。
如果你需要干很多事情,建议你使用第一种方案。

9. 基于51单片机AD光强检测电路

只提思路。【0】前提假设安装地理位置纬度值通过安装过程来调节,追踪装置只需跟随日出日落。单只光敏检测到极值点附近,作为起始位置。当两只光敏感应到相同光强时,视为中心正对太阳。此后控制电机保持两只光敏感应到相同光强。【1】电路设计1、通过至少两只光敏电阻双电源供电差分放大电路完成光的位置识别A,电阻应该是安装在追踪装置迎光球面上,它们的感应面夹角10~20度,两个光敏电阻中心连接线与追踪装置感应平面平行。其中一路电阻放大完成光强极值检测B。经过双极性ADC或多路比较器上拉送单片机检测。2、步进电机正反转控制电路。根据实际电机接口要求完成2003控制办法。3、12864,注意背光调节。总线或IO方式连接到单片机。4、增加启停、复位等必要的按键。【2】程序设计1、完成12864的底层接口程序,根据要求编写相关应用程序。2、根据电机正反转时序要求,设计正反转接口程序。换算角度和脉冲个数关系。3、首次开机,用B值遍历360度,找到向阳的180度限位。也可程序锁定左右限位。根据极值锁定到太阳当前所在位置。4、利用电路A,控制步进电机逻辑是始终保持A差分放大输出为0。

10. 两个51单片机串口通讯+ADC采集+LCD1602+按键控制+指示灯蜂鸣器控制设计方案

你好!
1、ADC芯片的具体型号
2、仿真模拟效果,还是有开发板
3、可以完成具体设计

阅读全文

与51单片机ADC按键检测相关的资料

热点内容
oppoa93加密便签在哪查找 浏览:16
两个数字的加减乘除运算编程 浏览:225
给手机加密码忘记了怎么办 浏览:600
单片机运算符 浏览:297
移动端微信商城源码 浏览:442
编程猫下一个背景在哪里 浏览:358
javaclasstype 浏览:238
乐高编程和乐高课的延伸 浏览:356
苹果手机怎么切换app美国账号 浏览:865
编译程序输入一个字符串 浏览:407
圆命令画法 浏览:308
如果给电脑e盘文件加密 浏览:802
javaswing项目 浏览:778
androidsdksetup 浏览:1005
pdf怎么设置中文 浏览:128
安卓手机用什么软件看伦敦金 浏览:966
魅族文件夹无名称 浏览:792
苏黎世无人机算法 浏览:876
核桃编程和小码王的融资 浏览:686
微积分教材pdf 浏览:728