|
設計思路:1、AH3503進行檢測磁條
手焊完成后的照片
電路原理圖如下:
原理圖
2、STC15單片機檢測AH3503的電壓變化
以下為單片機程序請參照!!
#include"STC15.H"
#include"intrins.h"
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 CH_1=0;
uint16 ADC_16RES[8];
uint16 CONVERT_TEMP;
uint8 ADC_8RES=0;
uint8 COUNTER_1=0;
uint16 JUDGE_16RES[8];
sbit EEPROM_KEY=P4^5;
bit JUDGE_FLAG=0;
void delay_ms(uint16 ms)//延時函數
{
uint16 i;
while( (ms--) != 0)
{
for(i = 0; i < 600; i++);
}
}
void ADCINIT()//數模轉換寄存器 初始化函數
{
P1ASF=0XFF; //配置P1端口為模擬輸入端口
ADC_CONTR=0x88; //打開ADC轉換的電源,并且開始轉換(轉換完畢后ADC_FLAG(B4)=1; 要軟件清零,ADC_START(B3)=1開始轉換,轉換完畢后硬件置零)
ADC_RES=0X00;
ADC_RESL=0X00;
EA=1;
delay_ms(5);
EADC=1;
}
void JUDGE_8_RES()//判斷AH3503上的電壓是否高于 基準值(是否檢測到了磁條)
{
uint8 J;
uint8 K;
for(J=0,K=0x80;J<8;J++)
{
if(ADC_16RES[J]>JUDGE_16RES[J])
{
ADC_8RES|=(K>>J);
}
else
{
ADC_8RES&=~(K>>J);
}
}
P3=~ADC_8RES;
}
void EEPROM_CLOSE()//關閉STC上的自帶EEPROM
{
IAP_CONTR=0X00; //禁止IAP動作
IAP_CMD=0X00; //MS1:0 MS0:0對應的是IAP無動作
IAP_TRIG=0X00;
IAP_ADDRH=0XFF;
IAP_ADDRL=0XFF;
}
void EEPROM_ERASE(uint16 ADDR_ERASE)//擦除指定地址的EEPROM 的內容
{
IAP_CONTR=0X84;//由于我打算用11.0592M的晶振根據手冊推薦WT2:1 WT1:0 WT0:0
IAP_CMD=0X03;//MS1:1 MS0:1對應的是扇區擦除
IAP_ADDRL=ADDR_ERASE;
IAP_ADDRH=ADDR_ERASE>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
//EEPROM_CLOSE();
}
uint8 EEPROM_READ(uint16 ADDR_READ)//讀取指定地址 EEPROM中的內容
{
uint8 DATA_READ;
IAP_CONTR=0X84;//由于我打算用11.0592M的晶振根據手冊推薦WT2:1 WT1:0 WT0:0
IAP_CMD=0X01; //MS1:0 MS0:1對應的是讀取數據
IAP_ADDRL=ADDR_READ;
IAP_ADDRH=ADDR_READ>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
DATA_READ=IAP_DATA;
//EEPROM_CLOSE();
return DATA_READ;
}
void EEPROM_PROGRAM(uint16 ADDR_PROGRAM,uint8 DATA_PROGRAM) //將基準值寫入EEPROM中
{
IAP_CONTR=0X84;//由于我打算用11.0592M的晶振根據手冊推薦WT2:1 WT1:0 WT0:0
IAP_CMD=0X02; //MS1:1 MS0:0對應的是對IC進行編程(將數據寫入IC中)
IAP_ADDRL=ADDR_PROGRAM;
IAP_ADDRH=ADDR_PROGRAM>>8;
IAP_DATA=DATA_PROGRAM;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
//EEPROM_CLOSE();
}
void JUDGE_READ()//將基準值從EEPROM中讀出
{ uint8 r;
uint8 DATA_TEMP;
for(r=0;r<8;r++)
{
DATA_TEMP=EEPROM_READ(0XE600+r*2);
JUDGE_16RES[r]=EEPROM_READ(0XE600+r*2+1);
JUDGE_16RES[r]<<=8;
JUDGE_16RES[r]|=DATA_TEMP;
}
}
void JUDGE_PROGRAM()//連續寫入數據到EEPROM中
{
uint8 w;
for(w=0;w<8;w++)
{
EEPROM_PROGRAM(0XE600+w*2,(uint8)JUDGE_16RES[w]);
EEPROM_PROGRAM(0XE600+w*2+1,(uint8)(JUDGE_16RES[w]>>8));
}
}
main()
{
P2M1=0X00;//設置P2口為準雙向口
P2M0=0X00;
P3M1=0X00;//設置P3口為準雙向口
P3M0=0X00;
P4M1=0X00;//設置P4口為準雙向口
P4M0=0X00;
ADCINIT();
delay_ms(100);
if(0==EEPROM_KEY)//如果按鍵閉合將基準值寫入EEPROM中
{
JUDGE_FLAG=1;
delay_ms(1500);
EEPROM_ERASE(0XE600);
JUDGE_PROGRAM();
EEPROM_CLOSE();
}
else//如果按鍵沒有按下讀取EEPROM中的數據
{
JUDGE_FLAG=0;
JUDGE_READ();
EEPROM_CLOSE();
}
while(1)
{
JUDGE_8_RES();
}
}
void ADC_ISR()interrupt 5
{
COUNTER_1++;
if(COUNTER_1>10) //AD轉換10次后才算轉換成功
{
CONVERT_TEMP=0;
CONVERT_TEMP=ADC_RES;
CONVERT_TEMP<<=2;
CONVERT_TEMP|=ADC_RESL;
ADC_16RES[CH_1]=CONVERT_TEMP;
if(JUDGE_FLAG)//將沒有磁條是的狀態記錄在數值中
{
JUDGE_16RES[CH_1]=(ADC_16RES[CH_1]+7);
}
if(++CH_1>7){CH_1=0;}
COUNTER_1=0;
}
ADC_CONTR=0X88|CH_1;
}
|
-
-
HALL.pdf
2019-6-25 08:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
46.65 KB, 下載次數: 9, 下載積分: 黑幣 -5
原理圖
|