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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8A8K單片機SPI主從機設置通訊 測試程序

[復制鏈接]
跳轉到指定樓層
樓主
stc8a8k 單片機測試程序,請各位參考。


單片機源程序如下:
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 單主單從的SPI中斷方式舉例---------------------*/

  4. /*
  5.   mcu主頻為 11.0592MHz
  6.   波特率    115200

  7.   SPI主從機設置通訊 測試程序


  8. */



  9. #include "stc8.h"

  10. //#define MASTER                  //define:master undefine:slave         打開設置為主機  關閉設置為從機
  11. #define FOSC        11059200L
  12. #define BAUD        (256 - FOSC / 32 / 115200)

  13. typedef unsigned char BYTE;
  14. typedef unsigned int WORD;
  15. typedef unsigned long DWORD;

  16. #define     URMD    0           //0:使用定時器2作為波特率發生器
  17.                                 //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
  18.                                 //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器

  19. //sfr T2H   = 0xd6;               //定時器2高8位
  20. //sfr T2L   = 0xd7;               //定時器2低8位
  21. //
  22. //sfr  AUXR       =   0x8e;       //輔助寄存器                              
  23. //sfr SPSTAT      =   0xcd;       //SPI狀態寄存器                           
  24. #define SPIF        0x80        //SPSTAT.7                                
  25. #define WCOL        0x40        //SPSTAT.6                                
  26. //sfr SPCTL       =   0xce;       //SPI控制寄存器                           
  27. #define SSIG        0x80        //SPCTL.7                                 
  28. #define SPEN        0x40        //SPCTL.6                                 
  29. #define DORD        0x20        //SPCTL.5                                 
  30. #define MSTR        0x10        //SPCTL.4                                 
  31. #define CPOL        0x08        //SPCTL.3                                 
  32. #define CPHA        0x04        //SPCTL.2                                 
  33. #define SPDHH       0x00        //CPU_CLK/4                              
  34. #define SPDH        0x01        //CPU_CLK/16                              
  35. #define SPDL        0x02        //CPU_CLK/64                              
  36. #define SPDLL       0x03        //CPU_CLK/128                             
  37. //sfr SPDAT       =   0xcf;       //SPI數據寄存器                           
  38. sbit SPISS      =   P1^1;       //SPI從機選擇口, 連接到其它MCU的SS口
  39.                                 //當SPI為一主多從模式時,請使用主機的普通IO口連接到從機的SS口

  40. //sfr IE2         =   0xAF;       //中斷控制寄存器2
  41. #define ESPI        0x02        //IE2.1

  42. void InitUart();
  43. void InitSPI();
  44. void SendUart(BYTE dat);        //發送數據到PC
  45. BYTE RecvUart();                //從PC接收數據

  46. ///////////////////////////////////////////////////////////

  47. void main()
  48. {
  49.     InitUart();                 //初始化串口   
  50.     InitSPI();                  //初始化SPI   
  51.     IE2 |= ESPI;
  52.     EA = 1;

  53.     while (1)
  54.     {
  55. #ifdef MASTER                   //對于主機(接收串口數據 并發送給從機,同時
  56.                                 //            從從機接收SPI數據并回傳給PC)
  57.         ACC = RecvUart();
  58.         SPISS = 0;              //拉低從機的SS
  59.         SPDAT = ACC;            //觸發SPI發送數據
  60. #endif
  61.     }
  62. }

  63. ///////////////////////////////////////////////////////////

  64. void spi_isr() interrupt 9 using 1     //SPI中斷服務程序 9 (004BH)
  65. {
  66.     SPSTAT = SPIF | WCOL;       //清除SPI狀態位
  67. #ifdef MASTER
  68.     SPISS = 1;                  //拉高從機的SS
  69.     SendUart(SPDAT);            //返回SPI數據
  70. #else                           //對于從機(從主機接收SPI數據,同時
  71.     SPDAT = SPDAT;              //           發送前一個SPI數據給主機)
  72. #endif
  73. }

  74. ///////////////////////////////////////////////////////////

  75. void InitUart()
  76. {
  77.     SCON = 0x5a;                //設置串口為8位可變波特率
  78. #if URMD == 0
  79.     T2L = 0xe8;                 //設置波特率重裝值
  80.     T2H = 0xff;                 //115200 bps(65536-11059200/4/115200)

  81. //    T2L = 0xd8;                 //設置波特率重裝值
  82. //    T2H = 0xff;                 //115200 bps(65536-18432000/4/115200)
  83.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  84.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
  85. #elif URMD == 1
  86.     AUXR = 0x40;                //定時器1為1T模式
  87.     TMOD = 0x00;                //定時器1為模式0(16位自動重載)
  88.     TL1 = 0xd8;                 //設置波特率重裝值
  89.     TH1 = 0xff;                 //115200 bps(65536-18432000/4/115200)
  90.     TR1 = 1;                    //定時器1開始啟動
  91. #else
  92.     TMOD = 0x20;                //設置定時器1為8位自動重裝載模式
  93.     AUXR = 0x40;                //定時器1為1T模式
  94.     TH1 = TL1 = 0xfb;           //115200 bps(256 - 18432000/32/115200)
  95.     TR1 = 1;
  96. #endif
  97. }

  98. ///////////////////////////////////////////////////////////

  99. void InitSPI()
  100. {
  101.     SPDAT = 0;                  //初始化SPI數據
  102.     SPSTAT = SPIF | WCOL;       //清除SPI狀態位
  103. #ifdef MASTER
  104.     SPCTL = SPEN | MSTR;        //主機模式
  105. #else
  106.     SPCTL = SPEN;               //從機模式
  107. #endif
  108. }

  109. ///////////////////////////////////////////////////////////

  110. void SendUart(BYTE dat)
  111. {
  112.     while (!TI);                //等待發送完成
  113.     TI = 0;                     //清除發送標志
  114.     SBUF = dat;                 //發送串口數據
  115. }

  116. ///////////////////////////////////////////////////////////

  117. BYTE RecvUart()
  118. {
  119.     while (!RI);                //等待串口數據接收完成
  120.     RI = 0;                     //清除接收標志
  121.     return SBUF;                //返回串口數據
  122. }
復制代碼

所有資料51hei提供下載:
SPI主從機設置通訊 測試程序.rar (90.16 KB, 下載次數: 38)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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