|
首先說一下背景吧 :
最近在幫別人做一些小東西,是用51做的,主要給他們提供單片機(jī)課設(shè)的思路。 且由于時(shí)間問題,我也沒有將程序進(jìn)行優(yōu)化,只是拿來分享一下,大家可以參考。 有思路之后可以稍微花點(diǎn)時(shí)間去優(yōu)化一下代碼,是代碼更簡(jiǎn)潔。
馬丁·福勒 的一句名言與君共勉:
任何一個(gè)傻瓜都會(huì)寫能夠讓機(jī)器理解的代碼,只有好的程序員才能寫出人類可以理解的代碼。—Martin Fowler
ok, 廢話不多說,下面是設(shè)計(jì)要求及制作過程,proteus仿真以及代碼流程的介紹
1) 題目及設(shè)計(jì)要求
題目:交通燈控制器
要求:
1、紅燈和綠燈相互轉(zhuǎn)換時(shí)經(jīng)過黃燈,黃燈閃爍三次(6秒);
2、主干道方向通行30秒,輔干道方向通行20秒,單獨(dú)左轉(zhuǎn)信號(hào)15秒;先直行信號(hào),后左轉(zhuǎn)信號(hào)。
3、設(shè)手動(dòng)、自動(dòng)、特殊情況三種方式。
4、特殊情況時(shí)所有路口紅燈都亮,給120、110等通行。
5、自動(dòng)時(shí)顯示各種狀態(tài)倒計(jì)時(shí)。
2) C51編程以及電路仿真軟件
編程
51單片機(jī)的C語言編程一般都是keil3或者keil4,我一直以來用的keil3,這次使用的keil4,其實(shí)都一樣的。
(注:關(guān)于keil3/4/5的資料和安裝教程,在我的另一篇博客講過了,可以參考一下 點(diǎn)擊藍(lán)字-->>
keil軟件圖標(biāo).jpg (75.97 KB, 下載次數(shù): 124)
下載附件
2019-7-3 15:43 上傳
keil4打開的界面如下:
keil軟件打開演示.jpg (2.38 MB, 下載次數(shù): 116)
下載附件
2019-7-3 15:43 上傳
( PS:: 不過這次做這些東西的過程中,keil4經(jīng)常自己卡死,害得我只能任務(wù)管理器關(guān)閉它,超級(jí)煩,不知道什么原因,有了解的可以評(píng)論一下告訴我,感激不盡 .............但是老版本的keil3卻很穩(wěn)定)
仿真:
proteus仿真軟件
我用的7版本的
proteus圖標(biāo).jpg (25.19 KB, 下載次數(shù): 117)
下載附件
2019-7-3 15:44 上傳
proteus打開界面如下:
proteus軟件界面.jpg (3.51 MB, 下載次數(shù): 129)
下載附件
2019-7-3 15:45 上傳
這個(gè)界面里面的電路圖與這個(gè)交通燈無關(guān),是我以前做的一個(gè),只是給大家演示
3)解決思路
硬件部分:
交通燈顯示部分分為6個(gè)部分
- [ 1] 首先:主干道通行30秒 其中單獨(dú)左轉(zhuǎn)15秒 黃燈6秒
1)主干道--------綠燈 輔干道--------紅燈 0-15s // 單獨(dú)直行
2)主干道--------藍(lán)燈 輔干道--------紅燈 15-24s // 單獨(dú)左轉(zhuǎn)
3)主干道--------黃燈 輔干道--------紅燈 24-30s // 黃燈減速
---------------------------------------------------------------------------------------------------------------------------------------
- [ 2] 輔干道通行20秒 單獨(dú)左轉(zhuǎn)15秒 黃燈6秒
4)主干道--------紅燈 輔干道--------綠燈 0-5s
5)主干道--------紅燈 輔干道--------藍(lán)燈 5-14s
6)主干道--------紅燈 輔干道--------黃燈 14-20s
模擬交通的燈的幾個(gè)led燈的顯示在程序中就是按照上面的流程顯示的,由 1)--->2)--->.....--->6)--->1)->..... 一直循環(huán)
仿真電路圖各個(gè)部分展示:
(1)單片機(jī) & 復(fù)位電路 & 晶振
單片機(jī)及復(fù)位電路.jpg (1.47 MB, 下載次數(shù): 120)
下載附件
2019-7-3 15:49 上傳
(2)交通燈部分
交通燈部分仿真圖.jpg (2.3 MB, 下載次數(shù): 130)
下載附件
2019-7-3 15:49 上傳
上圖標(biāo)注了每個(gè)燈對(duì)應(yīng)的引腳 以及每個(gè)燈的顏色
分別在上面和右面放置了一排 用來表示道路的方向
D1-D4指示的是主干道 D5-D8指示的是輔干道
(3)數(shù)碼管顯示部分
這部分是和交通燈部分一起的 為了方便看到我寫的標(biāo)注,我把交通燈抹去了,抹去的部分就是上面交通燈的部分
數(shù)碼管顯示部分.jpg (2.92 MB, 下載次數(shù): 119)
下載附件
2019-7-3 15:50 上傳
數(shù)碼管驅(qū)動(dòng).jpg (583.93 KB, 下載次數(shù): 112)
下載附件
2019-7-3 15:50 上傳
(該芯片使用方法這里不多說,網(wǎng)上很多資料。。。本質(zhì)就是一個(gè)鎖存器)
軟件部分
首先代碼流程圖如下,對(duì)這個(gè)畫圖軟件不是很熟,畫的很垃圾,不過大致能體現(xiàn)出來
程序流程圖.jpg (1.13 MB, 下載次數(shù): 113)
下載附件
2019-7-3 15:51 上傳
4)部分代碼展示及解釋
# include <reg52.h>
# define uchar unsigned char
# define uint unsigned int
sbit wela = P2^7; // 數(shù)碼管位選
sbit dula = P2^6; // 數(shù)碼管段選
- // 按鍵位定義
- sbit key_auto = P3^0; // 自動(dòng)
- sbit key_step = P3^1; // 手動(dòng)
- sbit key_emerg = P3^2; // 緊急情況 110/120通過
復(fù)制代碼- // 四位八段共陰極數(shù)碼管數(shù)字顯示編碼
- uchar code table[]={
- //"0" "1" "2" "3"
- 0x3f,0x06,0x5b,0x4f,
- //"4" "5" "6" "7"
- 0x66,0x6d,0x7d,0x07,
- //"8" "9" "A" "B"
- 0x7f,0x6f,0x77,0x7c,
- //"C" "D" "E" "F"
- 0x39,0x5e,0x79,0x71
- };
復(fù)制代碼- // 交通燈編碼 自動(dòng)模式時(shí),交通燈亮燈順序 我編成了一個(gè)數(shù)組,方便使用
- uchar code light[]={
- // 主G輔R 主G輔R 主Y輔R
- 0xdb, 0xde, 0xd7,
- // 主R輔G 主R輔B 主R輔R
- 0xbd, 0xed, 0x7d,
- };
復(fù)制代碼- // 定時(shí)器0中斷服務(wù)函數(shù) 用于計(jì)算時(shí)間過了幾秒
- void timer0() interrupt 1
- {
- TH0=0x4c; // 定時(shí)器裝初值 50ms(11.05926MHz TH0=0x4c TL0=0x00)
- TL0=0x00; // (12MHz 的初值是 TH0=0x3c TL0=0xb0)
- cnt++;
- if(cnt == 20)
- {
- cnt = 0;
- sec++; // 記錄1秒
- }
- }
復(fù)制代碼- // 按鍵掃描函數(shù)
- void key_scan()
- {
- //判斷那個(gè)按鍵盤下
-
- /********************** 自動(dòng)模式 *********************/
- ///如果是自動(dòng)模式,就讓交通燈正常運(yùn)行 并顯示倒計(jì)時(shí)
- // Display_C_time(15-sec); // 主干道倒計(jì)時(shí)顯示
- // Display_R_time(30-sec); // 輔干道倒計(jì)時(shí)顯示
- // P1 = light[0]; // 交通燈編碼顯示
- // 具體代碼省略、、、、、、、、、、
-
- /********************** 手動(dòng)模式 *********************/
- //手動(dòng)模式就讓交通等步進(jìn)變換
- if(key_step == 0)
- {
- delay_ms(5);
- if(key_step == 0)
- {
- if(light_num == 6)
- {
- light_num = 0;
- }
- P1 = light[light_num];
- light_num++;
- while(!key_step); // 松手檢測(cè)
- }
- }
-
- /********************** 緊急模式 *********************/
- // 緊急模式 用于120/110緊急通行
- // 讓主干道和輔干道都是紅燈即可
- // 具體代碼省略、、、、、、、、、、、
-
- }
復(fù)制代碼 // 最后在主函數(shù)里面初始化,然后循環(huán)掃描按鍵
- void main()
- {
- system_Init(); // 系統(tǒng)初始化 里面是對(duì)定時(shí)器中斷以及數(shù)碼管進(jìn)行初始化
- while(1)
- {
- key_scan();
- }
- }
復(fù)制代碼
5)整體效果演示
仿真展示.gif (245.25 KB, 下載次數(shù): 133)
下載附件
2019-7-3 15:54 上傳
因?yàn)檫@個(gè)是幫別人設(shè)計(jì)的,所以完整源碼和仿真工程文件不貼出。 如果需要完整的仿真以及源碼,請(qǐng)私聊我或者評(píng)論留下聯(lián)系方式
今天所有的懶惰都會(huì)換來明天的卑微 加油吧。!
|
評(píng)分
-
查看全部評(píng)分
|