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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5937|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:217180 發(fā)表于 2017-7-5 07:34 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
    各位前輩,我最近在做一個(gè)用STC89C52和PN532的NFC身份識(shí)別系統(tǒng),我在網(wǎng)上找到了一個(gè)用STC12C5A60S2做的,只是我對(duì)STC12C5A60S2了解極少,再加上我的單片機(jī)處于剛剛起步階段,所以雖然有程序但是幾乎做不到兩個(gè)單片機(jī)相互翻譯,時(shí)間催的又緊,所以說(shuō)只能向各位大佬求助了,如果各位大佬能不吝賜教,晚輩在此不勝感激并將程序好好鉆研。我看看能不能把程序貼出來(lái)。
********************************************************************************
* STC12C5A60S2控制PN532進(jìn)行尋卡操作
* STC12C5A60S2通過(guò)UART與PN532相連
* 通過(guò)中斷實(shí)現(xiàn)接收UART數(shù)據(jù),并通過(guò)定時(shí)判斷PN532的響應(yīng)是否超時(shí)
********************************************************************************/
#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數(shù)據(jù)緩存
xdata unsigned char *gpPn532RxBuf, gPn532RxLen; //用于中斷函數(shù)處理接收buf
xdata unsigned char gi;     //用于接收數(shù)據(jù)與接收ack之間進(jìn)行區(qū)別
//-------------------------------------------------------------------------------
unsigned char gTimeMult;
unsigned char gTimeOutFlag;
unsigned char gUart1RecvFlag;
sbit p25 = P2^5;
void C51InitIo(void)
{   
P2M0 |= 0x20;
P2M1 |= 0x00;//配置P2.5為強(qiáng)上拉輸出
}
//定時(shí)時(shí)間=num*25ms
void C51InitTimer(unsigned char num)
{
//AUXR |= 0xC0;//bit7->T0x12:0->12T,1->1T;bit6->T1x12:0->12T,1->1T,默認(rèn)情況下是傳統(tǒng)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,
  使用獨(dú)立波特率發(fā)生器作為波特率發(fā)生器
**************************************************/
void C51InitUart(void)
{
AUXR |= 0x18; //BRTR=1,啟動(dòng)獨(dú)立波特率發(fā)生器,S2SMOD=1,串口2波特率*2,S1BRS=1,串口1使用獨(dú)立波特率發(fā)生器作為波特率發(fā)生器,S1BRS=0,串口1使用定時(shí)器1作為波特率發(fā)生器
     
SCON |= 0x50; //UART1工作于模式1(8位uart,加上起始位與停止位共10位),可變速率f=((2^SMOD)/32)*BRT,ren==1->允許串行接收
PCON |= 0x80; //smod=1,
TMOD |= 0x20; //定時(shí)器工作與方式2,由TR1控制定時(shí)器的開(kāi)啟與關(guān)閉
TH1   = 0xFF; //22.1184MHz:0xF4->9600, 0xFA->19200, 0xFD->38400, 0xFE->57600, 0xFF->115200
TL1   = 0xFF;
TR1   = 1;  //啟動(dòng)定時(shí)器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發(fā)送一個(gè)字節(jié)函數(shù)
void C51Uart1SendByte(unsigned char num)
{
ES = 0;  
TI = 0;
SBUF = num;
while (0==TI);
TI = 0;
ES = 1;
}
//---------串口2發(fā)送與接收一個(gè)字節(jié)函數(shù)----------
void C51Uart2SendByte(unsigned char num)
{
IE2   &= 0xFE; //允許串口2中斷,需要增加關(guān)閉、打開(kāi)中斷語(yǔ)句,不然串口2工作不正常
S2CON = S2CON&0xFD;//清除發(fā)送中斷標(biāo)志
S2BUF = num;
while (0==(S2CON&0x02));//等于1說(shuō)明發(fā)送完成
S2CON = S2CON&0xFD;//清除發(fā)送中斷標(biāo)志
IE2   |= 0x01; //允許串口2中斷
}
//延時(shí)n*1us函數(shù)
void C51Delay1us(unsigned short n)
{
while (--n)
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}
}
/*****************************************************************
* 函數(shù)名:  PN532SendData
* 函數(shù)功能:主控器向PN532發(fā)送數(shù)據(jù)
* 輸入?yún)?shù):
pBuf:需要發(fā)送給PN532的幀數(shù)據(jù)
len: pBuf的長(zhǎng)度
* 輸出參數(shù):
        返回是否成功標(biāo)志
            成功:SUCCESS
            失敗:相應(yīng)的錯(cuò)誤代碼
********************************************************************/
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;
}
/***************************************************
* 函數(shù)名:  PN532RecvData
* 函數(shù)功能:主控器從PN532接收數(shù)據(jù)
* 輸入?yún)?shù):
        無(wú)
* 輸出參數(shù):
        pBuf:
            接收幀緩存
        返回是否成功標(biāo)志
            成功:SUCCESS
            失敗:相應(yīng)的錯(cuò)誤代碼
***************************************************/
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));//只要有一個(gè)為1則退出循環(huán)
C51StopTimer();
if (1==gUart1RecvFlag)
{
     return ERR_NO;
}
else
{
  return ERR_TIMEOUT;
}
}
/****************************************
* 函數(shù)名:  PN532SendAck
* 函數(shù)功能:主控器向PN532發(fā)送ACK幀
* 輸入?yún)?shù):
無(wú)
* 輸出參數(shù):
        返回是否成功標(biāo)志
            成功:SUCCESS
            失敗:相應(yīng)的錯(cuò)誤代碼
*****************************************/
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;
}
/***********************************************
* 函數(shù)名:  PN532RecvAck
* 函數(shù)功能:主控器從PN532接收ACK幀
* 輸入?yún)?shù):
無(wú)
* 輸出參數(shù):
        pBuf:
            接收ACK幀緩存
        返回是否成功標(biāo)志
            成功:SUCCESS
            失敗:相應(yīng)的錯(cuò)誤代碼
*************************************************/
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));//只要有一個(gè)為1則退出循環(huán)
C51StopTimer();
if (1==gUart1RecvFlag)
{
     return ERR_NO;
}
else
{
  return ERR_TIMEOUT;
}
}
/*********************************************************************************************************
* 函數(shù)名:  SAMConfiguration
* 函數(shù)功能:設(shè)置PN532的內(nèi)部參數(shù)
* 輸入?yún)?shù):
mode:
      0x01:normal mode
      0x02:virtual mode
      0x03:wired mode
      0x04:dual mode
timeout:
      0x00:不使用timeout
      0x01-0xFF:超時(shí)值
irq:
      0x00:不使用P70_IRQ
      0x01:使用P70_IRQ
* 輸出參數(shù):
成功:ERR_NO
        失敗:ERR_RECVACK,ERR_RECVDATA
* 輸入輸出參數(shù):
        pRfBuf:輸入,用于存放輸入?yún)?shù)的緩存,從外部傳入,用于解決在函數(shù)內(nèi)部定義過(guò)大的數(shù)組問(wèn)題
                輸出,存放從PN532接收的結(jié)果
**********************************************************************************************************/
unsigned char SAMConfiguration(unsigned char *pRfBuf, unsigned char mode, unsigned char timeout, unsigned char irq)
{
    unsigned char temp;
    unsigned char s;
    pRfBuf[0] = 0x00; //前導(dǎo)碼
    pRfBuf[1] = 0x00; //包開(kāi)始標(biāo)志2個(gè)字節(jié)
    pRfBuf[2] = 0xFF;
    pRfBuf[3] = 3 + 1 + 1;//len + 1字節(jié)的PD0 + 1字節(jié)的TFI
    pRfBuf[4] = 0x100-pRfBuf[3];
    pRfBuf[5] = 0xD4; //方向標(biāo)示
    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;
   
    //底層發(fā)送函數(shù)
    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;
}
/****************************************************************************************
* 函數(shù)名:  InListPassiveTarget
* 函數(shù)功能:PN532檢測(cè)卡
* 輸入?yún)?shù):
maxTag:
            PN532最大初始化卡的個(gè)數(shù),PN532一次只能同時(shí)處理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:
* 輸出參數(shù):
成功:ERR_NO
        失敗:ERR_RECVACK,ERR_RECVDATA
* 輸入輸出參數(shù):
        pRfBuf:輸入,用于存放輸入?yún)?shù)的緩存,從外部傳入,用于解決在函數(shù)內(nèi)部定義過(guò)大的數(shù)組問(wèn)題
                輸出,存放從PN532接收的結(jié)果
*****************************************************************************************/
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; //前導(dǎo)碼
    pRfBuf[1] = 0x00; //包開(kāi)始標(biāo)志2個(gè)字節(jié)
    pRfBuf[2] = 0xFF;
    pRfBuf[3] = len + 1 + 1 + 1 + 1;//len + 1字節(jié)的maxTag + 1字節(jié)的brty + 1字節(jié)的PD0 + 1字節(jié)的TFI
    pRfBuf[4] = 0x100-pRfBuf[3];
    pRfBuf[5] = 0xD4; //方向標(biāo)示
    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;
   
    //底層發(fā)送函數(shù)   
    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;//使能看門狗、清看門狗標(biāo)志、空閑模式計(jì)數(shù)、分頻系數(shù)(scale:bit2-bit0),溢出時(shí)間=(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;
  }
}
}
//串口中斷服務(wù)程序
void Uart1IsrHandler(void) interrupt 4
{
if (RI)
{
  RI = 0;  
  gPn532RxLen--;
  if (gPn532RxLen)
  {
   *gpPn532RxBuf = SBUF;
   
   gi++;
   if (gi==4)
   {
    if (0x00==*gpPn532RxBuf)//由于ACK幀與普通幀有一定的區(qū)別,所以要區(qū)別對(duì)待
    {
     gPn532RxLen = *gpPn532RxBuf + 2;  //接收ACK
    }
    else
    {
     gPn532RxLen = *gpPn532RxBuf + 3;  //包長(zhǎng)度 + 1字節(jié)的包長(zhǎng)度校驗(yàn) + 1字節(jié)的數(shù)據(jù)校驗(yàn) + 1字節(jié)的后導(dǎo)碼
    }
   }
   
   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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2017-7-5 14:14 | 只看該作者
看了你這程序,完全可以用于STC89C52,因?yàn)闆](méi)有用到STC89C52沒(méi)有的特殊寄存器,只是兩款單片機(jī)的速度不同,但定時(shí)器0和定時(shí)器1的設(shè)置都使用12T,所以不會(huì)影響定時(shí)時(shí)間和波特率。其實(shí)STC89C52也可以提速到6T。
回復(fù)

使用道具 舉報(bào)

6#
ID:217180 發(fā)表于 2017-7-6 12:51 | 只看該作者
謝謝各位指點(diǎn)
回復(fù)

使用道具 舉報(bào)

7#
ID:214223 發(fā)表于 2017-7-6 18:40 | 只看該作者
完全沒(méi)必要啊!
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

9#
ID:159139 發(fā)表于 2017-7-7 13:26 來(lái)自手機(jī) | 只看該作者
你就用12做了,如果改89C52,主要改延時(shí)部分。
回復(fù)

使用道具 舉報(bào)

10#
ID:217985 發(fā)表于 2017-7-7 20:10 | 只看該作者
沒(méi)有必要翻譯啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久成人精品 | 夜夜夜操| 91综合在线视频 | 国产精品欧美一区二区 | 中文字幕一区二区三区四区五区 | 成人中文字幕在线观看 | 久久免费精品 | 亚洲精品九九 | 成人视屏在线观看 | 日韩一区二区三区视频在线观看 | 免费高潮视频95在线观看网站 | 国户精品久久久久久久久久久不卡 | 精品久久久网站 | 国产免费看 | 天堂资源| 99精品久久久久久中文字幕 | 免费视频一区 | 精品美女久久久久久免费 | 色综合色综合色综合 | 国产免费一区二区三区最新6 | 午夜在线影院 | 午夜网| 免费1区2区3区 | 日本免费一区二区三区视频 | 精品国产一区二区三区观看不卡 | 久在线 | 欧美一区二区视频 | 国产精品久久久久久久久图文区 | 91精品中文字幕一区二区三区 | 中文字幕一级 | 成人久久久 | 精品免费国产一区二区三区 | 国产精品国产a级 | 欧美精品一区在线 | 午夜精品福利视频 | 国产1区2区3区 | jdav视频在线观看免费 | 免费视频一区二区 | 日韩欧美国产一区二区三区 | 国产精品成人一区二区三区夜夜夜 | 久久九精品 |