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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3884|回復: 1
收起左側

STC15F4K60S4單片機 單主單從的SPI中斷方式程序舉例

[復制鏈接]
ID:444712 發表于 2018-12-18 14:27 | 顯示全部樓層 |閱讀模式
#include "reg51.h"

//#define MASTER                  //define:master undefine:slave
#define FOSC        11059200L
#define BAUD        (256 - FOSC / 32 / 115200)

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;

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

sfr T2H   = 0xd6;               //定時器2高8位
sfr T2L   = 0xd7;               //定時器2低8位

sfr  AUXR       =   0x8e;       //輔助寄存器                              
sfr SPSTAT      =   0xcd;       //SPI狀態寄存器                           
#define SPIF        0x80        //SPSTAT.7                                
#define WCOL        0x40        //SPSTAT.6                                
sfr SPCTL       =   0xce;       //SPI控制寄存器                           
#define SSIG        0x80        //SPCTL.7                                 
#define SPEN        0x40        //SPCTL.6                                 
#define DORD        0x20        //SPCTL.5                                 
#define MSTR        0x10        //SPCTL.4                                 
#define CPOL        0x08        //SPCTL.3                                 
#define CPHA        0x04        //SPCTL.2                                 
#define SPDHH       0x00        //CPU_CLK/4                              
#define SPDH        0x01        //CPU_CLK/16                              
#define SPDL        0x02        //CPU_CLK/64                              
#define SPDLL       0x03        //CPU_CLK/128                             
sfr SPDAT       =   0xcf;       //SPI數據寄存器                           
sbit SPISS      =   P1^1;       //SPI從機選擇口, 連接到其它MCU的SS口
                                //當SPI為一主多從模式時,請使用主機的普通IO口連接到從機的SS口

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

sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

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

///////////////////////////////////////////////////////////

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;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    InitUart();                 //初始化串口   
    InitSPI();                  //初始化SPI   
    IE2 |= ESPI;
    EA = 1;

    while (1)
    {
#ifdef MASTER                   //對于主機(接收串口數據 并發送給從機,同時
                                //            從從即接收SPI數據并回傳給PC)
        ACC = RecvUart();
        SPISS = 0;              //拉低從機的SS
        SPDAT = ACC;            //觸發SPI發送數據
#endif
    }
}

///////////////////////////////////////////////////////////

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

///////////////////////////////////////////////////////////

void InitUart()
{
    SCON = 0x5a;                //設置串口為8位可變波特率
#if URMD == 0
    T2L = 0xd8;                 //設置波特率重裝值
    T2H = 0xff;                 //115200 bps(65536-18432000/4/115200)
    AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
    AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
#elif URMD == 1
    AUXR = 0x40;                //定時器1為1T模式
    TMOD = 0x00;                //定時器1為模式0(16位自動重載)
    TL1 = 0xd8;                 //設置波特率重裝值
    TH1 = 0xff;                 //115200 bps(65536-18432000/4/115200)
    TR1 = 1;                    //定時器1開始啟動
#else
    TMOD = 0x20;                //設置定時器1為8位自動重裝載模式
    AUXR = 0x40;                //定時器1為1T模式
    TH1 = TL1 = 0xfb;           //115200 bps(256 - 18432000/32/115200)
    TR1 = 1;
#endif
}

///////////////////////////////////////////////////////////

void InitSPI()
{
    SPDAT = 0;                  //初始化SPI數據
    SPSTAT = SPIF | WCOL;       //清除SPI狀態位
#ifdef MASTER
    SPCTL = SPEN | MSTR;        //主機模式
#else
    SPCTL = SPEN;               //從機模式
#endif
}

///////////////////////////////////////////////////////////

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

///////////////////////////////////////////////////////////

BYTE RecvUart()
{
    while (!RI);                //等待串口數據接收完成
    RI = 0;                     //清除接收標志
    return SBUF;                //返回串口數據
}


評分

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

查看全部評分

回復

使用道具 舉報

ID:601736 發表于 2019-8-27 11:35 | 顯示全部樓層
這段代碼好熟悉(手動滑稽)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费大片黄在线播放 | 久久久久久中文字幕 | 亚洲一区精品在线 | 视频一区在线观看 | 欧美在线不卡 | 91在线播 | 一级黄a视频 | 日韩一区中文字幕 | 欧美性受xxxx白人性爽 | 天天操天天插 | 欧美精品一区在线 | 中文字幕亚洲精品 | 国产综合久久 | 日韩在线免费视频 | 在线观看成年视频 | 成人国产午夜在线观看 | 一级a性色生活片久久毛片 一级特黄a大片 | 国产乱码久久久久久 | 欧美日韩午夜精品 | 超碰97干 | 国产精品欧美一区二区三区 | 亚洲电影中文字幕 | 亚洲视频在线观看免费 | 欧美成人精品一区二区男人看 | 色婷婷综合久久久久中文一区二区 | 狠狠婷婷综合久久久久久妖精 | 国产伦精品一区二区三区高清 | 久久999 | 国产日韩精品一区 | 国产精品91视频 | 亚洲福利 | 成人免费淫片aa视频免费 | 国产亚洲精品久久久优势 | 精品成人 | 伊人春色成人网 | 日日夜夜精品视频 | 香蕉一区| 久久精品国产a三级三级三级 | 丝袜久久 | 国产视频久久 | 精品99在线 |