1. 程式人生 > >【51微控制器學習筆記】基於STC89C52製作的交通訊號燈

【51微控制器學習筆記】基於STC89C52製作的交通訊號燈

一、簡介     近來學(玩)了下已經好久沒碰的51,心血來潮自己DIY了一個交通訊號燈模型。沒有什麼創新之處,就是復(dao)習(gu)復(dao)習(gu)了下51的定時器中斷、外部中斷以及最小系統電路,熟悉了下74HC595的用法和數碼管。因為好久沒碰51了導致數碼管的順序記反了難過懶得再改電路了,於是將錯就錯就按反著的順序搞下去了。由於快考試了事情也比較多,基本是隔三差五得做,時間戰線拉得比較長。。。當然這些都無關緊要了,主要還是培養下自己分檔案模組化程式設計的習慣嘛,檔案分的比較細緻,看上去舒服大笑.     因為是完全自己設計的嘛難免很多疏漏之處。當然由於這個電路比較簡單方案和其他人雷同了也是正常現象,說明英雄所見略同嘛~生氣
。在此開源大家共同學習,希望各路大神能指點迷津,歡迎大家來噴~~~~     廢話不多說了。先介紹下功能: 1)為了可拓展性,我將微控制器所有的引腳全部引出,後期可拓展或改做它用,每個IO引出兩排排針接線更舒服。 2)為了後期如果能做其他實驗不產生干擾,外圍電路基本全部採用杜邦線接線,不直接接在IO上了。其中595的VCC放置了一個跳線帽作為VCC供電。 3)本人本著儘量少地用飛線地原則,能往正面跳就先跳線,但是到了2位數碼管空間不算多了,也做的比較累了,就偷懶全用了飛線。 4)晶振用了12MHz插在了微控制器旁。採用12MHz地原因是定時器時間好計算,沒用串列埠不需要很精確地波特率。插在外面沒焊死僅僅因為板子空間不夠了,而我不像飛線。。。 5)因為東西向的燈是同步的,南北向的燈也是同步的,所以一個方向上的三色交通燈我選擇了分別並聯的方式,沒全部並聯是斟酌了下IO的驅動能力和後期的可拓展性還有一定條件下節省IO介面,故總共用了6個IO口控制交通燈,歡迎大家來噴~~~ 6)本次模擬僅為理想情況,以一分鐘為一週期紅綠交替指示。在還剩3秒時黃燈閃爍,當然也是為了簡化程式所有的黃燈一起閃。 7)通過外部中斷選擇工作/休息模式。休息模式下所有LED(包括數碼管)同步閃爍,直到將撥盤開關撥回(有延誤時間。。。)。     想到的大概就這麼多吧,詳細功能不介紹了,直接上程式碼參考。 二、原理圖
     元件清單: STC89C52RC  x1 74HC595  x1 10K排阻  x1 12Mhz晶振  x1 選擇開關  x1 獨立按鍵  x1 30pF電容  x3 10K電阻  x1 1K電阻  x1 220Ω電阻  x20 紅色LED  x3 黃色LED  x3 綠色LED  x3 2位數碼管  x1      proteus 8 模擬原理圖           三、部分源程式     程式基於Keil 5 C語言編寫,部分程式有註釋 1.檔案結構                             所有標頭檔案均放置在USER_Config.h標頭檔案中 main.c 
                  主函式 it.c                         中斷服務函式 delay.c                  延時函式 74HC595.c           595驅動函式 LED.c                   交通燈 SEG.c                   數碼管 2.標頭檔案 USER_Config.h
/******************************************

			USER HEARD		2017/6/4

*******************************************/

#ifndef _USERCONFIG_H_
#define _USERCONFIG_H_
/*    定義資料型別    */
#define uchar unsigned char
#define uint unsigned int
#define NOP() _nop_()
	
#include <reg52.h>
#include <intrins.h>
#include "interrupt.h"
#include "delay.h"
#include "74HC595.h"
#include "SEG.h"
#include "LED.h"


/*    巨集定義引腳    */
#define SEG   P0
#define LEDs  P2
	
/*    74HC595驅動    */
sbit S_CLK  =  P1^0;
sbit R_CLK  =  P1^1;
sbit MOSIO  =  P1^2;

/*    數碼管位選    */
sbit SEG1   =  P0^0;
sbit SEG2   =  P0^1;

/*    交通燈    */
sbit XR     =  P2^0;
sbit XY     =  P2^1;
sbit XG     =  P2^2;
sbit YR     =  P2^3;
sbit YY     =  P2^4;
sbit YG     =  P2^5;

/*    選擇開關    */
sbit SW			=	 P3^2;

#endif

其他標頭檔案大同小異就不貼了。 3.it.c
/******************************************

				中斷服務程式
				
				by LZK    2017/6/17
				
******************************************/
#include "USER_Config.h"

uint Num_Min = 0;//分鐘計數器
uchar Num_Sec = 0;//秒鐘計數器
uchar Number = 60;//計數器
uchar Mark = 0;//標記

void Timer_Init()
{
	TMOD = 0x11;//定時器0定時器1為工作方式1
	/*  裝載初值  */
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	TH1 = (65536-50000)/256;
	TL1 = (65536-50000)%256;
	
	EA = 1;//開總中斷
	/*  開啟定時器中斷  */
	ET0 = 1;//定時器0
	ET1 = 1;//定時器1
	/*  啟動定時器  */
	TR0 = 1;//定時器0
	TR1 = 1;//定時器1
	/*  外部中斷  */
	EX0 = 1;
	IT0 = 0;
}

void Int0_Select() interrupt 0
{
	Num_Min = 0;
	Num_Sec = 0;
	Number = 60;
	Mark = 0;
	Calculate(Number);
	LED_Relax();
}

void T0_Time() interrupt 1 
{
	/*  重灌初值  */
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	Num_Sec++;
	if(Num_Sec==20)
	{
		Num_Sec = 0;
		Number--;
		Calculate(Number);
	}
}

void T1_Time() interrupt 3
{
	
	/*  重灌初值  */
	TH1 = (65536-50000)/256;
	TL1 = (65536-50000)%256;
	Num_Min++;
	if(Num_Min==60*20)
	{
		Num_Min = 0;
		Number = 60;
		Mark = ~Mark;
	}	
}

4.delay.c
/*************************************

		延時函式庫	By LZK
		
		頻率:12MHz


*************************************/
#include "USER_Config.h"

/*    延時x*9us    */
void delay_8us(uint x)
{							
	uint i,j;
	for(i=0;i<x;i++)
		for(j=0;j<1;j++);	
}

/*    延時xms    */
void delay_ms(uint x)
{							
	uint i,j;
	for(i=0;i<x;i++)
		for(j=0;j<120;j++);
}

/*    延時顯示    */
void delay(uint x)
{
	while(x--)  Display();
}
/*************************************

		595傳送資料	By LZK
		
		頻率:12MHz
		
		2017/6/5


*************************************/
#include "USER_Config.h"

void HC595SendData(uchar SendVal)
{
	unsigned char i;

	for(i=0;i<8;i++)
	{
		MOSIO=SendVal>>7;
		SendVal<<=1;

		S_CLK=0;
		NOP();
		NOP();
		S_CLK=1;

	}

	R_CLK=0;
	NOP();
	NOP();
	R_CLK=1;

}

6.LED.c
/**********************************

		LEDs Control
		
		控制交通燈
		
		by LZK    2017/6/17
		
**********************************/
#include "USER_Config.h"

extern uchar Number;
extern uchar Mark;

void LED_Init()
{
	LEDs = 0xff;
	//SW = 0;
}

void Select()
{
	uchar sw = SW;
	switch(sw)
	{
		case 0:
			LED_Relax();
		break;
		case 1:
			LED_Control();
		break;
	}
}

void LED_Relax()
{
	uint x = 10000;
	SEG = 0xff;
	LEDs = 0xff;
	while(x--)
		HC595SendData(~0x00);
	
	x = 10000;
	SEG = 0x00;
	LEDs = 0x00;
	while(x--)
		HC595SendData(~0x00);
}
	
void LED_Control()
{
	/*  黃燈判斷  */
	if(Number <= 3)
	{
		XY=~XY;
		YY=~YY;
		delay(100);
	}
	else
	{
		XY = 1;
		YY = 1;
	}
	
	/*  路口選擇  */
	XR =  Mark;
	XG = ~Mark;
	YR = ~Mark;
	YG =  Mark;
	
	/*  顯示  */
	Display();
}

7.SEG.c
/*************************************

		數碼管顯數	By LZK
		
		頻率:12MHz
		
		2017/6/5


*************************************/
#include "USER_Config.h"

uchar code NUM[]={0x3f,0x30,0x6d,0x79,0x72,0x5b,0x5f,0x31,0x7f,0x7b,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar value[2];

void Calculate(uint num)
{
	value[0] = num%10;
	value[1] = num/10;
}

void Display()
{
	//傳送十位數
	HC595SendData(NUM[value[1]]);
	SEG = 0x01;
	delay_8us(25);
	//消隱
	HC595SendData(0x00);
	delay_8us(25);
	//傳送個位數
	HC595SendData(NUM[value[0]]);
	SEG = 0x02;
	delay_8us(25);
	//消隱
	HC595SendData(0x00);
	delay_8us(25);
}
8.main.c
/*************************************************

		交通訊號燈			by LZK
		
		Date:2017/6/4
		
		通過定時器0讀秒,通過定時器1換方向
		通過Calculate傳送數字
		
**************************************************/

#include <reg52.h>
#include "USER_Config.h"

extern uchar Number;

void main()
{
	
	Timer_Init();
	LED_Init();
	
	while(1)
	{
		LED_Control();
	}
}



四、成果展示 五、總結     第一次發部落格,如有不妥的地方請大家多指教可憐 網盤分享:

相關推薦

51微控制器學習筆記基於STC89C52製作交通訊號燈

一、簡介     近來學(玩)了下已經好久沒碰的51,心血來潮自己DIY了一個交通訊號燈模型。沒有什麼創新之處,就是復(dao)習(gu)復(dao)習(gu)了下51的定時器中斷、外部中斷以及最小系統電路,熟悉了下74HC595的用法和數碼管。因為好久沒碰51了導致數

51微控制器學習筆記0——基礎知識

一.微控制器三大資源 1.Flash—-程式儲存空間 相當於計算機的硬碟,可實現斷電後資料不丟失。 2.RAM—-資料儲存空間 相當於計算機的記憶體,用來儲存程式執行過程中產生和需

ALB學習筆記基於事件觸發方式的串行通信接口數據接收案例

except 和數 從數據 發送數據 exceptio 工作原理 實時 double 窗體 基於事件觸發方式的串行通信接口數據接收案例 廣東職業技術學院 歐浩源 1、案例背景 之前寫過一篇《基於多線程方式的串行通信接口數據接收案例》的博文,討論了采用輪詢方

ALB學習筆記基於.NET環境的高頻RFID卡讀寫設備的基本操作案例

範例 write load rgs 顯示 職業 ner num cte 基於.NET環境的高頻RFID卡讀寫設備的基本操作案例 廣東職業技術學院 歐浩源 1、引言 RFID高頻卡在我們的日常生活中隨處可見,是物聯網應用中不可或缺的一個重要部分,也是全國職業

機器學習筆記基於k-近鄰演算法的數字識別

更多詳細內容參考《機器學習實戰》 k-近鄰演算法簡介 簡單的說,k-近鄰演算法採用測量不同特徵值之間的距離方法進行分類。它的工作原理是:存在一個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每個資料與所屬分類的對應關係。輸入沒

DSP學習筆記基於CCS5.5的FIR濾波器設計

一、概述        本文是基於TMS320C5510晶片設計的FIR濾波器。介紹利用matlab和CCS5.5設計FIR濾波器的過程和模擬結果。輸入訊號包含100Hz和200Hz兩個成分,通過matlab生成一個FIR低通濾波器的各階係數,利用CCS完成訊號處理並且展示模

Spark深入學習 -10基於spark構建企業級流處理系統

變現 大內存 空間換時間 detail python 訪問量 新版本 kafak 計算框架 ----本節內容------- 1.流式處理系統背景 1.1 技術背景 1.2 Spark技術很火 2.流式處理技術介紹 2.1流式處理技術概念 2.

SQL Server學習筆記事務、鎖定、阻塞、死鎖

body sqlserve distrib reset reads cli ast function pre http://blog.csdn.net/sqlserverdiscovery/article/details/7712068 Column nameData

安全牛學習筆記XSS的簡述

cookie 服務器 漏洞 安全 xss 1.Cross Site SCripting 攻擊者往Web頁面裏插入惡意Script代碼,當用戶瀏覽該頁時,嵌入其中Web裏面的Script代碼會被執行,從而達到惡意攻擊用戶的目的。

安全牛學習筆記XSS的利用

xss 惡意代碼 漏洞 反射型XSS1.概念 通過社會工程學等手段誘騙用戶點擊某個精心構造的鏈接,該鏈接會將惡意的js代碼提交給 有漏洞的服務器網站,並由服務器返回給受害者的客戶端執行。 2.POC -<scri

安全牛學習筆記Web掃描器(1)

安全 web 漏洞 1.偵察httrack可將目標網站的網頁全部爬取下來,減少偵察過程中與目標服務器發生的交互。 2.Nikto(1).檢測對象 掃描軟件版本 搜索存在安全隱患的文件 配置漏洞

安全牛學習筆記OSI網絡模型

http ssh stmp 安全 OSI網絡模型 物理層規定比特在物理介質中的傳輸方式,解決物理傳輸過程中的問題。 代表設備:中繼器,集線器(多端口中繼器) 數據鏈路層 在不可靠的網絡環境中進行可靠的數據傳輸。解決數據傳輸中可能出現的

安全牛學習筆記搜索引擎

安全、web、滲透、信息安全 搜索引擎 shodan爬取banner信息。搜索聯網設備。 常用關鍵字: netcity country CNport oshostname實例:cisco 200 ok 思科設備default password 默認密碼

安全牛學習筆記服務掃描

安全、web、滲透、信息安全 1.簡述 識別開放端口上的應用 識別目標操作系統 提高攻擊效率 2.分類 Banner信息獲取 服務識別 操作系統識別snmp分析 防火墻識別 3.Banner (1).含義

知了堂學習筆記Eclipse,Myeclipse連接MySQL數據庫和Oracle數據庫

let ets 最好 lec 代碼 htm ner pro 密碼 一.連接MySQL數據庫   1.由於Eclipse,Myeclipse都沒有連接MySQL數據的架包,我們需要自行下載MySQL連接架包 mysql-connector(官方鏈接:http://dev.my

安全牛學習筆記Kali Linux 安裝-持久加密USB安裝、熟悉環境、熟悉BASH命令

security+ linux 信息安全 持久加密USB安裝-1LUKS: linux UNified Key Setup 磁盤分區加密規範 不依賴於操作系統的磁盤級加密 Windows——DoxBox 後端:dm-crypt 前端:cryptsetup 微軟的bitlocker將鏡像

安全牛學習筆記網絡配置、更新升級、安裝軟件包、瀏覽器插件

信息安全;網絡配置[email protected]:~# dhclient eth0 //用來通過 dhcp 協議配置本機的網絡接口[email protected]:~# ifconfig 查看現在的ip地址[email protected]:~# ifc

安全牛學習筆記 Kali Linux安裝-熟悉環境

信息安全;security+;kali linux熟悉BASH命令 Ls、cd、pwd、cat、more、tail、cp、rm、top、ps、greg、ifconfig、netstat、awk、sort、route、mount、dmesg、find、whereis、Echo、vi 管道 shell腳本[

安全牛學習筆記基本工具-NETCAT(telnet/banner、傳輸文本信息)

信息安全;security+;kali linux滲透測試常用工具經常使用且功能強大安全從業者必不可少的幫手Nc / ncatWireshackTcpdumpNETCAT-----NC網絡工具中的瑞士軍刀——小身材、大智慧偵聽模式/傳輸模式telnet/獲取banner信息傳輸文本信息傳輸文件目錄加密傳輸文件

安全牛學習筆記實驗環境

信息安全;security+;kali linux滲透測試準備實驗環境 滲透非授權系統的弊端 搭建自己的實驗環境安裝虛擬機微軟最新版軟件 http://msdn .microsoft.com/en-ca/subscriptions/aa336858windows虛擬機 http://dev.mod