久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5983|回復: 9
打印 上一主題 下一主題
收起左側

大佬們,有人能把STC12C5A60S2的C語言程序翻譯成STC89C52的嗎?

[復制鏈接]
跳轉到指定樓層
樓主
ID:217180 發表于 2017-7-5 07:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    各位前輩,我最近在做一個用STC89C52和PN532的NFC身份識別系統,我在網上找到了一個用STC12C5A60S2做的,只是我對STC12C5A60S2了解極少,再加上我的單片機處于剛剛起步階段,所以雖然有程序但是幾乎做不到兩個單片機相互翻譯,時間催的又緊,所以說只能向各位大佬求助了,如果各位大佬能不吝賜教,晚輩在此不勝感激并將程序好好鉆研。我看看能不能把程序貼出來。
********************************************************************************
* STC12C5A60S2控制PN532進行尋卡操作
* STC12C5A60S2通過UART與PN532相連
* 通過中斷實現接收UART數據,并通過定時判斷PN532的響應是否超時
********************************************************************************/
#include "reg52.h"
#include <intrins.h>
#define ERR_NO        0
#define ERR_TIMEOUT   1
#define ERR_SENDDATA  2
#define ERR_RECVACK   3
#define ERR_RECVDATA  4
//-----------------------------UART1部分使用的全局變量---------------------------
xdata unsigned char gPn532Data[100];            //13.56M RF數據緩存
xdata unsigned char *gpPn532RxBuf, gPn532RxLen; //用于中斷函數處理接收buf
xdata unsigned char gi;     //用于接收數據與接收ack之間進行區別
//-------------------------------------------------------------------------------
unsigned char gTimeMult;
unsigned char gTimeOutFlag;
unsigned char gUart1RecvFlag;
sbit p25 = P2^5;
void C51InitIo(void)
{   
P2M0 |= 0x20;
P2M1 |= 0x00;//配置P2.5為強上拉輸出
}
//定時時間=num*25ms
void C51InitTimer(unsigned char num)
{
//AUXR |= 0xC0;//bit7->T0x12:0->12T,1->1T;bit6->T1x12:0->12T,1->1T,默認情況下是傳統8051速度
TMOD |= 0x01;
TH0 = 0x4C;
TL0 = 0x00;//0x4C00=19456,(65536-19456)*12/22118400=0.025s=25ms
gTimeMult = num;//25*40=1000ms=1s
ET0 = 1;
TR0 = 1;
}
void C51StopTimer()
{
TR0 = 0;
}
/**************************************************
Function: init_uart();
Description:
  set uart working mode,
  使用獨立波特率發生器作為波特率發生器
**************************************************/
void C51InitUart(void)
{
AUXR |= 0x18; //BRTR=1,啟動獨立波特率發生器,S2SMOD=1,串口2波特率*2,S1BRS=1,串口1使用獨立波特率發生器作為波特率發生器,S1BRS=0,串口1使用定時器1作為波特率發生器
     
SCON |= 0x50; //UART1工作于模式1(8位uart,加上起始位與停止位共10位),可變速率f=((2^SMOD)/32)*BRT,ren==1->允許串行接收
PCON |= 0x80; //smod=1,
TMOD |= 0x20; //定時器工作與方式2,由TR1控制定時器的開啟與關閉
TH1   = 0xFF; //22.1184MHz:0xF4->9600, 0xFA->19200, 0xFD->38400, 0xFE->57600, 0xFF->115200
TL1   = 0xFF;
TR1   = 1;  //啟動定時器1   
ES    = 1;     //允許串口1中斷
S2CON |= 0x50; //UART2工作于模式1(8位uart,加上起始位與停止位共10位),可變速率f=((2^S2SMOD)/32)*BRT,ren==1->允許串行接收  
BRT    = 0xF4; //BRTx12=0;0xFF->115200,0xF4->9600,0xA0->1200
IE2   |= 0x01; //允許串口2中斷
}
//串口1發送一個字節函數
void C51Uart1SendByte(unsigned char num)
{
ES = 0;  
TI = 0;
SBUF = num;
while (0==TI);
TI = 0;
ES = 1;
}
//---------串口2發送與接收一個字節函數----------
void C51Uart2SendByte(unsigned char num)
{
IE2   &= 0xFE; //允許串口2中斷,需要增加關閉、打開中斷語句,不然串口2工作不正常
S2CON = S2CON&0xFD;//清除發送中斷標志
S2BUF = num;
while (0==(S2CON&0x02));//等于1說明發送完成
S2CON = S2CON&0xFD;//清除發送中斷標志
IE2   |= 0x01; //允許串口2中斷
}
//延時n*1us函數
void C51Delay1us(unsigned short n)
{
while (--n)
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}
}
/*****************************************************************
* 函數名:  PN532SendData
* 函數功能:主控器向PN532發送數據
* 輸入參數:
pBuf:需要發送給PN532的幀數據
len: pBuf的長度
* 輸出參數:
        返回是否成功標志
            成功:SUCCESS
            失敗:相應的錯誤代碼
********************************************************************/
unsigned char PN532SendData(unsigned char *pBuf, unsigned char len)
{
unsigned char i;
WDT_CONTR = 0x3F;
for (i=0; i<len; i++)
{
  C51Uart1SendByte(pBuf);
}      
    return ERR_NO;
}
/***************************************************
* 函數名:  PN532RecvData
* 函數功能:主控器從PN532接收數據
* 輸入參數:
        
* 輸出參數:
        pBuf:
            接收幀緩存
        返回是否成功標志
            成功:SUCCESS
            失敗:相應的錯誤代碼
***************************************************/
unsigned char PN532RecvData(unsigned char *pBuf)
{  
gTimeOutFlag = 0;
gUart1RecvFlag = 0;
C51InitTimer(4);
gpPn532RxBuf = pBuf;        //Start of RX buffer
    gPn532RxLen = 6;            // Load RX byte counter
gi = 0;
while (!(gTimeOutFlag||gUart1RecvFlag));//只要有一個為1則退出循環
C51StopTimer();
if (1==gUart1RecvFlag)
{
     return ERR_NO;
}
else
{
  return ERR_TIMEOUT;
}
}
/****************************************
* 函數名:  PN532SendAck
* 函數功能:主控器向PN532發送ACK幀
* 輸入參數:
* 輸出參數:
        返回是否成功標志
            成功:SUCCESS
            失敗:相應的錯誤代碼
*****************************************/
unsigned char PN532SendAck()
{  
unsigned char pAckBuf[6] = {0x00,0x00,0xFF,0x00,0xFF,0x00};
unsigned char i;
for (i=0; i<6; i++)
{
  C51Uart1SendByte(pAckBuf);
}   
    return ERR_NO;
}
/***********************************************
* 函數名:  PN532RecvAck
* 函數功能:主控器從PN532接收ACK幀
* 輸入參數:
* 輸出參數:
        pBuf:
            接收ACK幀緩存
        返回是否成功標志
            成功:SUCCESS
            失敗:相應的錯誤代碼
*************************************************/
unsigned char PN532RecvAck(unsigned char *pBuf)
{  
gTimeOutFlag = 0;
gUart1RecvFlag = 0;
C51InitTimer(1);
gpPn532RxBuf = pBuf;        //Start of RX buffer
    gPn532RxLen = 6;            // Load RX byte counter
gi = 0;
while (!(gTimeOutFlag||gUart1RecvFlag));//只要有一個為1則退出循環
C51StopTimer();
if (1==gUart1RecvFlag)
{
     return ERR_NO;
}
else
{
  return ERR_TIMEOUT;
}
}
/*********************************************************************************************************
* 函數名:  SAMConfiguration
* 函數功能:設置PN532的內部參數
* 輸入參數:
mode:
      0x01:normal mode
      0x02:virtual mode
      0x03:wired mode
      0x04:dual mode
timeout:
      0x00:不使用timeout
      0x01-0xFF:超時值
irq:
      0x00:不使用P70_IRQ
      0x01:使用P70_IRQ
* 輸出參數:
成功:ERR_NO
        失敗:ERR_RECVACK,ERR_RECVDATA
* 輸入輸出參數:
        pRfBuf:輸入,用于存放輸入參數的緩存,從外部傳入,用于解決在函數內部定義過大的數組問題
                輸出,存放從PN532接收的結果
**********************************************************************************************************/
unsigned char SAMConfiguration(unsigned char *pRfBuf, unsigned char mode, unsigned char timeout, unsigned char irq)
{
    unsigned char temp;
    unsigned char s;
    pRfBuf[0] = 0x00; //前導碼
    pRfBuf[1] = 0x00; //包開始標志2個字節
    pRfBuf[2] = 0xFF;
    pRfBuf[3] = 3 + 1 + 1;//len + 1字節的PD0 + 1字節的TFI
    pRfBuf[4] = 0x100-pRfBuf[3];
    pRfBuf[5] = 0xD4; //方向標示
    temp = pRfBuf[5];
    pRfBuf[6] = 0x14; //命令碼
    temp += pRfBuf[6];
    pRfBuf[7] = mode;
    temp += pRfBuf[7];
    pRfBuf[8] = timeout;
    temp += pRfBuf[8];
    pRfBuf[9] = irq;
    temp += pRfBuf[9];
   
    pRfBuf[10] = 0x100 - temp; //DCS
    pRfBuf[11] = 0x00;
   
    //底層發送函數
    s = PN532SendData(pRfBuf,12);
    if (s!=ERR_NO)
    {
        return ERR_SENDDATA;
    }
    s = PN532RecvAck(pRfBuf);
    if (s!=ERR_NO)
    {
        return ERR_RECVACK;
    }
    s = PN532RecvData(pRfBuf);
    if (s!=ERR_NO)
    {
        return ERR_RECVDATA;
    }
   
    return ERR_NO;
}
/****************************************************************************************
* 函數名:  InListPassiveTarget
* 函數功能:PN532檢測卡
* 輸入參數:
maxTag:
            PN532最大初始化卡的個數,PN532一次只能同時處理2張卡         
brty:
            0x00 : 106 kbps type A (ISO/IEC14443 Type A),
            0x01 : 212 kbps (FeliCa polling),
            0x02 : 424 kbps (FeliCa polling),
            0x03 : 106 kbps type B (ISO/IEC14443-3B),
            0x04 : 106 kbps Innovision Jewel tag.
        pData:
* 輸出參數:
成功:ERR_NO
        失敗:ERR_RECVACK,ERR_RECVDATA
* 輸入輸出參數:
        pRfBuf:輸入,用于存放輸入參數的緩存,從外部傳入,用于解決在函數內部定義過大的數組問題
                輸出,存放從PN532接收的結果
*****************************************************************************************/
unsigned char InListPassiveTarget(unsigned char *pRfBuf, unsigned char maxTag, unsigned char brty,
                                  unsigned char *pData, unsigned char len)
{
    unsigned char i,temp;
    unsigned char s;
    pRfBuf[0] = 0x00; //前導碼
    pRfBuf[1] = 0x00; //包開始標志2個字節
    pRfBuf[2] = 0xFF;
    pRfBuf[3] = len + 1 + 1 + 1 + 1;//len + 1字節的maxTag + 1字節的brty + 1字節的PD0 + 1字節的TFI
    pRfBuf[4] = 0x100-pRfBuf[3];
    pRfBuf[5] = 0xD4; //方向標示
    temp = pRfBuf[5];
    pRfBuf[6] = 0x4A; //命令碼
    temp += pRfBuf[6];
    pRfBuf[7] = maxTag;
    temp += pRfBuf[7];
    pRfBuf[8] = brty;
    temp += pRfBuf[8];
   
    for (i=0; i<len; i++)
    {
        pRfBuf[9+i] = pData;
        temp  += pData;
    }
   
    pRfBuf[9+i] = 0x100 - temp; //DCS
    pRfBuf[9+i+1] = 0x00;
   
    //底層發送函數   
    s = PN532SendData(pRfBuf,9+i+1+1);
    if (s!=ERR_NO)
    {
        return ERR_SENDDATA;
    }
    s = PN532RecvAck(pRfBuf);
    if (s!=ERR_NO)
    {
        return ERR_RECVACK;
    }
    s = PN532RecvData(pRfBuf);
    if (s!=ERR_NO)
    {
        return ERR_RECVDATA;
    }
   
    return ERR_NO;
}
        
void main()
{
unsigned char i,s;
C51InitIo();
C51InitUart();
     
WDT_CONTR = 0x3F;//使能看門狗、清看門狗標志、空閑模式計數、分頻系數(scale:bit2-bit0),溢出時間=(12*scale*32768)/Fosc
   
EA = 1;   //cpu中斷總允許
p25 = 0;
C51Delay1us(60000);
C51Delay1us(60000);
C51Delay1us(60000);
C51Delay1us(60000);
C51Delay1us(60000);
p25 = 1;
gTimeOutFlag = 0;
gUart1RecvFlag = 0;
//--------------喚醒PN532----------------
C51Uart1SendByte(0x55);
C51Uart1SendByte(0x55);
C51Uart1SendByte(0x00);
C51Uart1SendByte(0x00);
C51Uart1SendByte(0x00);
SAMConfiguration(gPn532Data,1,0,1);
for (i=0; i<gPn532Data[3]+7; i++)
{
  C51Uart2SendByte(gPn532Data);
}
//---------------------------------------
while(1)
{
  WDT_CONTR = 0x3F;
  
  s = InListPassiveTarget(gPn532Data,1,0,0,0);
  if (ERR_NO==s)
  {
   for (i=0; i<gPn532Data[3]+7; i++)
   {
    C51Uart2SendByte(gPn532Data);
   }
   p25 = 0;
   C51Delay1us(60000);
   C51Delay1us(60000);
   C51Delay1us(60000);
   C51Delay1us(60000);
   C51Delay1us(60000);
   p25 = 1;
  }
}
}
//串口中斷服務程序
void Uart1IsrHandler(void) interrupt 4
{
if (RI)
{
  RI = 0;  
  gPn532RxLen--;
  if (gPn532RxLen)
  {
   *gpPn532RxBuf = SBUF;
   
   gi++;
   if (gi==4)
   {
    if (0x00==*gpPn532RxBuf)//由于ACK幀與普通幀有一定的區別,所以要區別對待
    {
     gPn532RxLen = *gpPn532RxBuf + 2;  //接收ACK
    }
    else
    {
     gPn532RxLen = *gpPn532RxBuf + 3;  //包長度 + 1字節的包長度校驗 + 1字節的數據校驗 + 1字節的后導碼
    }
   }
   
   gpPn532RxBuf++;
  }
  else
  {
   *gpPn532RxBuf = SBUF;
   gUart1RecvFlag = 1;
  }  
}
if (TI)
{         
  TI = 0;
}
}
void Timer0IsrHandler(void) interrupt 1
{
TH0 = 0x4C;
TL0 = 0x00;
if (--gTimeMult)
  return;
gTimeOutFlag = 1;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:47286 發表于 2017-7-5 11:21 | 只看該作者
干嘛翻譯啊 12C5A比89C先進很多啊 你干嘛非用舊東西 拋開其它功能不說至少12c是1t的 89c是12t的 相同工作頻率下速度快些

你只需要了解一下12c的1t寄存器和管腳配置就行了 其它和89c一樣的 真心覺得沒必要改

要翻譯也最好你自己來 一方面可以增加自己的知識 另一方面 這種翻譯還不如重新寫一個呢 先要看懂人家的思路 再修改 麻煩
回復

使用道具 舉報

板凳
ID:99130 發表于 2017-7-5 13:12 | 只看該作者
沒必要翻譯 基本可以通用的 60S2比C52更高級,更好用
回復

使用道具 舉報

地板
ID:105206 發表于 2017-7-5 14:13 | 只看該作者
有幾點要改,STC12是1T單片機,就是每1個時鐘加1;是51的12倍。
1:時鐘要改,延時函數要改。
2:定時器要改,波特率要改。
3:頭文件要改。
回復

使用道具 舉報

5#
ID:213173 發表于 2017-7-5 14:14 | 只看該作者
看了你這程序,完全可以用于STC89C52,因為沒有用到STC89C52沒有的特殊寄存器,只是兩款單片機的速度不同,但定時器0和定時器1的設置都使用12T,所以不會影響定時時間和波特率。其實STC89C52也可以提速到6T。
回復

使用道具 舉報

6#
ID:217180 發表于 2017-7-6 12:51 | 只看該作者
謝謝各位指點
回復

使用道具 舉報

7#
ID:214223 發表于 2017-7-6 18:40 | 只看該作者
完全沒必要啊!
回復

使用道具 舉報

8#
ID:137736 發表于 2017-7-6 23:34 | 只看該作者
看STC手冊,主要對比二者速度,牽涉到延時。特殊寄存器,牽涉到功能。先改掉包含的頭文件。從頭至尾閱讀程序。
回復

使用道具 舉報

9#
ID:159139 發表于 2017-7-7 13:26 來自手機 | 只看該作者
你就用12做了,如果改89C52,主要改延時部分。
回復

使用道具 舉報

10#
ID:217985 發表于 2017-7-7 20:10 | 只看該作者
沒有必要翻譯啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美a在线 | 91在线观| 久久久久国产视频 | 视频在线一区二区 | av在线播放网址 | 精品一区国产 | 亚洲免费视频网站 | 久久日韩精品一区二区三区 | 欧美日韩在线精品 | 无码一区二区三区视频 | 精品免费国产视频 | 男女免费观看在线爽爽爽视频 | 伊人久久综合影院 | 在线播放国产一区二区三区 | 国产精品国产馆在线真实露脸 | 日韩视频中文字幕 | 精品久久久一区二区 | 精品久草| 成人精品在线视频 | 精品美女在线观看视频在线观看 | 亚洲国产91 | 欧美日韩精品在线免费观看 | 97色在线观看免费视频 | 久久亚洲国产 | 精品亚洲一区二区三区 | 亚洲国产精品一区 | 国产日韩欧美在线观看 | 色视频一区二区 | 日韩电影免费在线观看中文字幕 | 欧美精品一二三 | 国产精品久久久久一区二区三区 | 国产精品成人一区二区三区夜夜夜 | 久久99国产精品 | 亚洲一区在线观看视频 | 日本精品视频在线观看 | 日韩在线免费视频 | 亚洲三级av | 美国a级毛片免费视频 | 久久99精品视频 | 正在播放国产精品 | 51ⅴ精品国产91久久久久久 |