從商家那買來的RFID模塊,用52和他的歷程可以驅動
想要移植到自己的STC8H1K28上,按理來說,改變串口的初始化就可以實現
但不知道為什么總是不行。懇請各位指點
①商家代碼C52單片機的#include "reg52.h"
sbit LED1 = P2^0;
sbit LED2 = P2^1;
typedef unsigned int u16; //對系統默認數據類型進行重定義
typedef unsigned char u8;
u8 rxdatabuf[32];
u8 rxdatacnt;
/*******************************************************************************
* 函 數 名 : uart_init
* 函數功能 : 串口通信中斷配置函數,通過設置TH和TL即可確定定時時間
* 輸 入 : baud:波特率對應的TH、TL裝載值
* 輸 出 : 無
*******************************************************************************/
void uart_init(u8 baud)
{
TMOD|=0X20; //設置計數器工作方式2
SCON=0X50; //設置為工作方式1
PCON=0X80; //波特率加倍
TH1=baud; //計數器初始值設置
TL1=baud;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計數器
}
//void sendchar(u8 ch)
//{
// ES=0;
// TI=0;
// SBUF = ch;
// while(!TI); //等待發送數據完成
// TI=0; //清除發送完成標志位
// ES=1;
//}
/*******************************************************************************
* 函 數 名 : delay_10us
* 函數功能 : 延時函數,ten_us=1時,大約延時10us
* 輸 入 : ten_us
* 輸 出 : 無
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
unsigned char CheckSum(unsigned char *ptr,unsigned char len)
{
unsigned char i;
unsigned char checksum;
checksum = 0;
for(i=0;i<(len-1);i++)
{
checksum ^= ptr[ i];
}
if(ptr[len-1] == (~checksum))
return 0x01;
else
return 0x00;
}
void clean_rxdatabuf(void)
{
u8 i = 0;
rxdatacnt = 0;
for(i=0;i<32;i++)
{
rxdatabuf[ i] = 0;
}
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
u8 i;
u8 cardid[4];
rxdatacnt = 0;
uart_init(0xFA);//波特率為9600
LED1 = 1;
LED2 = 0;
delay_10us(5000);
LED1 = 0;
LED2 = 1;
while(1)
{
if(rxdatacnt > 0) //判斷串口是否收到數據
{
LED2 = 0; //接收到數據閃LED2
delay_10us(2000);//等待串口接收完畢
LED2 = 1;
if(rxdatacnt >= 12) //判斷是否收到一幀數據,自動讀卡號讀卡器送的數據包長度為12字節
{
//rxdatabuf數組中接收到的數據格式應該如下
//rxdatabuf[0]包類型,0x04表示自動讀卡返回的數據包
//rxdatabuf[1]包長度,自動讀卡號返回的數據包長度為12字節
//rxdatabuf[2]命令,0x02表示自動讀卡號,0x03表示自動讀數據塊,0x04表示自動讀卡號+數據塊
//rxdatabuf[3]讀卡器地址,默認0x20
//rxdatabuf[4]固定值0x00
//rxdatabuf[5],rxdatabuf[6]這兩個字節保存的是卡類型,比如04 00表示 M1 S50卡,02 00 表示M1 S70卡
//rxdatabuf[7],rxdatabuf[8],rxdatabuf[9],rxdatabuf[10]這個4個字節存儲的是卡號
//rxdatabuf[11]數據包校驗值,計算方式參考手冊的校驗和計算方方法或者參考本例子代碼CheckSum();
if((rxdatabuf[0] == 0x04)&&(rxdatabuf[1] == 12)&&(rxdatabuf[2] == 0x02)&&(rxdatabuf[3] == 0x20)&&(rxdatabuf[4] == 0x00))//判斷是否為讀卡器返回的數據包
{
if(CheckSum(rxdatabuf,12)) //判斷檢驗是否正確,正確返回0x01,錯誤返回0x00
{
//獲取卡號
for(i=0;i<4;i++)
{
cardid[ i] = rxdatabuf[7 + i]; //將rxdatabuf數組中的4字節卡號復制到數組cardid[]中
}
LED1 = 1; //熄滅LED
delay_10us(50000);
LED1 = 0; //點亮LED
}
}
}
clean_rxdatabuf();
}
}
}
void uart() interrupt 4 //串口通信中斷函數
{
RI = 0; //清除接收中斷標志位
rxdatabuf[rxdatacnt] = SBUF; //存儲接收到的數據
rxdatacnt++;
if(rxdatacnt >= 32) //RxDataBuf數組最大存放32字節數據,防止數組溢出
{
rxdatacnt = 0;
}
}
②我移植的代碼#include "STC8.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (256 - FOSC / 9600 / 32)
sbit LED1 = P2^0;
sbit LED2 = P2^1;
typedef unsigned int u16; //對系統默認數據類型進行重定義
typedef unsigned char u8;
u8 i;
u8 cardid[4];
bit busy;
u8 rxdatacnt;
char rptr;
char rxdatabuf[32];
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
unsigned char CheckSum(unsigned char *ptr,unsigned char len)
{
unsigned char i;
unsigned char checksum;
checksum = 0;
for(i=0;i<(len-1);i++)
{
checksum ^= ptr[ i];
}
if(ptr[len-1] == (~checksum))
return 0x01;
else
return 0x00;
}
void clean_rxdatabuf(void)
{
u8 i = 0;
rxdatacnt = 0;
for(i=0;i<32;i++)
{
rxdatabuf[ i] = 0;
}
}
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
rxdatabuf[rxdatacnt++] =SBUF;
if( rxdatacnt >=13){
RI = 0;}
if(rxdatacnt >= 32) //RxDataBuf數組最大存放32字節數據,防止數組溢出
{
rxdatacnt = 0;
}
}
}
void UartInit()
{
SCON = 0x50;
TMOD = 0x20;
TL1 = BRT;
TH1 = BRT;
TR1 = 1;
AUXR = 0x40;
rxdatacnt = 0x00;
rptr = 0x00;
busy = 0;
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
UartInit();
ES = 1;
EA = 1;
LED1 = 0;
while (1)
{
if(rxdatacnt > 0) //判斷串口是否收到數據
{
LED1 = 1;
delay_10us(1000);
if (rxdatacnt >= 12) //判斷是否收到一幀數據,自動讀卡號讀卡器送的數據包長度為12字節
{
LED2 = 0;
if((rxdatabuf[0] == 0x04)&&(rxdatabuf[1] ==0X0C)&&(rxdatabuf[2] == 0x02)&&(rxdatabuf[3] == 0x20)&&(rxdatabuf[4] == 0x00))//判斷是否為讀卡器返回的數據包
{
LED2 = 1;
if(CheckSum(rxdatabuf,12)) //判斷檢驗是否正確,正確返回0x01,錯誤返回0x00
{
//獲取卡號
for(i=0;i<4;i++)
{
cardid[ i] = rxdatabuf[7 + i]; //將rxdatabuf數組中的4字節卡號復制到數組cardid[]中
}
}
}
}
clean_rxdatabuf();
}
}
}
最后通過LED燈的狀態發現他卡在LED2=0;
不知道為什么,是數據不對還是?
我試過把接收到的數據傳到串口助手上看,數據時而是對的,時而都是000000
|