找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 14322|回復(fù): 20
收起左側(cè)

51單片機(jī)模擬SPI總線通信程序及proteus仿真

  [復(fù)制鏈接]
ID:203208 發(fā)表于 2017-11-18 17:44 | 顯示全部樓層 |閱讀模式
分享一個(gè)51單片機(jī)模擬SPI總線來進(jìn)行通信的程序及仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png
單片機(jī)源程序如下:
  1. #include<reg51.h>    //包含單片機(jī)寄存器的頭文件
  2. #include<intrins.h>  //包含_nop_()函數(shù)定義的頭文件
  3. //x5045引腳定義
  4. sbit SCK=P3^4;       //將SCK位定義為P3.4引腳
  5. sbit SI=P3^5;        //將SI位定義為P3.5引腳
  6. sbit SO=P3^6;        //將SO位定義為P3.6引腳
  7. sbit CS=P3^7;        //將SCK位定義為P3.7引腳
  8. //功能變量定義
  9. #define WREN 0x06    //寫使能鎖存器允許
  10. #define WRDI 0x04    //寫使能鎖存器禁止
  11. #define WRSR 0x01    //寫狀態(tài)寄存器
  12. #define READ 0x03    //讀出
  13. #define WRITE 0x02   //寫入
  14. /*****************************************************
  15. 函數(shù)功能:延時(shí)1ms
  16. (3j+2)*i=(3×33+2)×10=1010(微秒),可以認(rèn)為是1毫秒
  17. ***************************************************/
  18. void delay1ms()
  19. {
  20.    unsigned char i,j;
  21.   for(i=0;i<10;i++)
  22.    for(j=0;j<33;j++)
  23.     ;   
  24. }
  25. /*****************************************************
  26. 函數(shù)功能:延時(shí)若干毫秒
  27. 入口參數(shù):n
  28. ***************************************************/
  29. void delaynms(unsigned char n)
  30. {
  31.    unsigned char i;
  32. for(i=0;i<n;i++)
  33.     delay1ms();
  34. }
  35. /*****************************************************
  36. 函數(shù)功能:從X5045的當(dāng)前地址讀出數(shù)據(jù)
  37. 出口參數(shù):x
  38. ***************************************************/
  39. unsigned char ReadCurrent(void)
  40. {
  41.    unsigned char i;
  42. unsigned char x=0x00;      //儲(chǔ)存從X5045中讀出的數(shù)據(jù)
  43. SCK=1;                     //將SCK置于已知的高電平狀態(tài)
  44.    for(i = 0; i < 8; i++)
  45. {
  46.     SCK=1;                 //拉高SCK
  47.     SCK=0;                 //在SCK的下降沿輸出數(shù)據(jù)
  48.     x<<=1;  //將x中的各二進(jìn)位向左移一位,因?yàn)槭紫茸x出的是字節(jié)的最高位數(shù)據(jù)   
  49.   x|=(unsigned char)SO;  //將SO上的數(shù)據(jù)通過按位“或“運(yùn)算存入 x      
  50. }
  51. return(x);   //將讀取的數(shù)據(jù)返回
  52. }
  53. /*****************************************************
  54. 函數(shù)功能:寫數(shù)據(jù)到X5045的當(dāng)前地址
  55. 入口參數(shù):dat
  56. ***************************************************/
  57. void WriteCurrent(unsigned char dat)
  58. {
  59.    unsigned char i;
  60. SCK=0;                 //將SCK置于已知的低電平狀態(tài)
  61.   for(i = 0; i < 8; i++)  // 循環(huán)移入8個(gè)位
  62. {
  63.   SI=(bit)(dat&0x80);   //通過按位“與”運(yùn)算將最高位數(shù)據(jù)送到S
  64.                       //因?yàn)閭魉蜁r(shí)高位在前,低位在后
  65.   SCK=0;
  66.   SCK=1;               //在SCK上升沿寫入數(shù)據(jù)
  67.     dat<<=1;   //將y中的各二進(jìn)位向左移一位,因?yàn)槭紫葘懭氲氖亲止?jié)的最高位
  68.   }
  69. }
  70. /*****************************************************
  71. 函數(shù)功能:寫狀態(tài)寄存器 ,可以設(shè)置看門狗的溢出時(shí)間及數(shù)據(jù)保護(hù)
  72. 入口參數(shù):rs;  //儲(chǔ)存寄存器狀態(tài)值
  73. ***************************************************/
  74. void WriteSR(unsigned char rs)
  75. {
  76.   CS=0;                 //拉低CS,選中X5045
  77.   WriteCurrent(WREN);   //寫使能鎖存器允許
  78.   CS=1;                 //拉高CS
  79.   CS=0;                 //重新拉低CS,否則下面的寫寄存器狀態(tài)指令將被丟棄
  80.   WriteCurrent(WRSR);   //寫狀態(tài)寄存器
  81.   WriteCurrent(rs);     //寫入新設(shè)定的寄存器狀態(tài)值
  82.   CS=1;                 //拉高CS
  83. }
  84. /*****************************************************
  85. 函數(shù)功能:寫數(shù)據(jù)到X5045的指定地址
  86. 入口參數(shù):addr
  87. ***************************************************/
  88. void WriteSet(unsigned char dat,unsigned char addr)
  89. {
  90.    SCK=0;                 //將SCK置于已知狀態(tài)
  91.    CS=0;                  //拉低CS,選中X5045
  92. WriteCurrent(WREN);    //寫使能鎖存器允許
  93. CS=1;                  //拉高CS
  94.    CS=0;                  //重新拉低CS,否則下面的寫入指令將被丟棄
  95. WriteCurrent(WRITE);   //寫入指令
  96. WriteCurrent(addr);    //寫入指定地址
  97. WriteCurrent(dat);     //寫入數(shù)據(jù)
  98. CS=1;                  //拉高CS
  99.    SCK=0;                 //將SCK置于已知狀態(tài)
  100. }
  101. /*****************************************************
  102. 函數(shù)功能:從X5045的指定地址讀出數(shù)據(jù)
  103. 入口參數(shù):addr
  104. 出口參數(shù):dat
  105. ***************************************************/
  106. unsigned char ReadSet(unsigned char addr)
  107. {
  108. unsigned char dat;
  109. SCK=0;                 //將SCK置于已知狀態(tài)
  110. CS=0;                  //拉低CS,選中X5045
  111. WriteCurrent(READ);   //開始讀
  112. WriteCurrent(addr);   //寫入指定地址
  113. dat=ReadCurrent();    //讀出數(shù)據(jù)
  114. CS=1;                 //拉高CS
  115. SCK=0;                //將SCK置于已知狀態(tài)
  116. return dat;           //返回讀出的數(shù)據(jù)
  117. }
  118. /*****************************************************
  119. 函數(shù)功能:看門狗復(fù)位程序
  120. ***************************************************/
  121. void WatchDog(void)
  122. {
  123. CS=1;    //拉高CS
  124. CS=0;    //CS引腳的一個(gè)下降沿復(fù)位看門狗定時(shí)器
  125. ……………………

  126. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
SPI.zip (38.13 KB, 下載次數(shù): 440)


評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
關(guān)外秀才 + 5 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:282995 發(fā)表于 2018-2-8 09:17 | 顯示全部樓層
百度只看到這個(gè)有源碼
回復(fù)

使用道具 舉報(bào)

ID:303104 發(fā)表于 2018-4-7 13:22 | 顯示全部樓層
真好 很棒
回復(fù)

使用道具 舉報(bào)

ID:320352 發(fā)表于 2018-5-2 11:58 | 顯示全部樓層
不錯(cuò)的東西,下來看看
回復(fù)

使用道具 舉報(bào)

ID:335202 發(fā)表于 2018-5-21 20:26 | 顯示全部樓層
好 真棒
回復(fù)

使用道具 舉報(bào)

ID:279728 發(fā)表于 2018-7-19 13:14 | 顯示全部樓層
強(qiáng)強(qiáng),小白受教了
回復(fù)

使用道具 舉報(bào)

ID:379819 發(fā)表于 2018-7-27 13:25 | 顯示全部樓層
感謝大佬   
回復(fù)

使用道具 舉報(bào)

ID:379819 發(fā)表于 2018-7-27 13:44 | 顯示全部樓層
他就是可以實(shí)現(xiàn)普通IO口模擬SPI的功能 對(duì)吧

回復(fù)

使用道具 舉報(bào)

ID:275111 發(fā)表于 2018-9-13 10:14 | 顯示全部樓層
Proteus里這個(gè)芯片沒有 看門狗 模塊?梢愿闫渌糠。
回復(fù)

使用道具 舉報(bào)

ID:20672 發(fā)表于 2018-9-29 14:50 | 顯示全部樓層
謝謝。!
回復(fù)

使用道具 舉報(bào)

ID:465392 發(fā)表于 2019-1-9 20:31 | 顯示全部樓層
感謝大佬分享
回復(fù)

使用道具 舉報(bào)

ID:501077 發(fā)表于 2019-3-30 11:19 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:519963 發(fā)表于 2019-4-23 21:15 | 顯示全部樓層
小白來學(xué)習(xí),回復(fù)可以拿幣嗎?
回復(fù)

使用道具 舉報(bào)

ID:520635 發(fā)表于 2019-4-25 10:31 | 顯示全部樓層
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:32962 發(fā)表于 2019-5-26 16:38 | 顯示全部樓層
正需要這個(gè)來參考一下,謝謝樓主.
回復(fù)

使用道具 舉報(bào)

ID:384820 發(fā)表于 2019-8-6 23:26 | 顯示全部樓層
下來學(xué)習(xí)學(xué)習(xí),感謝分享。
回復(fù)

使用道具 舉報(bào)

ID:602723 發(fā)表于 2019-9-10 17:49 | 顯示全部樓層
為什么時(shí)鐘是(3j+2)*i=(3×33+2)×10=1010(微秒)
回復(fù)

使用道具 舉報(bào)

ID:611955 發(fā)表于 2019-11-15 07:08 | 顯示全部樓層
很好,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:171060 發(fā)表于 2020-3-14 00:24 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:774480 發(fā)表于 2020-6-12 20:41 | 顯示全部樓層
這個(gè)可以運(yùn)行嗎
回復(fù)

使用道具 舉報(bào)

ID:480951 發(fā)表于 2020-6-15 09:42 | 顯示全部樓層
很棒,非常感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表