欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2218|回復: 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 單片機教程網

快速回復 返回頂部 返回列表