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;
}
#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;//消隐 (消隐就是将所有数码管都关闭)
}
}