首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

51单片机定时器与中断有关问题

2013-03-04 
51单片机定时器与中断问题本帖最后由 tangyikejun1 于 2012-12-16 10:26:46 编辑程序功能模拟雷达发送接收

51单片机定时器与中断问题
本帖最后由 tangyikejun1 于 2012-12-16 10:26:46 编辑 程序功能模拟雷达发送接收,主单片机定期发出一个信号,从机收到信号后经过固定时间返回一个信号。现在遇到的问题是主单片机发送信号的周期不固定,导致从机返回信号也是混乱的。

主单片机程序如下:

主程序:



#include <reg52.h>
#include<intrins.h>

/******显示部分******/
extern unsigned char DisBuf[6];
extern void Display(void);
/*******************/

typedef  unsigned char uchar;
typedef  unsigned int uint;

sbit Sd_wave = P1^0;
sbit P1_2 = P1^2;
void Init(void);
void Send(void);
void StartTimer(void);
void Delay_ms(uint Time);

void main()
{
Init();

while (1)
{
Send();     //发送信号
StartTimer();//开始定时
Delay_ms(5);     //延时时间大于定时时长
 
Display();
}
}

void Init(void)
{

//初始化定时器
TMOD = TMOD | 0x10;

TH1 = 0;
TL1 = 0;

ET1 = 1;

//初始化INT1
IT1 = 1;
EX1 = 1;

EA  = 1;


}

void Send(void)
{
Sd_wave = 0;
_nop_(); 
_nop_();
_nop_();
_nop_(); 
_nop_(); 
_nop_();
_nop_();
_nop_();
_nop_(); 
_nop_();
_nop_();
_nop_();
Sd_wave = 1;
}

void StartTimer(void)
{
TH1 = 0;
TL1 = 0;
TR1 = 1;
}

void Delay_ms(uint Time)
{

uint i,j;

for (i = 0; i < Time; i++)
 for (j = 0; j < 1000; j++);

TR1 = 0;
}

void WaveReceive() interrupt 2
{
//显示定时器时间

//显示高位的两个数 和 低位的两个数
 
 TR1 = 0; //这里必须把定时器关掉,不然会出现误差


 DisBuf[0] = TH1 / 100;
 TH1 = TH1 % 100;
 DisBuf[1] = TH1 / 10;
 DisBuf[2] = TH1 % 10;

 DisBuf[3] = TL1 / 100;
 TL1 = TL1 % 100;
 DisBuf[4] = TL1 / 10;
 DisBuf[5] = TL1 % 10;
 
}

void TimeUp(void) interrupt 3
{
//关闭定时器

TR1 = 0;
}


Display.c  显示部分没有问题

#include <Reg52.h>//51单片机的头文件 

unsigned char DisBuf[6];//定义显存空间为4个字节,显示时将对应的显存空间中的数送到对应数码管显示 

/*定义数码管段码数组 */
code unsigned char LedCode[] = {0x3f, 0x06, 0x5b, 0x4f, 
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71};

/*定义数码管位选数组 */
code unsigned char LedSeg[] = {0xfe, 0xfd, 0xfb, 0xf7,0xef,0xdf,0xbf,0x7f};

/***************************************************************
函数名称:Delay
函数功能:实现一个短暂的延时 
入口参数:无 
出口参数:无 
***************************************************************/
void Delay (void)
{
unsigned int time;
for (time=0; time<500; time++);
}

/***************************************************************


函数名称:Display
函数功能:主程序 
入口参数:无 
出口参数:无 
***************************************************************/
void Display (void)
{
unsigned char i;

for (i=0; i<6; i++)
{
P0 = LedCode[DisBuf[i]];//送段码 (要显示的数字为“1234”) 
P2 = LedSeg[i];//送位选 
Delay();//延时 
P2 = 0xff;//消隐 (消隐就是将所有数码管都关闭) 
}
}



从机程序



我测试过用定时器方式和用for语句延时地效果基本一致。
各位大侠帮忙看看,问题出在何处。

[解决办法]
添加RDY标志位。
主机发送,可以发送了吗? if(SEND_RDY == 1).
从机接收,可以接收吗? if(REC_RDY == 1).
如此,等等。
[解决办法]
引用:
添加RDY标志位。
主机发送,可以发送了吗? if(SEND_RDY == 1).
从机接收,可以接收吗? if(REC_RDY == 1).
如此,等等。

++

热点排行