⑴ 設計個單片機定時裝置,開機顯示20秒,按動秒後以0.1秒時間間隔倒計時計數,顯示xx.x
#include<reg52.h> //包含單片機頭文件
#include<mcu56.h> //包含56板子頭文件
//#include<stdlib.h> //包含隨機函數頭文件
unsigned char x; //定義全局變數
unsigned int dat,i;
main() //主函數
{
TMOD = 1; //T0定時器,方式1
TH0 = 0x3c; //定時50ms
TL0 = 0xb0; //T0定時器初值
x = 2; //2*0.05s=0.1秒
EA = 1; //開中斷
ET0 = 1; //開T0中斷
TR0 = 1; //啟動T0
while (1)
{
display56(dat); //56板顯示倒計時
//顯示程序根據電路板寫
}
}
void t0_int()interrupt 1 //定時器T0中斷函數
{
TH0 = 0x3c; //恢復初值
TL0 = 0xb0;
x--;
if(x==0)
{
x = 2; //中斷2次為0.1秒
}
}
⑵ 求學電氣高人解答一個課程設計,絕對給高分!題目:十字路口帶倒計時顯示的交通信號燈控制
這個就是用PLC來設計實現,實際電路我們接過功能實現過 設計有點難,在其他網站上求一個設計是要花錢的
⑶ 30秒倒計時器課程設計
【摘 要】籃球比賽30秒鍾規則規定:進攻球隊在場上控球時必須在30秒鍾內投籃出手(NBA比賽為24秒,全美大學體育聯合會比賽中為35秒),因此在比賽時裁判既要看比賽又要看秒錶計時,而本文介紹的30秒倒計時器可以解決此問題。
【關鍵詞】AT89C51單片機、30秒倒計時器、LED
30秒倒計時器的設計和製作有很多方法,本文介紹的30秒倒計時器以AT89C51單片機作為控制單元,採用兩個數碼管顯示時間,用三個按鍵分別控制計時器的計時開始、復位和暫停。倒計時器初始狀態顯示「30」,當裁判員按下計時鍵,30秒倒計時開始,當計時器時間減到0時,計時器發出聲光報警,提示裁判計時時間已到。
一、電路設計
30秒倒計時器的電路主要由電源電路、單片機最小系統、按鍵輸入、顯示驅動電路、報警電路組成,30秒倒計時器控制電路如圖1所示。
圖1 30秒倒計時器電路原理圖
1、按鍵輸入
「30秒倒計時器」採用了三個按鍵來完成計數器的啟動計數、復位、暫停/繼續計數等功能。
(1)K1鍵:啟動按鈕(P3.2)。
按下K1鍵,計數器倒計時開始,數碼管顯示數字從30開始每秒遞減計數,當遞減到到零時,報警電路發出聲、光報警信號。當計數器處於暫停狀態時按下K1鍵將回到計時狀態。
(2)K2鍵:復位按鈕(P3.3)。
按下K2鍵,不管計數器工作於什麼狀態,計數器立即復位到預置值 「30」 ,在報警狀態時按下K2鍵還可取消報警。
(3)K3鍵:暫停/計時切換按鈕(P3.4)。
當計數器處於計時狀態時按下該鍵計數器暫停計時,數碼管顯示數字保持不變;當計數器處於暫停狀態按下該鍵計數器將回到計時狀態;初始狀態時該鍵無效。
2、顯示驅動電路
「30秒倒計時器」用兩個共陽數碼管來顯示時間,數碼管顯示方式為動態顯示。顯示驅動電路中,數碼管的段碼引腳通過470歐的電阻接到單片機的P1口,兩個片選引腳各通過一個9012連接到正5V電源,由P3.0和P3.1控制。
4、報警電路
計時時間減到0,顯示數碼管顯示「00」時,發光二極體D1由P3.5控制發出光報警,同時蜂鳴器由P3.7控制發出聲報警。
二、軟體編程思路
1、全局變數
「30秒倒計時器」動作流程主要受三個全局變數控制。首先是bit變數「act」,當「act」為「1」時倒計時開始,為「0」時倒計時停止,「act」初值為「0」,可以由按鈕操作將其置「1」或清「0」。第二個全局變數是char變數「time」,存放倒計時的時間,當倒計時時間為0時,發出聲光報警。變數「time」的初值為30,定時中斷服務程序在「act」為1時,每1s對其進行減1操作,減到0時保持為0,按下「復位鍵」可將「time」復位為30。第三個全局變數是int變數「t」,記錄響應定時中斷0的次數。根據初始化定義,定時器0以方式1工作,每1ms發出一次中斷請求。控製程序只開放了定時器0中斷,因此不會有比定時器0中斷更高級的中斷被允許,所以每次請求都會立刻被響應。響應後在中斷服務程序中將全局變數「t」加1記錄響應中斷次數,每響應1000次即為1秒鍾。變數「t」初值為0,在中斷服務程序中加1,當「t」為2000時由中斷服務程序清0。在按鍵驅動程序中,按下啟動鍵、復位鍵、暫停/啟動鍵時將「t」清0,目的是從0ms開始計時。
2、控制流程
主程序主要用來檢測全局變數「time」當「time」為0時發出「聲光報警」。按鍵驅動、顯示驅動和「time」操作都在定時器0中斷服務程序中進行。其控制流程如圖2所示。
圖2 控制流程圖
三、軟體程序設計
1、數碼管驅動程序
到計時器的兩個數碼管以動態顯示的方式顯示計時時間「time」(全局變數),LED1顯示「time」的十位,LED2顯示「time」的個位。
(1)定義段碼數據口和片選信號
根據實際電路,在C51中定義段碼的數據口為P1,兩個片選信號為P3.0和P3.1。定義如下:
#define an P1
sbit wei1=P3^0;
sbit wei2=P3^1;
(2)定義字形碼
LED顯示數字0~9以及全滅的字形碼表格放在數組zixing[]中。字形碼是固定的表格,定義時加上關鍵字「code」 表示該表格存放在程序存儲器中。
unsigned char code zixing[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
};
(3)定義數碼管LED1和LED2的顯示變數
為了增加驅動程序的可移植性,筆者為數碼管LED1和LED2定義了顯示變數。顯示變數就是本驅動程序的對外介面,外部程序只要改變顯示變數的值就可改變數碼管顯示的數值。定義方式如下:
unsigned char led_str[2]={10,10};
led_str[0]直接對應數碼管LED1, led_str[1]直接對應數碼管LED2。本項目中由專門的子程序將全局變數time計算拆分成led_str[0]和led_str[1]。
void js()
{
led_str[1]=time/10%10;
led_str[0]=time%10;
}
(4)數碼管驅動程序
數碼管驅動程序「void chushi(char i)」在定時中斷服務程序中被調用執行。根據初始化程序的定義,定時中斷服務程序每1ms被執行一次。定時中斷服務程序中運用全局變數「t」記錄進入該服務程序的次數,「t」計滿2000由定時中斷服務程序清零。
數碼管驅動程序的參數「char i」是用來確定當前點亮的是LED1還是LED2,當參數為「0」時點亮LED1,參數為「1」時點亮LED2。如果我們希望偶數次進入定時中斷服務程序時點亮LED1,奇數次進入定時中斷服務程序時點亮LED2,我們可以用程序調用語句「chushi(t%2);」輕松實現。
進入數碼管驅動程序後首先調用子函數js(),計算當前的led_str[0]和led_str[1]。接下來將兩個數碼管全部熄滅以防止余暉的出現。最後點亮需要點亮的數碼管並送出字型碼。驅動程序代碼如下:
void chushi(char i)
{
js(); //計算顯示變數
an=0xff; //去余暉
wei1=i; wei2=!i; //確定片選
an=zixing[led_str[i]]; //送字型碼
}
2、按鍵驅動程序
按鍵驅動程序分為按鍵識別和按鍵功能執行兩部分。按鍵功能執行可在按鍵按下時或按鍵抬起後執行,文中將其設計在按鍵抬起後執行。
(1)定義按鍵I/O地址
根據實際電路,三個按鍵(啟動鍵、復位鍵、暫停/啟動鍵)分別接在P3口的P3.2,P3.3和P3.4三個引腳上。為了取鍵值方便還將P3口定義為「iokey」,程序中可作定義如下:
#define iokey P3
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
(2)按鍵驅動流程
按鍵識別的通用流程為:I/O口寫「1」→判斷有無鍵按下→延時去抖→確定鍵值→等待按鍵抬起→執行按鍵功能。按鍵驅動程序中定義了兩個靜態變數「ts」 和「kv」,分別用來延時去抖和存放鍵值。
(3)延時去抖
靜態變數「ts」用來延時去抖。按鍵驅動程序在定時中斷服務程序中每1ms被執行一遍,每檢測到有鍵按下「ts」加1,檢測到無鍵按下「ts」清0。按鍵連續按下20ms,則連續20次執行按鍵驅動程序時都檢測到有鍵按下,此時靜態變數「ts」累加到20,可確認按鍵按下有效。
為防止按鍵一直按著不放而使「ts」累加到溢出,確認有鍵按下後可使「ts」的值保持為20,或大於20的某一個值如21。
(4)取鍵值
確認有鍵按下後即可通過讀取按鍵的I/O口狀態來得到鍵值。為讀取P3.2、P3.3和P3.4引腳狀態,屏蔽P3口其他引腳的影響,可將讀取後的數值按位或上11100011B(0xE3)再送給靜態變數「kv」。
靜態變數「kv」存放按鍵的鍵值,無鍵按下或按鍵抬起後kv的值為0。按下啟動鍵key1時kv=11111011B(0xFB),按下復位鍵key2時kv=11110111B(0xF7),按下暫停/啟動鍵key3時kv=11101111B(0xEF)。
(5)執行按鍵功能
按鍵抬起後第一次執行按鍵驅動程序時,靜態變數「kv」任保持著按鍵按下時最後得到的鍵值,以該鍵值作為參數調用按鍵執行程序「actkey(kv);」即可執行按鍵功能。調用後kv值立刻清0,確保按一次鍵執行一次按鍵功能。驅動程序代碼如下:
void key()
{
static unsigned char kv=0;
static unsigned char ts=0;
key1=1;key2=1;key3=1;
if(!(key1&key2&key3))
{
ts++;
if(ts>=20)ts=20; //有鍵按下
if(ts==20)
kv=iokey|0xe3; //取鍵值
}
else
{ //無鍵按下或按鍵已抬起
actkey(kv);
ts=0;
kv=0;
}
}
函數actkey(kv)用來根據鍵值「kv」執行相應操作。當「kv」等於0xFB時代表啟動鍵key1按下,函數actkey(kv)將全局變數act賦值為「1」。當「kv」等於0xF7時代表復位鍵key2按下,函數actkey(kv)將全局變數「time」復位為「30」。當「kv」等於0xEF時代表暫停/啟動鍵按下,函數actkey(kv)將全局變數act取反。每按一個按鈕都有將全局變數「t」清0的操作,目的是每當復位、或啟動計時時,進入定時中斷的次數都從0開始計算,否則會出現第1秒計時不準確的現象。程序代碼如下:
void actkey(unsigned char k)
{
switch(k)
{
case 0xfb:act=1;t=0;break;
case 0xf7:time=30;t=0; break;
case 0xef:act=~act;t=0; break;
}
}
四、結束語
本文在編程過程中以面向對象的編程思路封裝了兩個LED數碼管和三個獨立按鍵。當其驅動程序在定時中斷服務程序中被調用,編程者只要操作其介面:數組「led_str[2]」和函數「actkey(unsigned char k)」,無需直接對硬體進行編程即可改變功能,增強了軟體的通用性和可移植性。
⑷ 那位仁兄幫忙設計一個單片機控制交通燈的實驗啊:要求有時間倒計時顯示的
這是單片機很基礎的一個實驗,建議自己研究,其中的收回對你將來會很有用的。即使你將來要干電子類銷售,這個也很可能會有用的。
⑸ 要設計一個方便預置的倒計時數顯定時器,不知道怎麼下手,望指點
兩片74LS192應該可以實現吧,用減法功能。開始鍵就用時鍾秒脈沖的開關,當計時結束,輸出全為0時,蜂鳴器報警;預置就用置數法;用8段管顯示時間即可;
⑹ flash倒計時器製作
具體步驟如下:
1.啟動Flash,新建元件,命名為「倒計時」,行為中選擇「影片剪輯」,確定後進入元件編輯窗口。
2.點擊文本工具,在屬性中選擇「靜態文本」,劃出一個文本框,設置好文本框的參數,輸入內容「現在離2008北京奧運開幕還有」。
3.點擊文本工具,在屬性中選擇「動態文本」,劃出一個文本框,設置好文本框的參數,變數設置為「DaoJiShiText」。
4.命名所在層為「倒計時」,在時間軸的第一幀上輸入以下代碼:
EndTime=new
Date(2008,7,8,20,0,0);
//定義倒計時結束時間,此處為2008北京奧運開幕日
//注意,月份參數用0-11表示1-12月
NowTime=new
Date();
//定義當前時間
zong=Math.floor((EndTime.getTime()-NowTime.getTime())/1000);
//取得當前時間與結束時間相差的總秒數
if(zong>0)
{
tian=Math.floor(zong/(60*60*24));
//取得剩餘天數
zong=zong-tian*60*60*24;
shi=Math.floor(zong/(60*60));
//取得剩餘小時數
zong=zong-shi*60*60;
fen=Math.floor(zong/60);
//取得剩餘分鍾數
zong=zong-fen*60;
miao=zong;
//取得剩餘秒數
DaoJiShiText=String(tian)+"天"+String(shi)+"時"+String(fen)+"分"+String(miao)+"秒";
}
5.在時間軸的第12幀處插入關鍵幀,輸入語句「gotoAndPlay(1);」。
6.返回主場景,把倒計時影片剪輯拖放至主場景中,測試運行,效果如圖所示。
說明:以上代碼以北京2008奧運會開幕為倒計時結束時間,首先計算出當前時間與結束時間相隔的總秒數,再分別轉換成對應的天數、小時數、分鍾數和秒數。由於Flash默認的幀頻是12,代碼中在第12幀處使用了「gotoAndPlay(1);」語句,用於安排倒計時代碼每隔一秒運行一次,使得所顯示的倒計時信息每隔一秒刷新一次。
⑺ 紅綠燈倒計時模擬實驗中的定時計數器如何工作
從代碼看,數碼管是共陽極的,即七段碼數據(P0口數據)低電平有效(即低電平的位對應的筆劃會亮),同時 P2.0、P2.1作為兩個數碼管的選擇位,高電平有效(即由此給數碼管加入電源)。那麼 P2.0高電平時,左邊數碼管會亮,P2.1高電平時,右邊數碼管會亮;

另外,採用延時程序進行延時是不精確的,應該通過定時器來獲得延時;
在自己未能充分理解的情況下,不要亂抄人家的代碼。
至於定時器怎麼工作,簡單如下:
void Timer0_init() // 系統晶振為 12MHz 時,定時器的計數脈沖周期即為 1uS;
{ TMOD |=0x01; //方式1,T0 16位定時
TH0 = (65536-1000)/256; // 計數器初值為 1000,即為 1mS
TL0 = (65536-1000)%256; // 結果就是 TH0=0xfc,TL0=0x18
EA=1; ET0=1; TR0=1;
}
如果你能採納的話,可以給你正確的代碼;
⑻ 單片機設計製作9S倒計時器~
1.顯示。2.啟動/停止。3.重置30秒
中的第一個和第三個功能有的,至於第2個,程序里是一直倒計時,結束了
就再重置30,繼續倒計時。
如果你需要鍵盤按鍵的話,只需要按鍵將中斷關了或者開了,就可以。
#include <reg52.h>
code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共陽數碼管 0-9
unsigned char Dis_Shiwei;//定義十位
unsigned char Dis_Gewei; //定義個位
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
TMOD |=0x01;//定時器設置 10ms in 12M crystal
TH0=0xd8; // 初值55536,計數10000次,每次1us,總計10ms
TL0=0xf0;
IE= 0x82; //打開中斷
TR0=1; //啟動計數器TR0
while(1)
{
P0=Dis_Shiwei;//顯示十位
P2=0xFD; // P2=1111 1101
delay(300);//短暫延時
P0=Dis_Gewei; //顯示個位
P2=0xFE; // P2=1111 1110
delay(300);
}
}
/********************************/
/* 定時中斷 */
/********************************/
void tim(void) interrupt 1 using 1 //前1為定時中斷TR0
{
static unsigned char second=30,count; //初值30
TH0=0xd8;//重新賦值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒減1
if(second==0)
{ //這里添加定時到0的代碼 ,可以是燈電路,繼電器吸合等,或者執行一個程序
second=30; //減到0是重新賦值99
}
Dis_Shiwei=tab[second/10];//十位顯示值處理
Dis_Gewei=tab[second%10]; //個位顯示處理
}
}
⑼ LCD顯示的高考倒計時裝置設計這個該如何著手設計
主體部分其實就是單片機控制LCD顯示。
(另外需要的話,可能要加幾個按鍵做時間修改吧。)