1. 程式人生 > >20120801-51 微控制器計數器T1計數外部脈衝

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個下降沿。