导航:首页 > 操作系统 > 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相关的资料

热点内容
如来佛祖命令雷神去下界 浏览:854
新电脑管家下载好怎么解压 浏览:528
php获取接口数据 浏览:763
最后的命令 浏览:921
如何添加手机app桌面快捷图标 浏览:427
ui设计师与程序员 浏览:417
寿司pdf 浏览:828
pythonbg是什么 浏览:248
c数值算法程序大全 浏览:785
android整点报时 浏览:221
稀土pdf 浏览:536
单片机电子锁 浏览:596
通达信机智资金流指标公式源码 浏览:216
php安装xsl扩展 浏览:842
python如何使用help 浏览:367
上汽荣威app在哪里查询 浏览:903
冰柜压缩机温度108 浏览:720
阿里云邮smtp服务器地址 浏览:252
解压馆认知理解 浏览:239
为什么使用非官方服务器会封号 浏览:9