×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-07 发布时间:
|

/**********************************************

方法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个下降沿。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法