「シングルチップマイクロコンピュータ」実験-実験4MCS-51内部タイマー/カウンター実験(2)

「シングルチップマイクロコンピューター」実験-実験4MCS-51内部タイマー/カウンター実験(2)

1.実験の目的

  1. タイマー/カウンターの4つの動作モードのアプリケーションをさらにマスターする
  2. クエリ制御のタイマー/カウンタープログラミングをマスターする

2、知識のポイント

(1)8051には2つのタイマー/カウンターT0とT1があり、どちらもシステム内のマシンサイクル(タイミングモード)とチップ外のパルス信号(カウントモード)をカウントできます。4つの動作モードがあります。異なるポイントは、カウント値の幅が異なる(13ビット/ 16ビット/ 8ビット)ことと、カウントの初期値を自動的にリロードできるかどうかです。
(2)タイマ/カウンタに関連する制御ワードと制御ビットには、主にTMOD、TH0 / TH1、TL0 / TL1、TCONが含まれます。

3.実験内容

(1)パラレルポートP1を通る交差点の信号機のアナログ制御を実現します。
街路灯の規制については、南北方向と東西方向に分かれた交差点があり、初期状態はすべて赤信号です。その後、南北緑灯が点灯し、東西赤が点灯します。ライトが点灯し、南北方向が通行可能です。しばらくすると南北の緑色のライトが消え、南北の黄色のライトが点滅し始めます。数回点滅した後、南北の赤色のライトが点灯し、東西の緑色のライトが点灯します。しばらくすると、東西の緑色のライトが消え、東西の黄色のライトが点滅し始めます。数回点滅した後、南北方向に切り替わります。 、次に上記のプロセスを繰り返します。
プログラミングのヒント:(トラフィックの変化に応じて6つのライトのオン、オフ、またはちらつき
を実現するには)タイマーを介して正確なタイミングを実現するには、より短いタイミングを使用して黄色のライトの点滅を制御します(0.5秒や1秒など)。トラフィックを制御するためのより長いタイミング(5秒または10秒など)。

#include<reg51.h>
char t;
char i;
void main(){
    
    
	TMOD=0x01;
	TH0=0x3c;
	TL0=0xB0;
	
while(1){
    
    
	P1=0x7e;
	while(1){
    
    
		TR0=1;
		while(TF0){
    
    
			TF0=0;
			t++;
			TH0=0x3c;
			TL0=0xB0;
		}	
		if(t==100){
    
    
			TR0=0;
			t=0;
			break;
		}
	}

	P1=0xbe;
	while(1){
    
    
		TR0=1;
		while(TF0){
    
    
			TF0=0;
			t++;
			TH0=0x3c;
			TL0=0xB0;
		}	
		if(t%10==0){
    
    
			P1=0xfe;
		}
		if(t%20==10){
    
    
			P1=0xbe;
		}
		if(t==70){
    
    
			TR0=0;
			t=0;
			break;
		}
	}
	P1=0xdb;
		while(1){
    
    
		TR0=1;
		while(TF0){
    
    
			TF0=0;
			t++;
			TH0=0x3c;
			TL0=0xB0;
		}	
		if(t==100){
    
    
			TR0=0;
			t=0;
			break;
		}
	}
}
}

(2)(オプションの質問)8051タイマー/カウンターを使用して4つのLEDを周期的に点滅するように制御します。点灯時間は1Sである必要があります。方法3のTH0とTL0は、共同実施を実現するために使用されます。TH0はタイミングに使用されます。 TL0はTH0のオーバーフローに使用されます。回数。

#include<reg51.h>
char t;
char i=0;
char num=0;
char a=0;
char led[]={
    
    0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(){
    
    
		
		TMOD=0x07;
		TH0=0x06;
	  TL0=0x38;
		TR1=1;
    TR0=1;
		EA=1;
		ET0=1;
		while(1){
    
    
				while(TF1==0);
				TF1=0;
				P3=0;
				P3=0x10;
				TH0=0x06;
		}
}
timer() interrupt 1{
    
    
	TF0=0;
	num++;
	a=i%8;
	if(num%20==0){
    
    
		P1=led[a];
		i++;
	}
	TL0=0x38;
}

おすすめ

転載: blog.csdn.net/weixin_44652589/article/details/114766362