stc89c52rc单片机与nrf24l01 pdf调试问题

大家来帮我看看51控制舵机的问题,它怎么就转不对(有程... - 单片机论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
大家来帮我看看51控制舵机的问题,它怎么就转不对(有程...
12:13:01  
舵机MG995、芯片STC89C52RC,无论我怎么设置PWM,舵机就是不按我想要的角度转,不仅满偏,还在满偏位置来回摆动,有谁能帮帮忙,解释一下原因
程序如下:
#include &reg51.h&
sbit P1_2=P1^2;
unsigned char a=0;
void InitTimer0(void)& && & //设置0.1ms中断一次
TMOD = 0x01;&&
TH0=()/256;
TL0=()%256;&&
ET0 = 1;&&
void main(void)
& &InitTimer0();
& &a=5;& && &//我用比较笨的方法逐次给不同的脉冲,第一次给0.5ms,看转的角度,然后改成a=10,再烧进程序,看1ms的转角
void PWM() interrupt 1
&&TH0=()/256;
&&TL0=()%256;&&
&&if(count&=a)
&&{P1_2=1;}
&&{P1_2=0;}
&&count++;
&&if(count == 200)
& &count=0;& & //20ms一个周期
12:21:27  
后来我把中断改为执行一次,但还是满偏,求救呀
12:22:32  
或者谁发个舵机MG995的数据手册给我,我好看看
13:03:23  
本帖最后由 Stone_up 于
11:42 编辑
(34.74 KB, 下载次数: 250)
13:02 上传
点击文件名下载附件
下载积分: 积分 -1 分
楼主试试我的程序,很久以前调试的
13:15:09  
你用示波器看看出来的脉冲是不是对的
15:28:00  
我用别人的程序,用示波器看了,能发出正确的PWM脉冲,且相应的LED会亮,但一接通舵机,程序就乱套了,灯也只在一个上不停地闪,这样是不是可以判断舵机是坏的
10:21:56  
问题解决了,因为我用的是单片机学习板,我一直是把VCC、GND、和数据线接到同一个板子上,导致VCC供电异常,后来我把vcc单独供应一个5V电源,GND和数据线还是在同一个板子,就正常了。感谢大家对我给予的帮助。
23:02:44  
22:20:58  
谢了!!!!!!
15:51:54  
感谢楼主,出现了和你一样的问题。现在弄好了
22:57:56  
我去这帖子。。。快半年了还这么靠前
15:48:44  
学习一下了啊
20:09:07  
XUEXILEXUEXILE多谢楼主
10:08:48  
等待验证会员
20:59:29  
同求啊 啊啊啊
01:44:50  
你用示波器看看出来的脉冲是不是对的
18:44:41  
你用示波器看看出来的脉冲是不是对的你用示波器看看出来的脉冲是不是对的你用示波器看看出来的脉冲是不是对的
12:56:46  
感谢楼主,我正在找呢,楼主6666啊,谢谢,太感谢了
10:40:37  
学习了,还是有点困惑
09:37:47  
那个外接5V电源怎么弄?
除了亲人欢聚的喜悦
让人头痛的就是来自亲朋好友的过度关怀
“做什么工作啊?”
“工资多少啊?”
“有没有女朋友?”
“什么时候结婚?”
“买房了吗?”
面对让人崩溃的问题,如何自救呢?快来支支招吧!
春节回家,除了见到亲人,儿时的玩伴
那一顿一顿的美食
带了家乡独有的味道
光是想想,都就能让人,垂涎三尺。
快拿起你手中的相机,拍下美食
一起分享你的幸福,还有机会中大奖喔
Powered bystc89c52+nrf24l01制作小车,无法应_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:126,789贴子:
stc89c52+nrf24l01制作小车,无法应收藏
单片机培训,达内单片机,历时15年,总监级讲师亲授,8师辅导1学员,40W学员见证!达内单片机与ARM公司联合教学.毕业获ARM公司颁发的嵌入式工程师国际认证证书.
//************************************************************************************** void Delay(unsigned int s); void inerDelay_us(unsigned char n); void init_NRF24L01(void); uint SPI_RW(uint uchar); //uchar SPI_Read(uchar reg); //void SetRX_Mode(void); uint SPI_RW_Reg(uchar reg, uchar value); //uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf); //*****************************************长延时***************************************** void Delay(unsigned int s) {
for(i=0; i&s; i++);
for(i=0; i&s; i++); } //******************************************************************************************
//状态标志 sbit RX_DR =sta^6; sbit TX_DS =sta^5; sbit MAX_RT =sta^4; /****************************************************************************************** /*延时函数 /******************************************************************************************/ void inerDelay_us(unsigned char n) {
for(;n&0;n--)
_nop_(); } //**************************************************************************************** /*NRF24L01初始化 //***************************************************************************************/ void init_NRF24L01(void) {
inerDelay_us(100);
// chip enable
// Spi disable
// Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
// 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
//SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);
频道0自动 ACK应答禁止 // SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);
// 自动重发10次,间隔500us SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
// 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
// 使能接收通道0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);
// 自动重发10次,间隔500us
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
//设置发射速率为2MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// IRQ收发完成中断响应,16位CRC,发射模式 }
//ps:波特率用设置么?IRQ用拉高么?不响应中断? /**************************************************************************************************** /*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 /****************************************************************************************************/ uint SPI_RW(uint uuchar) {
for(bit_ctr=0;bit_ctr&8;bit_ctr++) // output 8-bit
MOSI = (uuchar & 0x80);
// output 'uchar', MSB to MOSI
uuchar = (uuchar && 1);
// shift next bit into MSB..
// Set SCK high..
uuchar |= MISO;
// capture current MISO bit
// ..then set SCK low again
return(uuchar);
// return read uchar } /**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI时序 /****************************************************************************************************/ /*uchar SPI_Read(uchar reg) {
uchar reg_
// CSN low, initialize SPI communication...
SPI_RW(reg);
// Select register to read from..
reg_val = SPI_RW(0);
// ..then read registervalue
// CSN high, terminate SPI communication
return(reg_val);
// return register value }
*//****************************************************************************************************/
/*功能:NRF24L01读写寄存器函数 /****************************************************************************************************/ uint SPI_RW_Reg(uchar reg, uchar value) {
// CSN low, init SPI transaction
status = SPI_RW(reg);
// select register
SPI_RW(value);
// ..and write value to it..
// CSN high again
return(status);
// return nRF24L01 status uchar } /********************************************************************************************************* /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 /*********************************************************************************************************/ uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) {
uint status,uchar_
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr& uchar_ctr++) //
SPI_RW(*pBuf++);
return(status);
}uchar Check_ACK(bit clear){ while(IRQ); sta = SPI_RW(NOP);
// 返回状态寄存器 if(MAX_RT)
// 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
SPI_RW(FLUSH_TX); SPI_RW_Reg(WRITE_REG + STATUS, sta);
// 清除TX_DS或MAX_RT中断标志 IRQ = 1; if(TX_DS)
return(0x00); else
return(0xff);}/*********************************************************************************************************** /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功能:发送 tx_buf中数据 /**********************************************************************************************************/ void nRF24L01_TxPacket(unsigned char * tx_buf) {
//StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
// 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// IRQ收发完成中断响应,16位CRC,主发送
//置高CE,激发数据发送
inerDelay_us(50); } //************************************主函数************************************************************ void main() {unsigned char tf =0;uchar TxBuf[20]={0};//要发送的数组
init_NRF24L01();//模块初始化//P1=0while(1){P1=0//置高P1口电平if(K1==0)//前进键按下{led=0;TxBuf[1]=1;//赋值tf=1;}if(K2==0)//后退键按下{TxBuf[2]=1;
tf=1;}if(K3==0)//左转键按下{TxBuf[3]=1;tf=1;}if(K4==0)//右转键按下{TxBuf[4]=1;tf=1;}if(K5==0)//加速键按下{TxBuf[5]=1;tf=1;}if(K6==0)//减速键按下{TxBuf[6]=1;tf=1;}if (tf==1) //有键按下{
nRF24L01_TxPacket(TxBuf); //发送数据Transmit Tx buffer data TxBuf[1] = 0x00; //清零 TxBuf[2] = 0x00;TxBuf[3] = 0x00;TxBuf[4] = 0x00;TxBuf[5] = 0x00;TxBuf[6] = 0x00;led=1;tf=0;//清零Delay(1000); SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
//清状态寄存器 }}}
用2.4g透传模块就行了。然后自定义串口协议。
/*NRF24L01初始化 //***************************************************************************************/ void init_NRF24L01(void) {
inerDelay_us(100);
// chip enable
// Spi disable
// Spi clock line init high
IRQ=1; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
// 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
//SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);
频道0自动 ACK应答允许禁止
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
// 失能通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
// 接收要使能接收通道0
// SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
//设置发射速率为1MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
// IRQ收发完成中断响应,16位CRC ,主接收 } /**************************************************************************************************** /*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 /****************************************************************************************************/ uint SPI_RW(uint uchar) {
for(bit_ctr=0;bit_ctr&8;bit_ctr++) // output 8-bit
MOSI = (uchar & 0x80);
// output 'uchar', MSB to MOSI
uchar = (uchar && 1);
// shift next bit into MSB..
// Set SCK high..
uchar |= MISO;
// capture current MISO bit
// ..then set SCK low again
return(uchar);
// return read uchar } /**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI时序 /****************************************************************************************************/ uchar SPI_Read(uchar reg) {
uchar reg_
// CSN low, initialize SPI communication...
SPI_RW(reg);
// Select register to read from..
reg_val = SPI_RW(0);
// ..then read registervalue
// CSN high, terminate SPI communication
return(reg_val);
// return register value } /****************************************************************************************************/ /*功能:NRF24L01读写寄存器函数 /****************************************************************************************************/ uint SPI_RW_Reg(uchar reg, uchar value) {
// CSN low, init SPI transaction
status = SPI_RW(reg);
// select register
SPI_RW(value);
// ..and write value to it..
// CSN high again
return(status);
// return nRF24L01 status uchar } /****************************************************************************************************/ /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数 /****************************************************************************************************/ uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) {
uint status,uchar_
// Set CSN low, init SPI tranaction
status = SPI_RW(reg);
// Select register to write to and read status uchar
for(uchar_ctr=0;uchar_ctr&uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0);
return(status);
// return nRF24L01 status uchar } /********************************************************************************************************* /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 /*********************************************************************************************************/ uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) {
uint status,uchar_
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr& uchar_ctr++) //
SPI_RW(*pBuf++);
return(status);
} /****************************************************************************************************/ /*函数:void SetRX_Mode(void) /*功能:数据接收配置
/****************************************************************************************************/ void SetRX_Mode(void) {
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
// IRQ收发完成中断响应,16位CRC ,主接收
inerDelay_us(130); } /******************************************************************************************************/ /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) /*功能:数据读取后放如rx_buf接收缓冲区中 /******************************************************************************************************/ unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) {
unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
// 判断是否接收到数据
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1;
//读取数据完成标志
SPI_RW_Reg(WRITE_REG+STATUS,sta);
//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return(revale); } /*********************************************************************************************************** /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功能:发送 tx_buf中数据 /**********************************************************************************************************/ /* void nRF24L01_TxPacket(unsigned char * tx_buf) {
//StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
// 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// IRQ收发完成中断响应,16位CRC,主发送
//置高CE,激发数据发送
inerDelay_us(10); } */ //************************************串口初始化********************************************************* /*void StartUART( void ) {
//波特率4800
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFA;
TL1 = 0xFA;
PCON = 0x00;
TR1 = 1; } //************************************通过串口将接收到数据发送给PC端************************************** void R_S_Byte(uchar R_Byte) {
SBUF = R_B
while( TI == 0 );
*///************************************主函数************************************************************ void main(void) {
uchar i=10;unsigned char tf =0; uchar RxBuf[20]={0};//接收的数据数组 init_NRF24L01();//模块初始化//***********************************l298n**************************************************TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值 */ TL0=0x9B; EA=1; /* 开中断 */ ET0=1; /* 定时器0允许中断 */ TR0=1; /* 启动定时器0 */ //******************************nrf24l01****************************************************** while(1){P1=0x00;SetRX_Mode();//设置成接受模式RxBuf[1]=0x00;//接收的数组相应位清零RxBuf[2]=0x00;RxBuf[3]=0x00;RxBuf[4]=0x00;RxBuf[5]=0x00;RxBuf[6]=0x00;Delay(1000);nRF24L01_RxPacket(RxBuf);//接收数据if(nRF24L01_RxPacket(RxBuf)){if(RxBuf[1]==1){motor(1,i);
motor(2,i);}if(RxBuf[2]==1){motor(1,-i);
motor(2,-i);}if(RxBuf[3]==1){motor(2,i);}if(RxBuf[4]==1){motor(1,-i);}if(RxBuf[5]==1){for(;i&=50;i+10)Delay(20);}if(RxBuf[6]==1){for(;i&=-50;i-10)Delay(20);}Delay(3000);//oldis'1000'}RxBuf[1]=0x00;//清零RxBuf[2]=0x00;RxBuf[3]=0x00;RxBuf[4]=0x00;RxBuf[5]=0x00;RxBuf[6]=0x00;P1=0x00;}}void timer0() interrupt 1 /* T0中断服务程序 */ { if(t==0) /* 1个PWM周期完成后才会接受新数值 */ { tmp1=m1; tmp2=m2; } if(t&tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */ if(t&tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */ t++; if(t&=100) t=0; /* 1个PWM信号由100次中断产生 */ }
你无线程序写错了,加我企鹅
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或 本次课程设计包含四个基于 STC89C52 单 片机的设计,分别是:基于单总线数字式...1302 的电子日历的设计以及基于无线收发芯片 nrf24L01 的简单无线通讯系统的设计...  本次课程设计包含四个基于 STC89C52 单 片机的设计,分别是:基于单总线数字式...1302 的电子日历的设计以及基于无线收发芯片 nrf24L01 的简单无线通讯系统的设计...  这次的单片机课程设计中学习了 YL-39 51/AVR 单片机开发板、NRF24L01 无线通信...(2)芯片型号 芯片型号选择错误(开发板上配套的芯片型号为STC89C52) 。(3)...  系统方案选择与分析 1.1 主控芯片方案采用传统的 STC89C52 单片机作为主控芯片...框图 接收: 第 5 页共 30 页 基于 STC89C52 无线温度计的设计 NRF24L01?...  接收端软件设计与调试 本系统接收端采用 nRF24L01 无线模块接收发送端传来的距离数据,经单片 机 STC85C52 在 LCD1602 液晶显示器上显示。其中包括 nRF24L01 ...  基于单片机24L01无线遥控车设计_电子/电路_工程科技_专业资料。单片机无线遥控车摘要...概述本系统使用 STC89C52RC 为控制核心,通过 SPI 接口控制 nRF24L01 发送 ...  单片机毕业设计 13页 2财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能...关键词:STC89C52 温度传感器 nRF24L01 Based on the 2.4 G car security ...  在程序设计之前先了解下 NRF24L01。 NRF24L01 是 NORDIC 公司最近生产的一款...(IO 口模拟,STC89C52 没有硬件 SPI,若您会了 STC12C5Axxxx 系列的单片机...  使用 DIY 方式设计 NRF24L01 的接口板, 且包含含单片机平台, 使用 PCB 方 式...STC89C52 没 有硬件 SPI,若您会了 STC12C5Axxxx 系列的单片机那么您可以使用...

我要回帖

 

随机推荐