20120801-51 单片机计数器T1计数外部脉冲

/**********************************************
方法1:延时法
硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1	 T1 P3.5
波特率:9600
描述:T0用于定时,方式1,定时时间50ms,中断方式;T1用于计数,10s定时时间到后,将计数的脉冲利用模拟串口发送出去
      外部的脉冲是用STM8L101产生的频率为1Hz的方波。1s 来1个下降沿
      
**********************************************/
#include "reg52.h"
#define uchar unsigned char

sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;

#define RXD P1_0
#define TXD P1_1
#define WRDYN 44 					//写延时
#define RDDYN 43 					//读延时

void Delay2cp(unsigned char i);

unsigned char num=0;

//往串口写一个字节
void WByte(uchar input)
{
	uchar i=8;
	TXD=(bit)0;						//发送启始位
	Delay2cp(39);

	//发送8位数据位
	while(i--)
	{
		TXD=(bit)(input&0x01);      //先传低位
		Delay2cp(36);
		input=input>>1;
	}

	//发送校验位(无)
	TXD=(bit)1;						//发送结束位
	Delay2cp(46);
}

//从串口读一个字节
uchar RByte(void)
{
	uchar Output=0;
	uchar i=8;
	uchar temp=RDDYN;

	//发送8位数据位
	Delay2cp(RDDYN*1.5);			//此处注意,等过起始位
	while(i--)
	{
		Output >>=1;
		if(RXD) Output   |=0x80;	//先收低位
		Delay2cp(35);				//(96-26)/2,循环共占用26个指令周
	}

	while(--temp)					//在指定的时间内搜寻结束位。
	{
		Delay2cp(1);
		if(RXD)break;				//收到结束位便退
	}

	return Output;
}

//延时程序*
void Delay2cp(unsigned char i)
{
     while(--i);					//刚好两个指令周期。
}

void TimerInit()
{
	TMOD=0x41;						//T1,计数模式,T0,定时模式,方式1
	
	TH0=0x4C;						//T0,50ms定时初值
	TL0=0x00;						//T0,50ms定时初值
	
	TH1=0x00;						//计数初值清0
	TL1=0x00;						//计数初值清0

	
	TR0=1;							//开定时器T0
	TR1=1;							//开计数器T1
	
	ET0=1;							//开定时器T0中断
	EA=1;							//开总中断
}

void main()
{
	uchar ccc;
	TimerInit();
	while(1){}
}

void timer0(void) interrupt 1
{
	TH0=0x4C;					 	//重新设置定时初值
	TL0=0x00;						//重新设置定时初值

	num++;

	if(num==200)					//数10s内数到的脉冲
	{
		WByte(TH1);
		WByte(TL1);

		num=0;						//清0
		TH1=0;
		TL1=0;
	}

	TF0=0;							//软件清中断标志位
}

 

10秒钟数到10个脉冲,1秒1个下降沿。

  • 4
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值