51单片机:T1用作定时器在p1.0产生方波脉冲,输出到T0,T0用作计数器,记录该方波的下降沿个数,如下所述

p1.1为高电平时T0开始计数,p1.2为高电平时T0停止计数。记录这段时间内T0所计的次数counter。程序如下,请高手指正。谢谢
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit FB=P1^0;
sbit loop1=P1^1;
sbit loop2=P1^2;

void initial(void)
{TMOD=0X05; // T1工作方式0,T0工作方式1
TH1=0Xf0; // 设定T1的定时时间
TL1=0X0c;
TH0=0X00; // 设定T0的计数初值
TL0=0X00;
IE=0X00;
TR1=1; //启动T1
TR0=0; //禁止T0
}

void delay(uint x) //延时函数
{uint i,j;
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}

void main(void)
{uint temp1,temp2,counter;

initial();
for(;;) //产生周期为1000us的方波
{while(!TF1)
TF1=0;
FB=!FB;

if(loop1=1)
TR0=1; //开始计数
if(loop2=1) //停止计数
{TR0=0;
temp1=TL0;temp2=TH0;
couter=(temp2<<8)+temp1; //记录计数的次数
}
}
}

void main(void)
{uint temp1,temp2,counter;

initial();
for(;;) //产生周期为1000us的方波
{
TH1=0Xf0; // 重新装载计数初值
TL1=0X0c;

while(!TF1); //你是用查询的方式产生方波,但原程序的这个部分有问题
FB=!FB;
TF1=0;

if(loop1=1)
TR0=1; //开始计数
if(loop2=1) //停止计数
{TR0=0;
temp1=TL0;temp2=TH0;
couter=(temp2<<8)+temp1; //记录计数的次数
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-19
你怎么不在中断里计数呢?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F的编码
uchar shi0 = 0,shi1 = 0,ge0 = 0,ge1 = 0;
uint num0 = 0,num1 = 0;//存放对应的计数值
uint count0 = 0,count = 0;//计数变量
uchar fre0 = 0,fre1 = 0;//频率值
bit flag = 0;//标志位
void Init(void);
void main()
{
Init();
while(1)
{
//到时1s,重新开始
if(count0 == 200)
{
count0 = 0;
//获取频率
fre0 = num0;
fre1 = num1;
shi0 = fre0 / 16;
ge0 = fre0 % 16;
shi1 = fre1 / 16;
ge1 = fre1 % 16;
num0 = 0;
num1 = 0;
}
}
}
/************************************************
// 中断初始化函数 //
************************************************/
void Init(void)
{
EX1 = 1;//开外部中断1
TMOD = 0x01;//设置定时器为工作模式1
//定时时间设置为5ms,频率为200Hz
TH0= (65536 - 5000) / 256;
TL0= (65536 - 5000) % 256;
ET0 = 1;//开定时器0中断
EA = 1;//开全局中断
}
/************************************************
// 外部中断1中断服务程序 //
************************************************/
void Extern1(void) interrupt 2
{
TR0 = 1;//使能定时器0
if(!flag)
{
IT1 = 1;//下降沿触发
num0++;//每进一次中断脉冲数加1
flag = 1;
}
else
{
IT1 = 0;//电平触发
num1++;//每进一次中断脉冲数加1
flag = 0;
}
}
/************************************************
// 定时器0中断服务程序 //
************************************************/
void Timer0(void) interrupt 1
{
count++;
count0++;
TH0= (65536 - 5000) / 256;
TL0= (65536 - 5000) % 256;
//数码管显示
if(count == 1)
{
P2 = 0x01;
P0 = ~table[shi0];
}
if(count == 2)
{
P2 = 0x02;
P0 = ~table[ge0];
}
if(count == 3)
{
P2 = 0x04;
P0 = ~table[shi1];
}
if(count == 4)
{
count = 0;
P2 = 0x08;
P0 = ~table[ge1];
}
}追问

这个程序是实现什么的?

追答

类似于频率计,对外部频率进行计数,然后用数码管显示频率的值

第2个回答  2011-04-19
{while(!TF1)
TF1=0;
FB=!FB;
把这个放中断里去处理吧追问

这块怎么放入中断中呢?中断不大会用。

追答

void _timer1() interrupt 3
{
TR1 = 0;
TH1=0Xf0; // 设定T1的定时时间
TL1=0X0c;
FB=!FB;
TR1=1;
}
方波部分就中断自行处理。
T0计数你可以用你目前的轮询方式,或者用T0的外部中断触发计数方式

本回答被提问者和网友采纳
第3个回答  2011-04-19
{while(!TF1)
TF1=0;
FB=!FB;
第4个回答  2017-12-02
你这个程序实现了哪些功能?
相似回答