導航:首頁 > 操作系統 > 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按鍵檢測相關的資料

熱點內容
兩個數字的加減乘除運算編程 瀏覽:221
給手機加密碼忘記了怎麼辦 瀏覽:596
單片機運算符 瀏覽:292
移動端微信商城源碼 瀏覽:442
編程貓下一個背景在哪裡 瀏覽:356
javaclasstype 瀏覽:237
樂高編程和樂高課的延伸 瀏覽:354
蘋果手機怎麼切換app美國賬號 瀏覽:865
編譯程序輸入一個字元串 瀏覽:407
圓命令畫法 瀏覽:308
如果給電腦e盤文件加密 瀏覽:802
javaswing項目 瀏覽:778
androidsdksetup 瀏覽:1005
pdf怎麼設置中文 瀏覽:128
安卓手機用什麼軟體看倫敦金 瀏覽:966
魅族文件夾無名稱 瀏覽:792
蘇黎世無人機演算法 瀏覽:876
核桃編程和小碼王的融資 瀏覽:686
微積分教材pdf 瀏覽:728
寫python給微信好友發消息 瀏覽:340