程序将RS232转换为I2C。通过串口助手发送10个字节数据。测试SDL/SCL波形都是对的如下图那个宽的波形。但第二次发同样字节的数据,波形是下图窄的波形,放大后是下第二个图。不知道是哪来的。我在第三次发这10个字节,波形又对了,第四次波形又错成这个窄的了。对一次,错一次。不知道为什么。大家帮我看看啊。
#include <reg52.h>
#include "intrins.h"
#include "stdlib.h"
#include "stdio.h"
sbit SDA=P2^2;
sbit SCL=P2^3;
sbit SW1 =P1^0;
sbit SW2 =P1^1;
sbit SW3 =P1^2;
sbit SW4 =P1^3;
sbit INH1=P2^4;
sbit BEEP=P2^1;
int *pBlock;
int length;
int j;
int a[10];
int *pt=a;
int d;
#define uchar unsigned char
#define I2C_BUSY 1
#define I2C_READY 0
//延时
void DelayMS(int ms)
{
int i;
while(ms--)
for(i=0;i<120;i++);
}
void WaitforIO()
{
DelayMS(1);
}
void I2CSTART() //开始信号
{
SDA=1;
SCL=1;
WaitforIO();
SDA=0;
WaitforIO();
SCL=0;
WaitforIO(); //0815 Add
}
void I2CSTOP() //停止信号
{
SDA=0;
SCL=0;
WaitforIO();
SCL=1;
WaitforIO();
SDA=1;
WaitforIO(); //0815 Add
}
bit Ask() //应答信号
{
bit ack_bit;
SDA = 1;
WaitforIO();
WaitforIO();
SCL = 1;
WaitforIO();
ack_bit = SDA;
WaitforIO();
SCL = 0;
WaitforIO();
return ack_bit;
}
int WriteI2C(int SendData) //发送1个字节
{
unsigned int BitSelect = 0x80;
while(BitSelect)
{
if(BitSelect&SendData)
SDA=1;
else
SDA=0;
WaitforIO();
SCL=1;
WaitforIO();
SCL=0;
WaitforIO();
BitSelect>>=1;
}
}
void comm_init(void) //串口初始化
{
TMOD=0x20; //定时器T1,方式2,定时
PCON=PCON&0x7f; //SMOD=0
SCON=0x50; //串口工作方式1,允许串行接收
TH1=0xfd; //波特率9600,频率11.0592MHZ
TL1=0xfd;
TR1=1; //开定时器T1运行控制位
EA=1; //开中断
ES=1; //允许串行中断
}
void send(int dat) //发送子程序
{
//发送中断标志位清零
SBUF =dat; //要发送的字符放入缓冲区
while(TI==0);
TI = 0;
}
void receive(void) interrupt 4 //中断方式接收
{
if(RI==1) //检测是否接收到数据
{
RI=0; //接收中断标志位清零
a[j]=SBUF;
send(a[j]);
j++;
if(j==10)
{
j=0;
d=1;
}
//取接收的数据
//SBUF=a[j];
}
// recv_state=1;
// else
// TI=0;
// }
}
void main(void)
{
BEEP=0;
INH1=1;
SDA=1;
SCL=1;
comm_init();
d=0; //判断串口是否发送数,0未发送,1发送。
while(1)
{
if(d==1)
{
d=0;
I2CSTART();
I2CSTART();
WriteI2C(a[0]);
for(j=1;j<10;j++)
{
if(!Ask())
{
WriteI2C(a[j]);
}
}
I2CSTOP();
I2CSTOP();
}
}
}
|