1.実験の目的
- タイマー/カウンターの4つの動作モードのアプリケーションをさらにマスターする
- クエリ制御のタイマー/カウンタープログラミングをマスターする
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;
}