|
進過學習和消化,將紅色LED轉(zhuǎn)接到P3.6口,將P1口空出來,p1.2作為信號檢測端,終于將程序改了出來(具體工作見范例STC15.PDF第923頁)
- #include "reg51.h"
- #include "intrins.h"
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- WORD idata Vbg_RAM _at_ 0xef; //對于只有256字節(jié)RAM的MCU存放地址為0EFH
- //注意:需要在下載代碼時選擇"在ID號前添加重要測試參數(shù)"選項,才可在程序中獲取此參數(shù)
- WORD code Vbg_ROM _at_ 0x0ff7; //4K程序空間的MCU
- sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
- sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain
- sfr P0M1 = 0x93;
- sfr P0M0 = 0x94;
- sfr P2M1 = 0x95;
- sfr P2M0 = 0x96;
- sfr P3M1 = 0xB1;
- sfr P3M0 = 0xB2;
- sfr P4M1 = 0xB3;
- sfr P4M0 = 0xB4;
- sfr P5M1 = 0xC9;
- sfr P5M0 = 0xCA;
- sfr P6M1 = 0xCB;
- sfr P6M0 = 0xCC;
- sfr P7M1 = 0xE1;
- sfr P7M0 = 0xE2;
- sfr ADC_CONTR = 0xBC; //ADC控制寄存器
- sfr ADC_RES = 0xBD; //ADC高8位結(jié)果
- sfr ADC_LOW2 = 0xBE; //ADC低2位結(jié)果
- sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個時鐘
- #define ADC_SPEEDL 0x20 //360個時鐘
- #define ADC_SPEEDH 0x40 //180個時鐘
- #define ADC_SPEEDHH 0x60 //90個時鐘
- /*----------------------------
- 軟件延時
- ----------------------------*/
- void Delay(WORD n) //@11.0592MHz 延遲1ms
- {
- unsigned char i, j;
- while (n--)
- {
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- BYTE GetADC(BYTE ch)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- Delay(2); //ADC上電并延時
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //等待4個NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC轉(zhuǎn)換完成
- ADC_CONTR &= ~ADC_FLAG; //清除ADC標志
- return ADC_RES;
- }
- void main()
- {
- BYTE ADCbg;
- BYTE ADCp0, ADCp1, ADCp2, ADCp3, ADCp4, ADCp5, ADCp6, ADCp7;
- WORD V0, V1, V2, V3, V4, V5, V6, V7;
- P3M0 = 0xC0; //led接在p3.6上,設(shè)為強推挽模式,參數(shù)說明見STC15.PDF第401頁
- P3M1 = 0X00;
- while (1)
- {
-
- P1M0 = 0x00;
- P1M1 = 0xFF; //設(shè)為高阻模式
-
- //第一步:通過ADC的第9通道測試Bandgap電壓的ADC測量值
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x00; //不設(shè)置P1ASF,即可從ADC的第9通道讀取內(nèi)部Bandgap電壓的ADC測量值
- GetADC(0);
- GetADC(0);
- ADCbg = GetADC(0);
-
- //第二步:通過ADC的第2通道測試外部輸入電壓的ADC測量值 說明見STC15.PDF第926頁
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x01; //設(shè)置P1.0口為模擬通道
- GetADC(0);
- GetADC(0);
- ADCp0 = GetADC(0);
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x02; //設(shè)置P1.1口為模擬通道
- GetADC(1);
- GetADC(1);
- ADCp1 = GetADC(1);
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x04; //設(shè)置P1.2口為模擬通道
- GetADC(2);
- GetADC(2);
- ADCp2 = GetADC(2);
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x08; //設(shè)置P1.3口為模擬通道
- GetADC(3);
- GetADC(3);
- ADCp3 = GetADC(3);
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x10; //設(shè)置P1.4口為模擬通道
- GetADC(4);
- GetADC(4);
- ADCp4 = GetADC(4);
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x20; //設(shè)置P1.5口為模擬通道
- GetADC(5);
- GetADC(5);
- ADCp5 = GetADC(5);
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x40; //設(shè)置P1.6口為模擬通道
- GetADC(6);
- GetADC(6);
- ADCp6 = GetADC(6);
- ADC_RES = 0; //清除結(jié)果寄存器
- P1ASF = 0x80; //設(shè)置P1.7口為模擬通道
- GetADC(7);
- GetADC(7);
- ADCp7 = GetADC(7);
-
- //第三步:通過公式計算外部輸入的實際電壓值
- //Vx = Vbg_RAM * ADCx / ADCbg; //使用RAM中的Bandgap電壓參數(shù)進行計算
- V2 = Vbg_ROM * ADCp2 / ADCbg; //使用ROM中的Bandgap電壓參數(shù)進行計算
-
- if( V2 > 50 )
- P3 = 0X40; //燈亮
- else
- P3= 0X00 ; //燈滅
-
-
- Delay(1000);
- }
- }
復(fù)制代碼 將耳機線插入手機,播放音樂,LED燈將閃爍,證明檢測到了信號,停止放音樂,LED燈滅,證明工作正常。P1.2口設(shè)為高阻狀態(tài),并用220K歐的電阻接地,否則會受到雜波干擾,記住隔直電容,把手機燒了就問題大了。
手頭正好有某寶上買的成品延時電路,用的就是404AS芯片(記住是3按鍵的那種,4按鍵的用的新唐的單片機),把數(shù)碼管拆了,就可以利用此電路做為一個8信號檢測,無信號自動關(guān)機的成品了。 |
評分
-
查看全部評分
|