找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3754|回复: 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 单片机教程网

快速回复 返回顶部 返回列表