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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于RFID程序移植問題,從12T到1T單片機

[復制鏈接]
跳轉到指定樓層
樓主
ID:887186 發表于 2022-4-12 20:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
從商家那買來的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

最佳答案

查看完整內容

兩者速度不同,端口模式寄存器、定時器工作模式寄存器也有所不同,主要修改這三項即可。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2022-4-12 20:02 | 只看該作者
一夜暴富 發表于 2022-4-13 09:43
我串口中斷的設置是直接照著例程寫下來的。
不知道應該怎么修改比較好

兩者速度不同,端口模式寄存器、定時器工作模式寄存器也有所不同,主要修改這三項即可。
  1. //#include "reg52.h"
  2. #include "STC8.h"

  3. sbit LED1 = P2^0;
  4. sbit LED2 = P2^1;

  5. typedef unsigned int u16;        //對系統默認數據類型進行重定義
  6. typedef unsigned char u8;

  7. u8 rxdatabuf[32];
  8. u8 rxdatacnt;

  9. /*******************************************************************************
  10. * 函 數 名       : uart_init
  11. * 函數功能       : 串口通信中斷配置函數,通過設置TH和TL即可確定定時時間
  12. * 輸    入       : baud:波特率對應的TH、TL裝載值
  13. * 輸    出             : 無
  14. *******************************************************************************/
  15. /*
  16. void uart_init(u8 baud)
  17. {
  18. TMOD|=0X20;        //設置計數器工作方式2
  19. SCON=0X50;        //設置為工作方式1
  20. PCON=0X80;        //波特率加倍
  21. TH1=baud;        //計數器初始值設置
  22. TL1=baud;
  23. ES=1;                //打開接收中斷
  24. EA=1;                //打開總中斷
  25. TR1=1;                //打開計數器               
  26. }*/
  27. void uart_init(void)                //9600bps@11.0592MHz
  28. {
  29.         SCON = 0x50;                //8位數據,可變波特率
  30.         AUXR |= 0x40;                //定時器時鐘1T模式
  31.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  32.         TMOD &= 0x0F;                //設置定時器模式
  33.         TL1 = 0xE0;                //設置定時初始值
  34.         TH1 = 0xFE;                //設置定時初始值
  35.         ET1 = 0;                //禁止定時器%d中斷
  36.         ES=1;        //打開接收中斷
  37.         EA=1;         //打開總中斷
  38.         TR1 = 1;                //定時器1開始計時
  39. }

  40. //void sendchar(u8 ch)
  41. //{
  42. //  ES=0;
  43. //  TI=0;
  44. //        SBUF = ch;
  45. //        while(!TI);                //等待發送數據完成
  46. //        TI=0;                        //清除發送完成標志位
  47. //        ES=1;
  48. //}
  49. /*******************************************************************************
  50. * 函 數 名       : delay_10us
  51. * 函數功能       : 延時函數,ten_us=1時,大約延時10us
  52. * 輸    入       : ten_us
  53. * 輸    出             : 無
  54. *******************************************************************************/
  55. /*
  56. void delay_10us(u16 ten_us)
  57. {
  58.         while(ten_us--);        
  59. }
  60. */
  61. void delay_10us(u16 ten_us)
  62. {
  63.         u16 i;
  64.         while(ten_us--)      
  65.         {
  66.                 for(i=10;i>0;i--);
  67.         }
  68. }

  69. unsigned char CheckSum(unsigned char *ptr,unsigned char len)
  70. {
  71.         unsigned char i;
  72.         unsigned char checksum;
  73.         checksum = 0;
  74.         for(i=0;i<(len-1);i++)
  75.         {
  76.                 checksum ^= ptr[ i];
  77.         }
  78.         if(ptr[len-1] == (~checksum))
  79.                 return         0x01;
  80.         else
  81.                 return         0x00;
  82. }

  83. void clean_rxdatabuf(void)
  84. {
  85.         u8 i = 0;
  86.         rxdatacnt = 0;
  87.         for(i=0;i<32;i++)
  88.         {
  89.                 rxdatabuf[ i] = 0;
  90.         }
  91. }
  92. /*******************************************************************************
  93. * 函 數 名       : main
  94. * 函數功能                 : 主函數
  95. * 輸    入       : 無
  96. * 輸    出             : 無
  97. *******************************************************************************/
  98. void main()
  99. {        
  100.         u8 i;
  101.         u8 cardid[4];
  102.         P0M0 = 0x00;
  103.         P0M1 = 0x00;
  104.         P1M0 = 0x00;
  105.         P1M1 = 0x00;
  106.         P2M0 = 0x00;
  107.         P2M1 = 0x00;
  108.         P3M0 = 0x00;
  109.         P3M1 = 0x00;
  110.         P4M0 = 0x00;
  111.         P4M1 = 0x00;
  112.         P5M0 = 0x00;
  113.         P5M1 = 0x00;
  114.         rxdatacnt = 0;
  115.         //uart_init(0xFA);//波特率為9600
  116.         uart_init();//波特率為9600
  117.         LED1 = 1;
  118.         LED2 = 0;
  119.         delay_10us(5000);
  120.         LED1 = 0;
  121.         LED2 = 1;
  122.         while(1)
  123.         {        
  124.                 if(rxdatacnt > 0) //判斷串口是否收到數據
  125.                 {        
  126.                         LED2 = 0;        //接收到數據閃LED2
  127.                         delay_10us(2000);//等待串口接收完畢
  128.                         LED2 = 1;
  129.                         if(rxdatacnt >= 12) //判斷是否收到一幀數據,自動讀卡號讀卡器送的數據包長度為12字節
  130.                         {
  131.                                 //rxdatabuf數組中接收到的數據格式應該如下
  132.                                 //rxdatabuf[0]包類型,0x04表示自動讀卡返回的數據包
  133.                                 //rxdatabuf[1]包長度,自動讀卡號返回的數據包長度為12字節
  134.                                 //rxdatabuf[2]命令,0x02表示自動讀卡號,0x03表示自動讀數據塊,0x04表示自動讀卡號+數據塊
  135.                                 //rxdatabuf[3]讀卡器地址,默認0x20
  136.                                 //rxdatabuf[4]固定值0x00
  137.                                 //rxdatabuf[5],rxdatabuf[6]這兩個字節保存的是卡類型,比如04 00表示 M1 S50卡,02 00 表示M1 S70卡
  138.                                 //rxdatabuf[7],rxdatabuf[8],rxdatabuf[9],rxdatabuf[10]這個4個字節存儲的是卡號
  139.                                 //rxdatabuf[11]數據包校驗值,計算方式參考手冊的校驗和計算方方法或者參考本例子代碼CheckSum();
  140.                                 if((rxdatabuf[0] == 0x04)&&(rxdatabuf[1] == 12)&&(rxdatabuf[2] == 0x02)&&(rxdatabuf[3] == 0x20)&&(rxdatabuf[4] == 0x00))//判斷是否為讀卡器返回的數據包
  141.                                 {
  142.                                         if(CheckSum(rxdatabuf,12))         //判斷檢驗是否正確,正確返回0x01,錯誤返回0x00
  143.                                         {
  144.                                                 //獲取卡號
  145.                                                 for(i=0;i<4;i++)
  146.                                                 {
  147.                                                         cardid[ i] = rxdatabuf[7 + i]; //將rxdatabuf數組中的4字節卡號復制到數組cardid[]中
  148.                                                 }
  149.                                                 LED1 = 1;                //熄滅LED
  150.                                                 delay_10us(50000);
  151.                                                 LED1 = 0;                //點亮LED
  152.                                         }
  153.                                 }
  154.                         }
  155.                         clean_rxdatabuf();
  156.                 }                                
  157.         }               
  158. }

  159. void uart() interrupt 4 //串口通信中斷函數
  160. {
  161.         RI = 0;                        //清除接收中斷標志位
  162.         rxdatabuf[rxdatacnt] = SBUF;         //存儲接收到的數據
  163.         rxdatacnt++;
  164.         if(rxdatacnt >= 32)                //RxDataBuf數組最大存放32字節數據,防止數組溢出
  165.         {
  166.                 rxdatacnt = 0;
  167.         }
  168. }
復制代碼
回復

使用道具 舉報

板凳
ID:584814 發表于 2022-4-13 08:49 | 只看該作者
無非是速度不同,可能有中斷設置不一樣。
看器件手冊,重點是中斷設置和延時調整。
回復

使用道具 舉報

地板
ID:887186 發表于 2022-4-13 09:43 | 只看該作者
man1234567 發表于 2022-4-13 08:49
無非是速度不同,可能有中斷設置不一樣。
看器件手冊,重點是中斷設置和延時調整。

我串口中斷的設置是直接照著例程寫下來的。
不知道應該怎么修改比較好
回復

使用道具 舉報

5#
ID:887186 發表于 2022-4-13 09:57 | 只看該作者
發現只能接收到頭字符0X04
但是按理來說他應該接受完數據放進數組里的。。
是我的代碼哪里寫的不對嗎
希望各位能幫忙看看
回復

使用道具 舉報

6#
ID:887186 發表于 2022-4-13 10:13 | 只看該作者
好像搞定了各位,
不知道為什么他C52里串口中斷加if判定沒關系,不影響字節接受
但是STC8在串口中斷加了if判斷就只接收到幀頭
非常之神奇
回復

使用道具 舉報

7#
ID:161164 發表于 2022-4-13 10:40 | 只看該作者
新代碼中的delay_10us(1000);耗時大約是1.3ms
9600bps = 1200Byte/s
即每一byte耗時0.833ms
12Byte需要10ms
所以把delay_10us(1000);改為delay_10us(10000);試試看

但不建議再用阻塞式延時
一來不準確
二來浪費單片機資源
回復

使用道具 舉報

8#
ID:887186 發表于 2022-4-13 14:14 | 只看該作者
lkc8210 發表于 2022-4-13 10:40
新代碼中的delay_10us(1000);耗時大約是1.3ms
9600bps = 1200Byte/s
即每一byte耗時0.833ms

明白了,感謝,順便想再請教一下用什么方法比較合適。
然后我發現好像事因為我在接收中斷里加了if判定導致數據只接受一個字節
或許這有什么講究?
回復

使用道具 舉報

9#
ID:887186 發表于 2022-4-13 14:15 | 只看該作者
wulin 發表于 2022-4-13 10:45
兩者速度不同,端口模式寄存器、定時器工作模式寄存器也有所不同,主要修改這三項即可。

感謝!我稍后試試您的代碼
回復

使用道具 舉報

10#
ID:123289 發表于 2022-4-14 08:55 | 只看該作者
什么時間你的程序中看不到DELAY()函數,你的水平就不是初級階段了。
都是教書先生害的人。不告訴學生DELAY()的危害有多大。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久一区 | 一级一级毛片免费看 | 国产欧美一区二区三区在线看 | 精品欧美一区二区在线观看视频 | 欧美午夜精品久久久久久浪潮 | 国产在线小视频 | 日韩三级在线 | 国产成人网 | 日韩国产高清在线观看 | 97在线观视频免费观看 | 欧美一级淫片007 | 99精品视频一区二区三区 | 日韩欧美在线观看 | 伊人网在线综合 | 婷婷色国产偷v国产偷v小说 | 国产精品成人在线播放 | 操操网站 | 国产99久久久国产精品下药 | 91在线看网站| 在线成人 | 给我免费的视频在线观看 | 国产伦精品一区二区三区视频金莲 | eeuss国产一区二区三区四区 | 操操网站 | 精品国产欧美一区二区 | 亚洲成人第一页 | 91大神在线资源观看无广告 | 亚洲午夜精品久久久久久app | 午夜精品视频在线观看 | 欧美一区二区三区在线播放 | h视频亚洲| 中文字幕亚洲免费 | 日韩欧美一级精品久久 | 精品国产乱码久久久久久丨区2区 | 成人国产精品一级毛片视频毛片 | 精品91av | 精品1区2区3区4区 | 午夜网站视频 | 久久伊人一区二区 | 国产精品五区 | 黑人精品欧美一区二区蜜桃 |