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

p1.1为高电平时T0开始计数,p1.2为高电平时T0停止计数。记录这段时间内T0所计的次数counter。程序如下,请高手指正。谢谢#include<reg51.h>#... 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; //记录计数的次数
}
}
}
展开
 我来答
lvshanxiang
2011-04-19 · 贡献了超过114个回答
知道答主
回答量:114
采纳率:0%
帮助的人:144万
展开全部
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; //记录计数的次数
}
}
}
chenge12190
2011-04-19 · 超过29用户采纳过TA的回答
知道答主
回答量:100
采纳率:100%
帮助的人:42.6万
展开全部
你怎么不在中断里计数呢?
#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];
}
}
追问
这个程序是实现什么的?
追答
类似于频率计,对外部频率进行计数,然后用数码管显示频率的值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zero_fn
2011-04-19 · TA获得超过2258个赞
知道小有建树答主
回答量:1173
采纳率:80%
帮助的人:446万
展开全部
{while(!TF1)
TF1=0;
FB=!FB;
把这个放中断里去处理吧
追问
这块怎么放入中断中呢?中断不大会用。
追答
void _timer1()  interrupt  3
{
TR1 = 0;
TH1=0Xf0; // 设定T1的定时时间
TL1=0X0c;
FB=!FB;
TR1=1;
}
方波部分就中断自行处理。
T0计数你可以用你目前的轮询方式,或者用T0的外部中断触发计数方式
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冰叶AXA
2011-04-19
知道答主
回答量:9
采纳率:0%
帮助的人:0
展开全部
{while(!TF1)
TF1=0;
FB=!FB;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
懂事电子设计
2017-12-02 · TA获得超过1940个赞
知道小有建树答主
回答量:3020
采纳率:80%
帮助的人:305万
展开全部
你这个程序实现了哪些功能?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式