这是从单片机向PCF8563传递数据的程序,用示波器检测SDA管脚有波形显示,但是看不懂传进去的数是不是对的,所以想用串口调试助手看看,可是连上串口后,在电脑上显示不出来发送的数据,不知道是不是程序哪里有问题,恳请各位帮忙看一下,非常感谢~新人一个,有许多地方都很迷茫..........
# include <reg52.h>
# include <intrins.h>
# define Min 0x03
# define Hou 0x04
# define uchar unsigned char
#define XTAL 12000000 // CUP 晶振频率
#define baudrate 2400 // 通信波特率
sbit SDA=P1^7;
sbit SCL=P1^6;
sbit text=P0^1;
uchar min;
uchar hou;
uchar time_data[3];
bit ack;
void _Nop(uchar i) /*定义空指令*/
{
uchar j;
for(j=0;j<i;j++);
}
void I2C_Start(void)
{
SDA=1;
_Nop(1);
SCL=1;
_Nop(5);
SDA=0;
_Nop(5);
SCL=0;
_Nop(2);
}
void I2C_Stop(void)
{
SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SDA=1;
_Nop(4);
}
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt <8;BitCnt++)
{
uchar j;
if((c<<j)&BitCnt)
SDA=1;
else SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SCL=0;
}
_Nop(2);
SDA=1;
_Nop(2);
SCL=1;
_Nop(3);
if(SDA==1)ack=0;
else ack=1;
SCL=0;
_Nop(2);
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop(1);
SCL=0;
_Nop(4);
SCL=1;
_Nop(2);
retc=retc<<1;
if(SDA==1)retc=retc+1;
_Nop(2);
}
SCL=0;
_Nop(2);
return(retc);
}
void Ack_I2C(uchar a)
{
if(a==0)SDA=0;
else SDA=1;
_Nop(3);
SCL=1;
_Nop(5);
SCL=0;
_Nop(2);
}
void ISendByte(uchar sla,uchar suba,uchar c)
{
I2C_Start();
SendByte(sla);
_Nop(1);
SendByte(suba);
_Nop(1);
SendByte(c);
_Nop(1);
I2C_Stop();
time_data[0]=sla;
time_data[1]=suba;
time_data[2]=c;
}
uchar IRcvByte(uchar sla,uchar suba)
{
uchar c;
I2C_Start();
SendByte(sla);
_Nop(10);
SendByte(suba);
_Nop(10);
I2C_Stop();
I2C_Start();
SendByte(sla+1);
_Nop(10);
c=RcvByte();
Ack_I2C(1);
I2C_Stop();
}
/****************************串口初始化****************************/
void init(void)
{
EA=1; // "中断总允许"
ES=1;
TMOD=0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
SCON=0x50; // 设定串行口工作方式(UART为模式1,8位数据,允许接收)
PCON=0x00; // 波特率不倍增
TR1=1; // 启动定时器1
}
/*******************发送十六位的温度数据,低位在前******************/
void send_char(void)
{
uchar i;
while(i < 3)
{
SBUF=time_data
;
while(!TI);// 等特数据传送
TI=0; // 清除数据传送标志
i++;
}
}
void main()
{
init();
while(1)
{
ISendByte(0xA2,0x03,0x00);
send_char();
}
}
此帖出自小平头技术问答
一周热门 更多>