欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機模擬SPI總線通信程序及proteus仿真
[打印本頁]
作者:
221
時間:
2017-11-18 17:44
標題:
51單片機模擬SPI總線通信程序及proteus仿真
分享一個51單片機模擬SPI總線來進行通信的程序及仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(10.33 KB, 下載次數: 136)
下載附件
2017-11-19 06:17 上傳
0.png
(14.96 KB, 下載次數: 135)
下載附件
2017-11-19 06:16 上傳
單片機源程序如下:
#include<reg51.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
//x5045引腳定義
sbit SCK=P3^4; //將SCK位定義為P3.4引腳
sbit SI=P3^5; //將SI位定義為P3.5引腳
sbit SO=P3^6; //將SO位定義為P3.6引腳
sbit CS=P3^7; //將SCK位定義為P3.7引腳
//功能變量定義
#define WREN 0x06 //寫使能鎖存器允許
#define WRDI 0x04 //寫使能鎖存器禁止
#define WRSR 0x01 //寫狀態寄存器
#define READ 0x03 //讀出
#define WRITE 0x02 //寫入
/*****************************************************
函數功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:從X5045的當前地址讀出數據
出口參數:x
***************************************************/
unsigned char ReadCurrent(void)
{
unsigned char i;
unsigned char x=0x00; //儲存從X5045中讀出的數據
SCK=1; //將SCK置于已知的高電平狀態
for(i = 0; i < 8; i++)
{
SCK=1; //拉高SCK
SCK=0; //在SCK的下降沿輸出數據
x<<=1; //將x中的各二進位向左移一位,因為首先讀出的是字節的最高位數據
x|=(unsigned char)SO; //將SO上的數據通過按位“或“運算存入 x
}
return(x); //將讀取的數據返回
}
/*****************************************************
函數功能:寫數據到X5045的當前地址
入口參數:dat
***************************************************/
void WriteCurrent(unsigned char dat)
{
unsigned char i;
SCK=0; //將SCK置于已知的低電平狀態
for(i = 0; i < 8; i++) // 循環移入8個位
{
SI=(bit)(dat&0x80); //通過按位“與”運算將最高位數據送到S
//因為傳送時高位在前,低位在后
SCK=0;
SCK=1; //在SCK上升沿寫入數據
dat<<=1; //將y中的各二進位向左移一位,因為首先寫入的是字節的最高位
}
}
/*****************************************************
函數功能:寫狀態寄存器 ,可以設置看門狗的溢出時間及數據保護
入口參數:rs; //儲存寄存器狀態值
***************************************************/
void WriteSR(unsigned char rs)
{
CS=0; //拉低CS,選中X5045
WriteCurrent(WREN); //寫使能鎖存器允許
CS=1; //拉高CS
CS=0; //重新拉低CS,否則下面的寫寄存器狀態指令將被丟棄
WriteCurrent(WRSR); //寫狀態寄存器
WriteCurrent(rs); //寫入新設定的寄存器狀態值
CS=1; //拉高CS
}
/*****************************************************
函數功能:寫數據到X5045的指定地址
入口參數:addr
***************************************************/
void WriteSet(unsigned char dat,unsigned char addr)
{
SCK=0; //將SCK置于已知狀態
CS=0; //拉低CS,選中X5045
WriteCurrent(WREN); //寫使能鎖存器允許
CS=1; //拉高CS
CS=0; //重新拉低CS,否則下面的寫入指令將被丟棄
WriteCurrent(WRITE); //寫入指令
WriteCurrent(addr); //寫入指定地址
WriteCurrent(dat); //寫入數據
CS=1; //拉高CS
SCK=0; //將SCK置于已知狀態
}
/*****************************************************
函數功能:從X5045的指定地址讀出數據
入口參數:addr
出口參數:dat
***************************************************/
unsigned char ReadSet(unsigned char addr)
{
unsigned char dat;
SCK=0; //將SCK置于已知狀態
CS=0; //拉低CS,選中X5045
WriteCurrent(READ); //開始讀
WriteCurrent(addr); //寫入指定地址
dat=ReadCurrent(); //讀出數據
CS=1; //拉高CS
SCK=0; //將SCK置于已知狀態
return dat; //返回讀出的數據
}
/*****************************************************
函數功能:看門狗復位程序
***************************************************/
void WatchDog(void)
{
CS=1; //拉高CS
CS=0; //CS引腳的一個下降沿復位看門狗定時器
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
SPI.zip
(38.13 KB, 下載次數: 440)
2017-11-18 17:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
LHT_Peter
時間:
2018-2-8 09:17
百度只看到這個有源碼
作者:
ye5914
時間:
2018-4-7 13:22
真好 很棒
作者:
neroli
時間:
2018-5-2 11:58
不錯的東西,下來看看
作者:
吳中男
時間:
2018-5-21 20:26
好 真棒
作者:
好的好的
時間:
2018-7-19 13:14
強強,小白受教了
作者:
煩死地球人
時間:
2018-7-27 13:25
感謝大佬
作者:
煩死地球人
時間:
2018-7-27 13:44
他就是可以實現普通IO口模擬SPI的功能 對吧
作者:
tianqi911
時間:
2018-9-13 10:14
Proteus里這個芯片沒有 看門狗 模塊。可以搞其他部分。
作者:
wdliming
時間:
2018-9-29 14:50
謝謝!!!
作者:
syjs10
時間:
2019-1-9 20:31
感謝大佬分享
作者:
nyyinye
時間:
2019-3-30 11:19
感謝分享
作者:
PegasusHu
時間:
2019-4-23 21:15
小白來學習,回復可以拿幣嗎?
作者:
standanhy
時間:
2019-4-25 10:31
學習一下
作者:
zzn6737
時間:
2019-5-26 16:38
正需要這個來參考一下,謝謝樓主.
作者:
順德動力
時間:
2019-8-6 23:26
下來學習學習,感謝分享。
作者:
yong11
時間:
2019-9-10 17:49
為什么時鐘是(3j+2)*i=(3×33+2)×10=1010(微秒)
作者:
zz爛尾
時間:
2019-11-15 07:08
很好,學習了
作者:
lw1997
時間:
2020-3-14 00:24
感謝分享
作者:
cxllll
時間:
2020-6-12 20:41
這個可以運行嗎
作者:
hj3ger
時間:
2020-6-15 09:42
很棒,非常感謝
作者:
CHUANLIUBUXI
時間:
2025-9-2 14:44
不錯,學習一下
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1