目次
1. デザインの背景
交通は都市経済活動のライフラインであり、都市経済の発展と人々の生活水準の向上に極めて重要な役割を果たしています。都市交通問題は、都市開発と経済発展によって悩まされてきました。都市道路の数の制限と自動車の数の継続的な増加は、都市渋滞を引き起こす主な要因です。都市の道路網の交通量は増加し続けており、道路耐荷重に対する車両の需要が依然として大きく、近い将来も変わらないことを示しています。コンピュータ制御システムが導入されて以来、制御ハードウェアがいくら進歩しても、制御ロジックには大きな進歩はありませんでした。渋滞の緩和・軽減は図られているものの、特に大規模な道路網では有効な対策が不足しているとも言えます。コンピュータのハードウェア性能と制御ソフトウェアの性能が一致していないため、多くのトラフィック制御戦略は効果を達成できません。いくつかのケースでは、いくつかの新しい制御戦略を実装できましたが、以前の制御戦略は改善されませんでした。リアルタイム制御戦略が存在しない場合、特に交通状況、特に交通流が不足している場合、現時点では成熟した交通制御方法は存在しないと言えます。
インテリジェント化と統合は将来の交通制御技術開発の方向性とフロンティアであり、交通規模の複雑な特性に基づいた制御構造とインテリジェントな意思決定に基づく渋滞処理技術は、インテリジェントな交通制御の中核でありブレークスルーです。したがって、インテリジェント統合技術に基づく都市交通信号制御システムの研究は、理論的かつ実用的な意味を持っています。インテリジェント制御技術が都市交通制御システムに導入され、都市の発展に適応できるようになります。この研究は長期的には重要な意味を持ちます。
2、機能を実現する
この設計は、AT89C51 シングルチップ マイコンと周辺ボタン、LED およびデジタル チューブ ディスプレイなどのコンポーネントの最小限のシステムを採用し、51 シングルチップ マイコンに基づいて信号機を設計します。この設計では、ツー・イン・ワンの共通陽極デジタル管を使用して、リアルタイムでカウントダウン時間を表示し、ボタンを通じて交差点の緊急信号機の状態をシミュレートできます。このシステムは強力な実用性、簡単な操作、強力な拡張機能を備えています。システムブロック図を下図に示します。
3. ハードウェア回路設計の説明
3.1 メインコントロールモジュールの回路設計
STC89 マイクロコントローラーと従来の 51 コア マイクロコントローラーの両方には、クロック ピンである 2 つの同一のピン XTAL1 と XTAL2 があります。従来の設計では、ほとんどの電子技術者は、水晶発振器と 2 つのセラミック コンデンサをこれら 2 つのピンに接続して、マイクロコントローラの動作の基本タイミングを提供する外部クロック回路を形成します。ワンチップマイコンのさまざまな動作はこの時系列の制御のもとで行われる必要があり、クロック回路はコンデンサ、水晶発振子、メインチップの3つの素子によって連携されています。マイコンには理論上独自のクロックがありますが、外部クロック回路が接続されていない場合、チップの動作が非常に不安定になります。したがって、内部スタートアップ回路が形成され、そのような回路はこの設計で必要なクロック パルスを生成できます。
3.2 デジタル管表示回路設計
ディスプレイモジュールは2桁のコモンアノードデジタルチューブを使用しており、ソフトウェア設計でさまざまなブレークコードとビットコードをプログラミングすることにより、デジタルチューブ内のLEDが点灯し、数値と表示可能なすべてのパラメータを表示できます。体重などの数値で表示することができます。この設計で使用されているコモンアノードデジタル管は合計 10 ピンを備えています。このタイプのデジタル管には 8 つのセグメント選択ピンと 2 つのビット選択ピンがあります。このタイプのデジタル管の各デジタル管は 7 個のピンで構成されています。ストリップとドット発光ダイオード ダイ、対応するセグメント選択は、a、b、c、d、e、f、g、dp と 4 ビット選択ピンです。アノード共通デジタル管の内部構造によれば、各LEDランプのアノードはセグメント選択、アノードはビット選択となっており、このタイプのデジタル管は対応するセグメントコードとビットコードをプログラム内で合理的に記述する必要があります。他のディスプレイとの組み合わせ コンポーネントに関しては、コードは比較的単純で、実際の操作は非常に実行可能です。
3.3 キーボード回路設計
この設計の I/0 ポートは十分であるため、キーボード設計はリニア キーボードを採用し、1 つのピンがボタンを介して接地され、スキャンはプログラムによって制御されます。ボタンを押すことで交差点の緊急状態を切り替えることができます。
3.4 リセット回路設計
AT89C51 のリセット入力端子 RST は、シングルチップマイコンの初期化手段を提供しており、AT89C51 のクロック回路動作後、RST 端子が High レベルである限り、プログラムを指定した場所から実行させることができます。 2 マシンサイクル以上、つまり、RST がハイレベルを維持する限りリセット動作を生成できます。AT89C51 は循環的にリセットします。RET がハイレベルからローレベルに変化した後のみ、AT89S52 は 0000H アドレスからプログラムの実行を開始します。このシステムは、ボタンリセット方式とリセットモード時のパワーオンリセット回路を採用しています。
3.5 クロック回路設計
AT89C51は発振回路を内蔵していますが、クロックを形成するには外付け部品を接続する必要があるため、実際の発振クロック回路は水晶発振子と接続してコンデンサ2個による並列共振回路を形成し、フィードバックループに接続する必要があります。ドッキング コンデンサの値は厳密な要件ではありませんが、コンデンサのサイズは発振周波数のレベル、発振器の安定性、起動の速さ、温度の安定性に影響します。 。水晶発振器の周波数は1.2MHZ~12MHZの間で選択でき、コンデンサの標準値は20pf~100pfの間で選択できます。このシステムはタイマーを使用するため、計算を容易にするために 12M の水晶発振器を使用し、コンデンサーは 30pf を選択します。
3. シミュレーションデモンストレーション
南北交通、所要時間25秒
南北の交通は東西の交通に転送され、待ち時間は5秒です
東西交通、所要時間 25 秒
ボタンを押すと緊急事態が発令され、すべての交差点が通行禁止になります
4. ソースプログラム
#include<reg51.h> //我们对51单片机编程,要引用头函数
//时间只修改下面两行就可以了
#define T_GREEN 25 //绿灯时间
#define T_YELLOW 5 //黄灯时间
sbit led_A=P0^0; //数码管位
sbit led_B=P0^1; //数码管位
//***************led指示灯引脚定义*****************//
sbit dx_R=P0^2;
sbit dx_Y=P0^3;
sbit dx_G=P0^4;
sbit nb_R=P0^7;
sbit nb_Y=P0^6;
sbit nb_G=P0^5;
bit flag=0;
sbit key_stop=P3^3;
char N=T_GREEN; //初始时间是T_GREEN
char tab_disp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极码表
/*延时子函数*/
void delay(int t ){while(t--);}
/*显示子函数*/
void display(char dat)
{
led_A=led_B=0; //先位灭显
P2=0XFF; //再段灭显
P2=tab_disp[dat/10]; //赋显示的数
if(dat/10)led_A=1;
delay(1000); //延时
P2=0XFF;led_A=led_B=0; //段灭显 位灭显
P2=tab_disp[dat%10]; //赋显示的数
led_B=1;
delay(1000); //延时
}
//这个是循环显示60遍显示的函数
void deal(char m)
{
int t=60;
while(t--)display(m); //循环显示60遍显示的函数
}
void KEY() //按键函数
{
unsigned char save; //定义保存灯状态的变量
if(key_stop==0) //按键是否按下
{
delay(20); //延时去抖
if(key_stop==0) //再次判断按键是否按下
{
flag=1; //紧急状态标志位置1,进入紧急通行状态
save=P0; //保存灯的状态
P0=0x84; //全部亮红灯
while(key_stop==0); //按键释放,当按键一直按下的时候,程序就会一直执行这里,直到按键按下
while(flag==1) //如果是紧急状态就一直执行下面的程序
{
if(key_stop==0) //在紧急状态时判断按键是否按下
{
delay(50); //延时去抖
if(key_stop==0) //再次判断按键是否按下
{
flag=0; //紧急状态标志位清零,退出紧急状态
P0=save; //LED灯恢复到之前状态
while(key_stop==0); //按键释放
}
}
}
}
}
}
/*主函数*/
void main(void)
{
char i;
EA=1; //全局中断开关
IT1=1; //外部中断下降沿有效
EX1=1;
while(1)
{
N=T_GREEN; //初始时间是T_GREEN
dx_R=1;dx_Y=0;dx_G=0; //指示灯0是亮,1是灭
nb_R=0;nb_Y=0;nb_G=1; //指示灯0是亮,1是灭
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
dx_R=1;dx_Y=0;dx_G=0; //指示灯0是亮,1是灭
nb_R=0;nb_Y=1;nb_G=0; //指示灯0是亮,1是灭
N=T_YELLOW; //时间变成T_YELLOW
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
dx_R=0;dx_Y=0;dx_G=1; //指示灯0是亮,1是灭
nb_R=1;nb_Y=0;nb_G=0; //指示灯0是亮,1是灭
N=T_GREEN; //时间变成T_GREEN
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
dx_R=0;dx_Y=1;dx_G=0; //指示灯0是亮,1是灭
nb_R=1;nb_Y=0;nb_G=0; //指示灯0是亮,1是灭
N=T_YELLOW; //时间变成T_YELLOW
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
}
}