打印

更新,请高手救命,关于单片机定时检测信号脉冲问题

[复制链接]
2636|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alluptoyou|  楼主 | 2011-4-25 18:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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();
   
    }  
}  

}

相关帖子

沙发
alluptoyou|  楼主 | 2011-4-25 18:57 | 只看该作者
请大家帮帮忙!!!

使用特权

评论回复
板凳
SHUJIEWS| | 2011-4-26 20:45 | 只看该作者
你没说有什么问题啊?

使用特权

评论回复
地板
alluptoyou|  楼主 | 2011-4-27 01:30 | 只看该作者
3# SHUJIEWS
已经说明了问题。检测到的电平状态跟理论上有出入。请指教。。。

使用特权

评论回复
5
ayb_ice| | 2011-4-27 08:20 | 只看该作者
直接模拟UART不就可以了

使用特权

评论回复
6
joyme| | 2011-4-27 09:07 | 只看该作者
你的接受程序呢?用查询法检测,需要很谨慎,不能用过多的语句,40us 占空比50%的脉宽对单片机来说频率算比较高的。

使用特权

评论回复
7
alluptoyou|  楼主 | 2011-4-27 10:57 | 只看该作者
6# joyme
上面那个程序就是我接收端的程序啊。。。
发送端的程序如下::::


#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit wire = P3^2;   
sbit sound = P2^5;
sbit led=P0^0;
uchar j=0;

void timer1(void) interrupt 3
{
  wire=~wire;
}
void main()
{
sound=0;
TMOD=0x20;   //工作在方式2,,,8位自动重载,
TH1=256-40;
TL1=256-40;
ET1=1;
EA=1;
TR1=1;
while(1)
{}

}

使用特权

评论回复
8
alluptoyou|  楼主 | 2011-4-27 10:58 | 只看该作者
5# ayb_ice
但是项目规定用一个IO口通信。。。加上两个单片机的共地的线,总共也就2条。。。。

使用特权

评论回复
9
ayb_ice| | 2011-4-27 11:01 | 只看该作者
搞成半双工不就可以了,在协议下进行双向通信

使用特权

评论回复
10
alluptoyou|  楼主 | 2011-4-27 12:23 | 只看该作者
9# ayb_ice
额,请问可以说详细一点吗???不懂。

使用特权

评论回复
11
joyme| | 2011-4-29 09:01 | 只看该作者
速度太快,查询法检测边沿速度最好不要超过10K,高速的必须用中断检测边沿变化,可以参考max 1-wire通讯协议,刚好有个项目只有一个口通讯,所以选了max的1-wire IC,感觉还不错。你可以参考它的协议

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

0

粉丝