|
设计思路: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
46.65 KB, 下载次数: 9, 下载积分: 黑币 -5
原理图
|