你有可能还没有运行到发送命令的那个程序去,先单编一个串口通讯程序,把串口通讯测试成功如下:
uint8 code trdata1[]={0,0,24,160,1,236};
void Txd2_num(void)
{
uint8 i=0;
for(i=0;i<6;i++)
{
Usart1RxdBuf[i]=trdata1[i];
}
SBUF =Usart1TxdBuf[0];
Usart1TxdCnt=0;
Usart1TxdNum =6;
Usart1TxdBusy=1;
}
/
串口1中断
/
void RXD_Int_Service() interrupt 4
{
uint8 ch;
if(RI)
{
RI=0;
Usart1RxdDly=6; //超过03S清空计数
Usart1RxdBuf[Usart1RxdCnt]=ch;
Usart1RxdCnt++;
if(Usart1RxdCnt>=10)
{
Usart1RxdTrue=1; //接收正确。
Usart1RxdNum=Usart1RxdCnt;
Usart1RxdCnt=0;
}
}
if(TI)
{
TI=0;
if(Usart1TxdBusy)
{
Usart1TxdCnt++;
if(Usart1TxdCnt<Usart1TxdNum) //发送计数。
SBUF=Usart1TxdBuf[Usart1TxdCnt];
else
Usart1TxdBusy=0; //发送完成一帧数据,标志位。
}
}
}
我的红外摇控接收程序如下,可作参考
//
//中断接收摇控头的信号
unsigned int code comp[5]={6000,2000,500,200,500}; //分别代表9mS,45mS,15mS,056mS,15mS
//此时晶振为12MHz
unsigned char Cnt;
void Ex_Int0_InSevice() interrupt 0
{
unsigned char j=0,i=0,ch[4];
unsigned int comp_data=0;
ch[0]=0;
ch[1]=0;
ch[2]=0;
ch[3]=0;
if(red_rxd==0 && !rxd_ture && RedDly==0)
{
while(red_rxd==0)comp_data++; //等高电平的到来
if(comp_data>comp[0]) //9mS的低电平
{
comp_data=0;
while(red_rxd==1)
{
comp_data++; //等低电平的到来
if(comp_data>5000)
return;
}
if(comp_data>comp[1]) //45mS的低电平
{
while(i<4)
{
for(j=0;j<8;j++)
{
while(red_rxd==0); //等高电平的到来
comp_data=0;
while(red_rxd==1)
{
comp_data++; //等低电平的到来
if(comp_data>1500)
return;
}
ch[i]=ch[i]>>1;
if(comp_data>comp[2])
ch[i]=ch[i]|0x80;
}
i++;
}
Cnt++;
if(Cnt>3)Cnt=0;
if(ch[0]==0x00&&ch[1]==0xff&&(ch[2]+ch[3])==0xff)
{
IR_key=ch[2];
rxd_ture=1;
}
}
}
}
RedDly=3;
}
IIC分主从,据我所知,从机不能主动发数据给主机(我也没查过这些资料,我就按我所知道和接触过的说)。IIC一般是2根线,主机不断控制CLK的翻转,这就是通讯频率,翻转一次,就通过SDA传一个数据(0或1)
主机写数据到从机:起始+地址+读写命令+地址+数据+数据+数据++结束信号。
从机:检测到起始+读地址+判断到写命令+读取地址+读取n个数据(n>0)+结束信号
主机读从机数据:起始+地址+读写命令+地址
从机:检测到起始+读地址+判断到写命令+读取地址+控制SDA发送数据+直到检测到结束信号
起始后7个数据是地址,第8个是读写标志。
如果是写,表示下面SDA由主机控制,从机读SDA的状态。
如果读,表示下面主机只控制CLK的信号翻转,从机在每次翻转时候,将数据写入SDA,主机来读。从机一直到发现新的起始信号活着结束信号方才结束本次通讯。
总的来说:
主机控制时钟频率(SCK翻转频率,可以不均匀)。
主机先写,告诉从机下面要干嘛(写/读)。
这个讲的是I2C协议的具体SDA与SCL高低电平时序,就假如你用51单片机两个I/O口 一个I/O模拟SDA 一个I/O模拟SCL时 你可以按照以上里面的时序来编辑两个I/O高低电平时序。假如你有I2C通讯硬件模块的话 你就不需要以上直接用模块就行。上面讲的东西 大部分在I/O口模拟I2C 传输数据时才会用到,比较底层。不知道我的回答你能理解么。
以上就是关于跪求高手帮忙修改,想用串口助手读出红外遥控的按键值,问题是串口助手什么都没收到,先谢过了!!!全部的内容,包括:跪求高手帮忙修改,想用串口助手读出红外遥控的按键值,问题是串口助手什么都没收到,先谢过了!!!、两个不同的芯片之间用IIC通信,如何实现、51单片机的I2C通讯问题.w等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)