C51单片机,用到定时器0、定时器1,分别用途定时和串口通信
定时器0、定时器1,分别用途定时和串口通信,要实现一个这样的功能1、首先定时器1工作(串口通信)完成后,2、定时器0启动工作(开始定时)完成后3、定时器1恢复工作(串口通...
定时器0、定时器1,分别用途定时和串口通信,要实现一个这样的功能
1、首先定时器1工作(串口通信)完成后,
2、定时器0启动工作(开始定时)完成后
3、定时器1恢复工作(串口通信)完成后
4、定时器0恢复工作(开始定时)完成后
5、第3和第4可正常切换工作,互不影响
下面是我写的,有很多问题,请高手帮忙,以实现以上功能,谢谢!
#include <reg51.h>
void delay(unsigned int i); //函数声名
void mc(unsigned char i);
/*---------定义全局变量------------*/
unsigned char K = 0;//计时
unsigned char Miao = 0;//秒
unsigned int Fen = 0;//分
unsigned int Fen2 = 0;
unsigned char tmp , flag;
void InitUART_1(void)
{
TMOD = 0x20; //定时器1 工作于模式2(作串口通信用)
SCON = 0x50; // 0x50 = 10100000 工作模式2
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void dsqcsh(void)//定时器0初始化函数
{
//TMOD = 0x02;//定时器0 工作于模式2(作定时器用)
TH0 = 0x00;// 定时时间200us
TL0 = 0x48;
EA = 1;//开总中断
ET0 = 1;//开定时器/计数器0中断
TR0 = 1;//定时器/计数器0开始计时
}
void main(void)
{
dsqcsh();
InitUART_1();
while(1)
{
if(flag == 1)
{
ES=0;
flag = 0;
tmp = SBUF;
LedNumVal = SBUF ;
SBUF = tmp;
Fen2 = 1;
while(!TI);
TI=0;
TR1 = 0;
TMOD = 0x02;
TR1 = 1;
}
if(Fen2 == 1)
{
TMOD = 0x02;
ET0 = 1;
P3_4 = 1;
TR0 = 1;// 开始计时
mc(tmp);
}
else
{}
}
}
void UARTInterrupt(void) interrupt 4 // 串口通信中断入口
{
if(RI)
{
RI = 0;
flag = 1;
//add your code here!
}
else
{
TI = 0;
}
}
void SendOneByte(unsigned char c)
{
/*SBUF = c;
while(!TI);
TI = 0;
*/
}
void Timer1Interrupt(void) interrupt 1//定时器0 工作于模式2 中断入口
{
//unsigned int i;
TH0 = 0x00;
TL0 = 0x48;
++K;
if(K>=1)
{
++Miao;
K = 0;
}
else{}
//add your code here!
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 500; j > 0; j--);
}
void mc(unsigned char i)
{
if(Miao>=1)
{
if(Fen>=i*2)
{
LedNumVal = Fen;
TR0 = 0;
ET0 = 0;
TMOD = 0x20; //定时器1 工作于模式2(作串口通信用) 打开
//flag = 1;
Fen = 0;
Fen2 = 0;
//delay(10);
ES=1;
TR1 = 1;
//++Q; //圈记数,每走一圈加1
}
else
{
P3_2 = !P3_2;
Miao = 0;
++Fen;
}
}
//for(i=i;i<=0;--i)
//P3_2 = !P3_2;
} 展开
1、首先定时器1工作(串口通信)完成后,
2、定时器0启动工作(开始定时)完成后
3、定时器1恢复工作(串口通信)完成后
4、定时器0恢复工作(开始定时)完成后
5、第3和第4可正常切换工作,互不影响
下面是我写的,有很多问题,请高手帮忙,以实现以上功能,谢谢!
#include <reg51.h>
void delay(unsigned int i); //函数声名
void mc(unsigned char i);
/*---------定义全局变量------------*/
unsigned char K = 0;//计时
unsigned char Miao = 0;//秒
unsigned int Fen = 0;//分
unsigned int Fen2 = 0;
unsigned char tmp , flag;
void InitUART_1(void)
{
TMOD = 0x20; //定时器1 工作于模式2(作串口通信用)
SCON = 0x50; // 0x50 = 10100000 工作模式2
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void dsqcsh(void)//定时器0初始化函数
{
//TMOD = 0x02;//定时器0 工作于模式2(作定时器用)
TH0 = 0x00;// 定时时间200us
TL0 = 0x48;
EA = 1;//开总中断
ET0 = 1;//开定时器/计数器0中断
TR0 = 1;//定时器/计数器0开始计时
}
void main(void)
{
dsqcsh();
InitUART_1();
while(1)
{
if(flag == 1)
{
ES=0;
flag = 0;
tmp = SBUF;
LedNumVal = SBUF ;
SBUF = tmp;
Fen2 = 1;
while(!TI);
TI=0;
TR1 = 0;
TMOD = 0x02;
TR1 = 1;
}
if(Fen2 == 1)
{
TMOD = 0x02;
ET0 = 1;
P3_4 = 1;
TR0 = 1;// 开始计时
mc(tmp);
}
else
{}
}
}
void UARTInterrupt(void) interrupt 4 // 串口通信中断入口
{
if(RI)
{
RI = 0;
flag = 1;
//add your code here!
}
else
{
TI = 0;
}
}
void SendOneByte(unsigned char c)
{
/*SBUF = c;
while(!TI);
TI = 0;
*/
}
void Timer1Interrupt(void) interrupt 1//定时器0 工作于模式2 中断入口
{
//unsigned int i;
TH0 = 0x00;
TL0 = 0x48;
++K;
if(K>=1)
{
++Miao;
K = 0;
}
else{}
//add your code here!
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 500; j > 0; j--);
}
void mc(unsigned char i)
{
if(Miao>=1)
{
if(Fen>=i*2)
{
LedNumVal = Fen;
TR0 = 0;
ET0 = 0;
TMOD = 0x20; //定时器1 工作于模式2(作串口通信用) 打开
//flag = 1;
Fen = 0;
Fen2 = 0;
//delay(10);
ES=1;
TR1 = 1;
//++Q; //圈记数,每走一圈加1
}
else
{
P3_2 = !P3_2;
Miao = 0;
++Fen;
}
}
//for(i=i;i<=0;--i)
//P3_2 = !P3_2;
} 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询