導航:首頁 > 操作系統 > 51單片機sck

51單片機sck

發布時間:2022-09-11 23:10:39

Ⅰ 關於用51單片機的IO口模擬SPI驅動NRF2401模塊,

這個是datasheet裡面的介面電路,黃色的埠表示和單片機相連,或者和電源/地相連。除了電源和地信號,其它都是單片機的介面,這些介面就可以在程序中定義成你前面說的樣子

sbitCE= P2^0;

sbit***= P2^5;

sbit***= P2^1;

sbit***=P2^4;

sbit***=P2^2;

sbit***=P2^3

根據實際情況,定義相應的IO口為相應的名字,然後應用就行了

Ⅱ 51單片機不具備SPI,那麼如何來實現這一功能呢

SPI協議在51單片機上的實現//
函數聲明,變數定義

#i nclude <reg51.h>
#i nclude <intrins.h>
sbit SCK=P1^0; // 將p1.0口模擬時鍾輸出
sbit MOSI=P1^1; // 將p1.1口模擬主機輸出
sbit MISO=P1^2; // 將p1.1口模擬主機輸入
sbit SS1=P1^3; // 將p1.1口模擬片選

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

// 函數名稱: SPISendByte
// 入口參數: ch
// 函數功能: 發送一個位元組
//void SPISendByte(unsigned char ch)
{
unsigned char idata n=8; // 向SDA上發送一位數據位元組,共八位
SCK = 1 ; //時鍾置高
SS1 = 0 ; //選擇從機

while(n--)
{
delayNOP();
SCK = 0 ; //時鍾置低
if((ch&0x80) == 0x80) // 若要發送的數據最高位為1則發送位1
{
MOSI = 1; // 傳送位1
}
else
{
MOSI = 0; // 否則傳送位0
}
delayNOP();
ch = ch<<1; // 數據左移一位
SCK = 1 ; //時鍾置高
}
}
// 函數名稱: SPIreceiveByte
// 返回接收的數據
// 函數功能: 接收一位元組子程序

Ⅲ 用51單片機來控制nrf14l01,為什麼程序裡面好像沒有對sck進行什麼操作。

1.sck要麼是通過串口模塊自動生成了,那麼你在程序里就需要先配置好串口模塊。
2.要麼就是程序寫的串口協議,那肯定是會操作sck的。
一般范常式序都是第2個情況。建議你仔細查最底層的函數,函數名一般是例如SPI_RW之類的,裡面應該操作了sck。

Ⅳ DHT95中的SCK應該連接51單片機中的什麼引腳

不清楚你用的是哪款51單片機,怎麼會有48號那麼多引腳(51一般都是40或者44個引腳)。
如何接,你首先要明白DHT95是用SPI同步串列通信來和單片機進行通信的,所以說,如果你的51單片機如果沒有SPI功能,那就需要用程序來模擬了(很多51單片機都沒有SPI功能的,你用的超過44個引腳的單片機我還真不好說有還是沒有,自己看看吧)。
這里只說沒有SPI功能的單片機和DHT95連接。因為SCK是感測器在SPI通信時候的頻率輸入(就是SPI時鍾線),時鍾線只能是用程序來模擬,比如說你看DHT95的的數據手冊,裡面說明了在SCK的下降沿發送數據,所以需要在單片機程序能控制的情況下發送和接受數據,因此不能使用你說的ACLK引腳。
另外看來你還沒認真看過DHT95的數據手冊,也不知道SPI通信的原理,要做這個感測器,先把上述的兩個知識看一看吧。

補充:MSP430單片機有些晶元集成了SPI口,如果用它來和感測器連接就比較簡單。而你說的89C51RC應該是STC89C51RC,這款晶元沒有集成SPI口,所以需要自己用程序做模擬SPI,DHT95的銷售商大連北方測控的網站上有關於51和這個感測器的通信程序,你可以去找來看看。但如果你是想學這東西,最好還是先看看SPI的通信原理,DHT95的數據手冊,還有這個文章

Ⅳ 51單片機 c語言看門狗程序怎麼寫

看門狗在51單片機電路里的作用是防止程序 「跑飛」、「死機」後,系統不動作,而採取復位的辦法「喚醒」系統。

89S51、89S52系列單片機自帶有看門狗功能,片內數據區A6H寄存器具有看門狗功能,使用很簡單:

#include<reg51.h>
...
sfr WDTRST = 0xA6;
...
void main()
{
WDTRST=0x1E;;//初始化看門狗
WDTRST=0xE1;//初始化看門狗
for(;;)
{
WDTRST=0x1E;;//喂狗指令

WDTRST=0xE1;//喂狗指令
}

}
可見,你只要在程序的大循環體內加一條喂狗指令就行。但這種看門狗功能有限,不是很可靠的,它依靠晶振工作,一旦晶振不起振,就無效了。

實踐中多採用外部看門狗的方法,可以選用的晶元很多:MAX708、MAX813
、X25045.....具體編程就要看晶元的參考資料了。

例如:X25045是SPI匯流排的看門狗晶元,復位端和單片機復位端連接,SPI數據輸入你可以選擇合適的IO介面。

WREN 0x06 設置寫允許位
WRDI 0x04 復位寫允許位
RDSR 0x05 讀狀態寄存器
WRSR 0x01 寫狀態寄存器
READ 0x03/0x0b 讀操作時內部EEPROM頁地址
WRITE 0x02/0x0a 寫操作時內部EEPROM頁地址

#include <reg51.h>
sbit CS= P2^7;
sbit SO= P2^6;
sbit SCK= P2^5;
sbit SI= P2^4;
#define WREN 0x06 //
#define WRDI 0x04 //
#define RDSR 0x05 //
#define WRSR 0x01 //
#define READ0 0x03 //
#define READ1 0x0b //
#define WRITE0 0x02 //
#define WRITE1 0x0a //
#define uchar unsigned char
uchar ReadByte() //read a byte from device
{
bit bData;
uchar ucLoop;
uchar ucData;
for(ucLoop=0;ucLoop<8;ucLoop++)
{
SCK=1;
SCK=0;
bData=SO;
ucData<<=1;
if(bData)
{ ucData|=0x01; }
}
return ucData;
}
void WriteByte(uchar ucData)//write a byte to device
{
uchar ucLoop;
for(ucLoop=0;ucLoop<8;ucLoop++)
{
if((ucData&0x80)==0) //the MSB send first
{SI=0;}
else
{SI=1;}
SCK=0;
SCK=1;
ucData<<=1;
}
}
uchar ReadReg() //read register
{
uchar ucData;
CS=0;
WriteByte(RDSR);
ucData=ReadByte();
CS=1;
return ucData;
}
uchar WriteReg(uchar ucData) //write register
{
uchar ucTemp;
ucTemp=ReadReg();
if((ucTemp&0x01)==1) //the device is busy
return 0;
CS=0;
WriteByte(WREN);//when write the WREN, the cs must have a high level
CS=1;
CS=0;
WriteByte(WRSR);
WriteByte(ucData);
CS=1;
return 1;
}

void WriteEpm(uchar cData,uchar cAddress,bit bRegion)
/* 寫入一個位元組,cData為寫入的數,cAddress為寫入地址,bRegion為頁 */
{
while((ReadReg()&0x01)==1); //the device is busy
CS=0;
WriteByte(WREN); //when write the wren , the cs must have a high level
CS=1;
CS=0;
if(bRegion==0)
{ WriteByte(WRITE0);} //write the page addr
else
{WriteByte(WRITE1);}
WriteByte(cAddress);
WriteByte(cData);
SCK=0; //
CS=1;
}
uchar ReadEpm(uchar cAddress,bit bRegion)
/* 讀入一個位元組,cAddress為讀入地址,bRegion為頁 */
{
uchar cData;
while((ReadReg()&0x01)==1);//the device is busy
CS=0;
if(bRegion==0)
{WriteByte(READ0); }
else
{WriteByte(READ1);}
WriteByte(cAddress);
cData=ReadByte();
CS=1;
return cData;
}
main()
{
WriteReg(0x00);//set the watchdog time as 1.4s
CS=1;
CS=0; //reset the watchdog
}

回復: xumin9514

所有的89S系列都帶狗,所有的80C系列都不帶狗。
所以89S51 89S52都帶狗,80C51、80C52都不帶狗。

Ⅵ 51單片機程序編寫

/*這是用LCD顯示所測溫度的代碼,你參考一下,如果沒問題的話,其他的功能你再添加就好了,不難*/

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

#define Nack_number 10

//**************埠定義**************************************************

uchar flag; //LCD控制線介面

sbit RS=P1^0; //RS端

sbit RW=P1^1; //讀寫端

sbit LCDE=P2^5; //使能端

//mlx90614埠定義

sbit SCK=P2^1; //時鍾線

sbit SDA=P2^2; //數據線

//************數據定義****************************************************

bdata uchar flag1; //可位定址數據

sbit bit_out=flag1^7;

sbit bit_in=flag1^0;

uchar tempH,tempL,err;


//************************** LCD1602 ***********************************

//向LCD寫入命令或數據*****************************************************

#define LCD_COMMAND 0 //命令

#define LCD_DATA 1 // 數據

#define LCD_CLEAR_SCREEN 0x01 // 清屏

#define LCD_HOMING 0x02 // 游標返回原點

//設置顯示模式******* 0x08+ *********************************************

#define LCD_SHOW 0x04 //顯示開

#define LCD_HIDE 0x00 //顯示關

#define LCD_CURSOR 0x02 //顯示游標

#define LCD_NO_CURSOR 0x00 //無游標

#define LCD_FLASH 0x01 //游標閃動

#define LCD_NO_FLASH 0x00 //游標不閃動

//設置輸入模式********** 0x04+ ********************************************

#define LCD_AC_UP 0x02 //游標右移 AC+

#define LCD_AC_DOWN 0x00 //默認 游標左移 AC-

#define LCD_MOVE 0x01 //畫面可平移

#define LCD_NO_MOVE 0x00 //默認 畫面不移動


//************************** mlx90614 ***********************************

//command mode 命令模式

#define RamAccess 0x00 //對RAM操作

#define EepomAccess 0x20 //對EEPRAM操作

#define Mode 0x60 //進入命令模式

#define ExitMode 0x61 //退出命令模式

#define ReadFlag 0xf0 //讀標志

#define EnterSleep 0xff //進入睡眠模式

//ram address read only RAM地址(只讀)

#define AbmientTempAddr 0x03 //周圍溫度

#define IR1Addr 0x04

#define IR2Addr 0x05

#define LineAbmientTempAddr 0x06 //環境溫度

/*0x0000 0x4074 16500 0.01/單元

-40 125*/

#define LineObj1TempAddr 0x07 //目標溫度,紅外溫度

/*0x27ad-0x7fff 0x3559 22610 0.02/單元

-70.01-382.19 0.01 452.2*/

#define LineObj2TempAddr 0x08

//eepom address EEPROM地址

#define TObjMaxAddr 0x00 //測量范圍上限設定

#define TObjMinAddr 0x01 //測量范圍下限設定

#define PWMCtrlAddr 0x02 //PWM設定

#define TaRangeAddr 0x03 //環境溫度設定

#define KeAddr 0x04 //頻率修正系數

#define ConfigAddr 0x05 //配置寄存器

#define SMbusAddr 0x0e //器件地址設定

#define Reserverd1Addr 0x0f //保留

#define Reserverd2Addr 0x19 //保留

#define ID1Addr 0x1c //ID地址1

#define ID2Addr 0x1d //ID地址2

#define ID3Addr 0x1e //ID地址3

#define ID4Addr 0x1f //ID地址4


//************函數聲明*****************************************************

void start(); //MLX90614發起始位子程序

void stop(); //MLX90614發結束位子程序

uchar ReadByte(void); //MLX90614接收位元組子程序

void send_bit(void); //MLX90614發送位子程序

void SendByte(uchar number); //MLX90614接收位元組子程序

void read_bit(void); //MLX90614接收位子程序

void delay(uint N); //延時程序

uint readtemp(void); //讀溫度數據

void init1602(void); //LCD初始化子程序

void busy(void); //LCD判斷忙子程序

void cmd_wrt(uchar cmd); //LCD寫命令子程序

void dat_wrt(uchar dat); //LCD寫數據子程序

void display(uint Tem); //顯示子程序

void Print(uchar *str); //字元串顯示程序


//*************主函數*******************************************

void main()

{

uint Tem; //溫度變數

SCK=1;

SDA=1;

delay(4);

SCK=0;

delay(1000);

SCK=1;

init1602(); //初始化LCD

while(1)

{

Tem=readtemp(); //讀取溫度

cmd_wrt(0x01); //清屏

Print(" Temperature: "); //顯示字元串 Temperature: 且換行

display(Tem); //顯示溫度

Print(" ^C"); //顯示攝氏度

delay(10000); //延時再讀取溫度顯示

}

}

void Print(uchar *str) //字元串顯示程序

{

while(*str!='') //直到字元串結束

{

dat_wrt(*str); //轉成ASCII碼

str++; //指向下一個字元

}

}


//*********輸入轉換並顯示*********

void display(uint Tem)

{

uint T,a,b;

T=Tem*2;

if(T>=27315) //溫度為正

{

T=T-27315; //

a=T/100; //溫度整數

b=T-a*100; //溫度小數

if(a>=100) //溫度超過100度

{

dat_wrt(0x30+a/100); //顯示溫度百位

dat_wrt(0x30+a%100/10); //顯示溫度十位

dat_wrt(0x30+a%10); //顯示溫度個位

}

else if(a>=10) //溫度超過10度

{

dat_wrt(0x30+a%100/10); //顯示溫度十位

dat_wrt(0x30+a%10); //顯示溫度個位

}

else //溫度不超過10度

{

dat_wrt(0x30+a); //顯示溫度個位

}

dat_wrt(0x2e); //顯示小數點

if(b>=10) //溫度小數點後第1位數不等於0

{

dat_wrt(0x30+b/10); //顯示溫度小數點後第1位數

dat_wrt(0x30+b%10); //顯示溫度小數點後第2位數

}

else //溫度小數點後第1位數等於0

{

dat_wrt(0x30); //顯示溫度小數點後第1位數0

dat_wrt(0x30+b); //顯示溫度小數點後第2位數

}

}

else //溫度為負

{

T=27315-T;

a=T/100;

b=T-a*100;

dat_wrt(0x2d); //顯示負號

if(a>=10) //溫度低於負10度

{

dat_wrt(0x30+a/10); //顯示溫度十位

dat_wrt(0x30+a%10); //顯示溫度個位

}

else //溫度高於負10度

{

dat_wrt(0x30+a); //顯示溫度個位

}

dat_wrt(0x2e); //顯示小數點

if(b>=10) //溫度小數點後第1位數不等於0

{

dat_wrt(0x30+b/10); //顯示溫度小數點後第1位數

dat_wrt(0x30+b%10); //顯示溫度小數點後第2位數

}

else //溫度小數點後第1位數等於0

{

dat_wrt(0x30); //顯示溫度小數點後第1位數0

dat_wrt(0x30+b); //顯示溫度小數點後第2位數

}

}

}

//************************************

void start(void) //停止條件是 SCK=1時,SDA由1到0

{

SDA=1;

delay(4);

SCK=1;

delay(4);

SDA=0;

delay(4);

SCK=0;

delay(4);

}

//------------------------------

void stop(void) //停止條件是 SCK=1時,SDA由0到1

{

SCK=0;

delay(4);

SDA=0;

delay(4);

SCK=1;

delay(4);

SDA=1;

}

//---------發送一個位元組---------

void SendByte(uchar number)

{

uchar i,n,dat;

n=Nack_number; //可以重發次數

Send_again:

dat=number;

for(i=0;i<8;i++) //8位依次發送

{

if(dat&0x80) //取最高位

{

bit_out=1; //發1

}

else

{

bit_out=0; //發0

}

send_bit(); //發送一個位

dat=dat<<1; //左移一位

}

read_bit(); //接收1位 應答信號

if(bit_in==1) //無應答時重發

{

stop();

if(n!=0)

{

n--; //可以重發Nack_number=10次

goto Repeat; //重發

}

else

{

goto exit; //退出

}

}

else

{

goto exit;

}

Repeat:

start(); //重新開始

goto Send_again; //重發

exit: ; //退出

}

//-----------發送一個位---------

void send_bit(void)

{

if(bit_out==1)

{

SDA=1; //發1

}

else

{

SDA=0; //發0

}

_nop_();

SCK=1; //上升沿

delay(4);delay(4);

SCK=0;

delay(4);delay(4);

}

//----------接收一個位元組--------

uchar ReadByte(void)

{

uchar i,dat;

dat=0; //初值為0

for(i=0;i<8;i++)

{

dat=dat<<1; //左移

read_bit(); //接收一位

if(bit_in==1)

{

dat=dat+1; //為1時對應位加1

}

}

SDA=0; //發送應答信號0

send_bit();

return dat; //帶回接收數據

}

//----------接收一個位----------

void read_bit(void)

{

SDA=1; //數據端先置1

bit_in=1;

SCK=1; //上升沿

delay(4);delay(4);

bit_in=SDA; //讀數據

_nop_();

SCK=0;

delay(4);delay(4);

}



//------------------------------

uint readtemp(void)

{

SCK=0;

start(); //開始條件

SendByte(0x00); //發送從地址00

SendByte(0x07); //發送命令

start(); //開始條件

SendByte(0x01); //讀從地址00

bit_out=0;

tempL=ReadByte(); //讀數據低位元組

bit_out=0;

tempH=ReadByte(); //讀數據高位元組

bit_out=1;

err=ReadByte(); //讀錯誤信息碼

stop(); //停止條件

return(tempH*256+tempL);

}

//******************LCD顯示子函數***********************

void init1602(void) //初始化LCD

{

cmd_wrt(0x01); //清屏

cmd_wrt(0x0c); //開顯示,不顯示游標,不閃爍

cmd_wrt(0x06); //完成一個字元碼傳送後,游標左移,顯示不發生移位

cmd_wrt(0x38); //16×2顯示,5×7點陣,8位數據介面

}

void busy(void) //LCD忙標志判斷

{

flag=0x80; //賦初值 高位為1 禁止

while(flag&0x80) //讀寫操作使能位禁止時等待 繼續檢測

{

P0=0xff;

RS=0; //指向地址計數器

RW=1; //讀

LCDE=1; //信號下降沿有效

flag=P0; //讀狀態位 高位為狀態

LCDE=0;

}

}

void cmd_wrt(uchar cmd) //寫命令子函數

{

LCDE=0;

busy(); //檢測 讀寫操作使能嗎

P0=cmd; //命令

RS=0; //指向命令計數器

RW=0; //寫

LCDE=1; //高電平有效

LCDE=0;

}

void dat_wrt(uchar dat) //寫數據子函數

{

busy(); //檢測 讀寫操作使能嗎

LCDE=0;

if(flag==16)

{

RS=0; //指向指令寄存器

RW=0; //寫

P0=0XC0; //指向第二行

LCDE=1; //高電平有效

LCDE=0;

}

RS=1; //指向數據寄存器

RW=0; //寫

P0=dat; //寫數據

LCDE=1; //高電平有效

LCDE=0;

}

//------------延時--------------

void delay(uint n)

{

uint j;

for(j=0;j<n;j++)

{

_nop_();

}

}


Ⅶ 求51單片機模擬SPI通訊的C程序,最好帶詳解!謝謝

調試已經通過
///////////////////////////spi.h/////////////////////////////
#ifndef
SPI_H
#define
SPI_H
#include
<stc12le5a60s2.h>
#include
<spi.h>
//sfr
P4
=
0xe8;
//STC12LE5A60S2單片機自帶SPI控制器連接
//sbit
VCC1
=
P2^0;//
VCC1
NO
USE
//sbit
SON
=
P1^6
;//
MISO
//sbit
SIN
=
P1^5
;//
MOSI
//sbit
SCKN
=
P1^7
;
//
SCK
sbit
CSN
=
P1^4
;//
28J60
--
CS
//sbit
RSTN
=
P3^5
;
//RST,
no
use
//sbit
INTN
=
P3^3
;
//
INT,
no
use
void
init_spi(void);
void
WriteByte(u8_t
temp);
u8_t
ReadByte(void);
#endif
////////////////////////////////////////////////////////////////
///////////////////////////spi.c/////////////////////////////
#include<spi.h>
//STC12LE5A60S2單片機自帶SPI控制器連接
void
init_spi(void)
{
//SSIG
=
1;
//忽略SS腳
//SPEN
=
1;
//允許SPI工作
//DORD
=
0;
//先傳高位MSB
//MSTR
=
1;
//設置單片機為主機
SPCTL
=
0xD0;
//SPI
Control
Register
SSIG
SPEN
DORD
MSTR
CPOL
CPHA
SPR1
SPR0
0000,0100
SPSTAT
=
0xC0;
//
//IE2
|=
0x02;
//允許SPI中斷控制位
}
void
WriteByte(u8_t
temp)
{
SPDAT
=
temp;
while(!(SPSTAT
&
0x80));
SPSTAT
=
0xC0;
}
u8_t
ReadByte(void)
{
idata
u8_t
temp;
//SPSTAT
=
0xC0;
SPDAT
=
0x00;
while(!(SPSTAT
&
0x80));
temp
=
SPDAT;
SPSTAT
=
0xC0;
return
temp;
}
////////////////////////////////////////////////////////////////

Ⅷ 51單片機控制74hc595輸出進而控制發光二極體點亮

51單片機控制74hc595輸出進而控制發光二極體點亮:74hc595是一個反極性驅動,也就是說如果用的是共陰數碼管,段選端本應高電平點亮,如果在單片機的p口送個高電平,但是經過74hc595後你的高電平就變成低電平了,所以要在單片機那面往595送低電平,共陽相反,然後在將位選選通,如果想固定顯示某個數或者循環顯示某幾個數的話,就直接只一個表這個表就是八字碼,然後通過查表就可以了,如果不是的話就能麻煩點,需要將待顯示的數據轉成十進制然後經過處理後再查表送顯示。

二極體,(英語:Diode),電子元件當中,一種具有兩個電極的裝置,只允許電流由單一方向流過,許多的使用是應用其整流的功能。而變容二極體(Varicap Diode)則用來當作電子式的可調電容器。大部分二極體所具備的電流方向性我們通常稱之為「整流(Rectifying)」功能。二極體最普遍的功能就是只允許電流由單一方向通過(稱為順向偏壓),反向時阻斷 (稱為逆向偏壓)。因此,二極體可以想成電子版的逆止閥。
早期的真空電子二極體;它是一種能夠單向傳導電流的電子器件。在半導體二極體內部有一個PN結兩個引線端子,這種電子器件按照外加電壓的方向,具備單向電流的傳導性。一般來講,晶體二極體是一個由p型半導體和n型半導體燒結形成的p-n結界面。在其界面的兩側形成空間電荷層,構成自建電場。當外加電壓等於零時,由於p-n 結兩邊載流子的濃度差引起擴散電流和由自建電場引起的漂移電流相等而處於電平衡狀態,這也是常態下的二極體特性。
早期的二極體包含「貓須晶體("Cat's Whisker" Crystals)」以及真空管(英國稱為「熱游離閥(Thermionic Valves)」)。現今最普遍的二極體大多是使用半導體材料如硅或鍺。

Ⅸ 51單片機IO口模擬SPI

下面就是一個 SPI 輸出的函數,時序,在程序裡面,表述的非常清楚。

sbit sck = P2^7;//移位時鍾
sbit da1 = P2^6;//串列數據

void send(char dat)
{
char i;
for(i = 0; i < 8; i++) {
if((dat >> i) & 0x01) da1 = 1; else da1 = 0;
sck = 0; sck = 1;
}
}

閱讀全文

與51單片機sck相關的資料

熱點內容
燕趙紅楓app如何下載 瀏覽:867
php查殺軟體 瀏覽:875
教育管理學pdf 瀏覽:547
伺服器均衡怎麼使用 瀏覽:626
linux中jps 瀏覽:954
單片機實驗感想 瀏覽:560
程序員級別數學演算法邏輯 瀏覽:899
2k21公園怎麼換伺服器 瀏覽:724
php釋放資料庫連接 瀏覽:722
php網頁抓取工具 瀏覽:726
android設置對齊方式 瀏覽:23
linux創建網頁 瀏覽:280
凈化車間門演算法 瀏覽:934
安卓怎麼搞jpg 瀏覽:546
如來佛祖命令雷神去下界 瀏覽:856
新電腦管家下載好怎麼解壓 瀏覽:530
php獲取介面數據 瀏覽:767
最後的命令 瀏覽:921
如何添加手機app桌面快捷圖標 瀏覽:427
ui設計師與程序員 瀏覽:418