亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
關于單片機ADC做按鍵識別掃描的數據處理及應用
[打印本頁]
作者:
yahaotiancai
時間:
2018-5-12 00:25
標題:
關于單片機ADC做按鍵識別掃描的數據處理及應用
我在STC上仿真的時候,發現只有按鍵的鍵號可以改變,但是電壓值恒為0.151V,ADC輸入端電壓為0-5V,不知道錯誤原因啊,急急急
//程序功能說明:根據ADC轉換結果得到按鍵號,將按鍵號顯示在最左端
//同時將AD轉換的電壓值顯示在右邊四位數碼管上x.xxx,單位:V
#include "STC15Fxxxx.h"
#define delt 16 //設置ADC允許偏差
u8 code seg7[]={//標準字庫顯示段碼
// 0 1 2 3 4 5 6 7 8 9 A B C D E F H 滅
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x0};
sbit P_HC595_SER = P4^0; //pin 14 SER data input
sbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clock
sbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clock
u8 KeyNo=0; //給用戶使用的鍵碼, 1~16有效
u8 code wei[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//位選碼
u8 dsply_buf[]={0x10,0x11,0x11,0x11,5,0,0,0};//顯示緩沖區定義
u8 k=0;//
u16 adc_VAL=0;
float volt=0;
//u8 KeyNo1;
u8 KeyNo2; //鍵碼中間變量
u8 KeyNo3;
u8 ge,shi,bai,qian; // 電壓的個位/十位/百位/千位(毫伏)
void delay(u8 N); //延時N毫秒子程序
void Send_595(u8 dat); //發送一個字節數據到595
void display();//8位數碼管動態顯示
char get_KeyNo();
void mcu_int();
void delay500ms();
/**********************************************/
void main(void)
{ mcu_int();
while(1)
{ while(ADC_CONTR!=0xF4)//等待轉換完成
{}
//ADC_FLAG=1,說明轉換完成
adc_VAL=ADC_RES*256+ADC_RESL;//第一次讀取轉換結果
ADC_CONTR=0xEC;//清除ADC_FLAG,繼續轉換
if (adc_VAL>32) //轉換結果不為零,說明有按鍵按下
{ delay(3); //延時3ms,
while(ADC_CONTR!=0xF4)//等待轉換完成
{}
adc_VAL=ADC_RES*256+ADC_RESL;//第二次讀取轉換結果
ADC_CONTR=0xEC; //清除ADC_FLAG,繼續轉換
if (adc_VAL>32) //轉換結果不為零,說明確實有按鍵按下
{ KeyNo2=get_KeyNo();
NOP4();//短延時
while(ADC_CONTR!=0xF4)//等待轉換完成
{}
adc_VAL=ADC_RES*256+ADC_RESL;//第三次讀取轉換結果
ADC_CONTR=0xEC; //清除ADC_FLAG,繼續轉換
KeyNo3=get_KeyNo();
if (KeyNo2==KeyNo3)//兩次讀取鍵碼相同,說明按鍵沒有錯誤
{ //等待鍵松開
volt=(adc_VAL*5)/1.023;
while(1)
{ while(ADC_CONTR!=0xF4)//等待轉換完成
{}
adc_VAL=ADC_RES*256+ADC_RESL;//第三次讀取轉換結果
ADC_CONTR=0xEC; //清除ADC_FLAG,繼續轉換
if (adc_VAL<32)//鍵松開了,電壓低于5V×32/1023
break;
}
KeyNo=KeyNo2;
dsply_buf[0] = KeyNo / 10; //顯示鍵碼
dsply_buf[1] = KeyNo % 10; //顯示鍵碼
// dsply_buf[0]=KeyNo;
volt=(adc_VAL*5)/1.023;
adc_VAL=volt;
ge=adc_VAL%1000%100%10;
shi=adc_VAL%1000%100/10;
bai=adc_VAL%1000/100;
qian=adc_VAL/1000;
dsply_buf[7]=ge;
dsply_buf[6]=shi;
dsply_buf[5]=bai;
dsply_buf[4]=qian;
}
}
}
}
}
void mcu_int()//初始化單片機
{// 端口初始化
P0M1 = 0; P0M0 = 0; //設置為準雙向口
P1M1 = 0; P1M0 = 0; //設置為準雙向口
P2M1 = 0; P2M0 = 0; //設置為準雙向口
P3M1 = 0; P3M0 = 0; //設置為準雙向口
P4M1 = 0; P4M0 = 0; //設置為準雙向口
P5M1 = 0; P5M0 = 0; //設置為準雙向口
P6M1 = 0; P6M0 = 0; //設置為準雙向口
P7M1 = 0; P7M0 = 0; //設置為準雙向口
// 定時器T0初始化,定時4ms,模式0,16位自動重裝方式,系統時鐘12M,定時器輸入12分頻
TMOD=0x00;
TH0=0xF8;
TL0=0x30;
EA=1; //允許中斷
ET0=1; //開T0中斷
TR0=1; //啟動定時器T0
//ADC初始化
P1ASF=0x10; //選擇P14為ADC輸入通道
CLK_DIV=0x20; //ADRJ=1,10位模式,adc_val=ADC_RES*256+ADC_RESL
ADC_CONTR=0xE4; //打開ADC電源,速度90T,通道4 ADC_start位置0,轉換沒有開始
delay500ms(); //適當延時,等待內部電路穩定
ADC_CONTR=0xEC; //ADC_START=1,開始轉換
delay500ms(); //延時500ms,確保轉換電路穩定
}
void delay(u8 N) //@12.000MHz //軟件延時Nms函數
{
u8 i, j;
i = 12*N;
j = 169;
do
{
while (--j);
} while (--i);
}
void Send_595(u8 dat) // 向HC595發送一個字節函數/
{
u8 i;
for(i=0; i<8; i++)
{
dat <<= 1;
P_HC595_SER = CY;
P_HC595_SRCLK = 0;
P_HC595_SRCLK = 1;
}
}
void display() interrupt 1 //動態顯示緩沖區內容
{ u8 segcode;
TF0=0; //清除T0中斷標志
segcode=seg7[dsply_buf[k]];
if (k==4)
{
segcode=(segcode|0x80);
} //小數點位置1
Send_595(wei[k]);
Send_595(segcode);
P_HC595_RCLK = 0;
P_HC595_RCLK = 1;
k++; //指向下一位
if (k==8)
k=0;
}
char get_KeyNo() //根據adc_VAL確定按鍵號
{ u8 KeyNo1;
if ((adc_VAL>48)&&(adc_VAL<80))
{ KeyNo1=0;}
if ((adc_VAL>112)&&(adc_VAL<144))
{KeyNo1=1;}
if ((adc_VAL>176)&&(adc_VAL<208))
{KeyNo1=2;}
if ((adc_VAL>240)&&(adc_VAL<272))
{KeyNo1=3;}
if ((adc_VAL>304)&&(adc_VAL<336))
{KeyNo1=4;}
if ((adc_VAL>368)&&(adc_VAL<400))
{KeyNo1=5;}
if ((adc_VAL>432)&&(adc_VAL<464))
{KeyNo1=6;}
if ((adc_VAL>496)&&(adc_VAL<528))
{KeyNo1=7;}
if ((adc_VAL>560)&&(adc_VAL<592))
{KeyNo1=8;}
if ((adc_VAL>624)&&(adc_VAL<656))
{KeyNo1=9; }
if ((adc_VAL>688)&&(adc_VAL<720))
{KeyNo1=0xA;}
if ((adc_VAL>752)&&(adc_VAL<784))
{KeyNo1=0xB;}
if ((adc_VAL>816)&&(adc_VAL<848))
{KeyNo1=0xC;}
if ((adc_VAL>880)&&(adc_VAL<912))
{KeyNo1=0xD;}
if ((adc_VAL>944)&&(adc_VAL<976))
{KeyNo1=0xE;}
if ((adc_VAL>1007)&&(adc_VAL<=1023))
{KeyNo1=0xF;}
return KeyNo1;
}
//延時500ms
void delay500ms() //@12.000MHz
{
unsigned char l,m,n;
_nop_();
_nop_();
l = 23;
m = 205;
n = 120;
do
{
do
{
while (--n);
} while (--m);
} while (--l);
}
復制代碼
作者:
yahaotiancai
時間:
2018-5-12 00:25
希望有大佬教教我,哎做的好累
作者:
wj0755
時間:
2018-5-12 09:46
ADC 初始化,時鐘開了嗎?
作者:
yahaotiancai
時間:
2018-5-12 12:00
wj0755 發表于 2018-5-12 09:46
ADC 初始化,時鐘開了嗎?
請問是什么意思?ADC_START我開了啊,ADC_POWER也開了,我是小白不是很懂
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1