找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1890|回复: 1
收起左侧

采用AH3503的磁条检测的单片机程序

[复制链接]
ID:36789 发表于 2019-6-24 11:39 | 显示全部楼层 |阅读模式
设计思路: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

原理图

回复

使用道具 举报

ID:1 发表于 2019-6-25 02:30 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表