本帖最后由 alluptoyou 于 2011-4-27 01:29 编辑
正在做一个项目,关于单片机双机通信,但是不用串口通信,而是用单片机一个IO口来通信,在一个IO口上传输数据信息,另一个单片机按照通信协议,定时检测IO口状态,并且记录下来。发送端是单片机产生40us,占空比为50%的脉冲信号。以下是本人接收端检测IO口的程序。通过串口助手,我看到数组的数据跟理论上的有错误。即理论上应该是101010101010这样的序列,但是串口助手上显示的数却是11010010011之类的连零和连一。定时器的初值我也测试过很多次,但都是不行。麻烦各位指点一下学生,是我程序设计有问题还是这种方法不行???顺便问一下,单片机的中断引脚触发中断后,进入中断能够继续正确读取该中断引脚的状态么???
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar rr[64]; //用来存接收的数据
sbit wire = P3^2; //into
sbit sound = P2^5;
bit output=0;
uchar k=0;
uchar a,b;
void init_com( void ) //使用定时器2做波特率发生器进行串口通信
{
SCON=0x50; //串口工作方式1,10位UART,可变
T2CON=0x30; //设置
TH2=0xff;
TL2=0xdc; //波特率:9600bps,晶振:11.0592M
RCAP2H=0xff;
RCAP2L=0xdc; //16位自动再装入值
EA=0; //开中断
ES=0; //开串口中断
TR2=1; //定时器2开始
}
void senddata() //串口发送数据给PC
{
uchar y;
for(y=0;y<64;y++)
{
SBUF=rr[y];
while(TI==0);
TI=0;
}
}
void timer0(void) interrupt 1 //定时器0中断
{
rr[k++]=wire; //将IO口的状态保存下来;
}
void external0(void) interrupt 0
{
TR0=0; //关闭定时器,重装初值
TL0=b;
rr[k++]=0; //外部中端边缘跳变,所以此时IO口状态必定为低电平,直接存0
TR0=1; //开启定时器
}
void main()
{
P3=1; //p32口置1,保证单片机就能正常读取该口状态
a=256-20; 设置中断的计数初值为20,即20us中断一次
b=256-20;
init_com(); //初始化串口
sound=0; //关蜂鸣器
TMOD=0x02;
EA=1;
ET0=1;
IT0=1;
TH0=a;
TL0=b;
while(wire==0);
while(wire==1);//保证定时器和外部中断是在一个脉冲电平的初始时刻开启
TR0=1;
EX0=1;
while(1)
{
if(k==64)
{
EX0=0;
TR0=0;
k=0;
senddata();
}
}
} |