24小時(shí)切換簡(jiǎn)易時(shí)鐘
簡(jiǎn)介
1、本設(shè)計(jì)主要介紹用單片機(jī)內(nèi)部的定時(shí)/計(jì)數(shù)器來(lái)實(shí)現(xiàn)電子時(shí)鐘的方法,本設(shè)計(jì)由單片機(jī)STC89C51單片機(jī)和LED數(shù)碼管為核心,輔以必要的電路,構(gòu)成了一個(gè)單片機(jī)電子時(shí)鐘。
2、本設(shè)計(jì)擬實(shí)現(xiàn)的性能指標(biāo)如下:
(1)鍵盤用于校正、調(diào)節(jié)數(shù)碼管上顯示的時(shí)間。
(2)單片機(jī)通過(guò)輸出各種電脈沖信號(hào)開(kāi)驅(qū)動(dòng)控制各部分正常工作。
(3)單片機(jī)發(fā)送的信號(hào)經(jīng)過(guò)顯示電路通過(guò)譯碼最終在數(shù)碼管上顯示出來(lái)。
(4)按鍵還可以切換12小時(shí)制和24小時(shí)制,并有指示燈。
STC89C51單片機(jī)
STC89C51是一種低功耗、高性能CMOS8位微控制器,具有 4K 在系統(tǒng)可編程Flash 存儲(chǔ)器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C51為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 4k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時(shí)器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個(gè)16 位 定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口。
STC89C51單片機(jī)引腳圖
(一)STC89C51主要功能、性能參數(shù)如下:
(1)內(nèi)置標(biāo)準(zhǔn)51內(nèi)核,機(jī)器周期:增強(qiáng)型為6時(shí)鐘,普通型為12時(shí)鐘;
(2)工作頻率范圍:040MHZ,相當(dāng)于普通8051的080MHZ;
(3)STC89C51RC對(duì)應(yīng)Flash空間:4KB;
(4)內(nèi)部存儲(chǔ)器(RAM):512B;
(5)定時(shí)器\計(jì)數(shù)器:3個(gè)16位;
(6)通用異步通信口(UART)1個(gè);
(7)中斷源:8個(gè);
(8)有ISP(在系統(tǒng)可編程)\IAP(在應(yīng)用可編程),無(wú)需專用編程器\仿真器;
(9)通用I\O口:32\36個(gè);
(10)工作電壓:3.8~5.5V;
(11)外形封裝:40腳PDIP、44腳PLCC和PQFP等。
(二)STC89C51單片機(jī)的引腳說(shuō)明:
(二)STC89C51單片機(jī)的引腳說(shuō)明:
VCC:供電電壓。
GND:接地。
P0口:P0口為一個(gè)8位漏級(jí)開(kāi)路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。
P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。
P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢(shì),當(dāng)對(duì)外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。
P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。
P3.0 RXD(串行輸入口)
P3.1 TXD(串行輸出口)
P3.2 /INT0(外部中斷0)
P3.3 /INT1(外部中斷1)
P3.4 T0(記時(shí)器0外部輸入)
P3.5 T1(記時(shí)器1外部輸入)
P3.6 /WR(外部數(shù)據(jù)存儲(chǔ)器寫選通)
P3.7 /RD(外部數(shù)據(jù)存儲(chǔ)器讀選通)
P3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號(hào)。
I/O口作為輸入口時(shí)有兩種工作方式,即所謂的讀端口與讀引腳。讀端口時(shí)實(shí)際上并不從外部讀入數(shù)據(jù),而是把端口鎖存器的內(nèi)容讀入到內(nèi)部總線,經(jīng)過(guò)某種運(yùn)算或變換后再寫回到端口鎖存器。只有讀端口時(shí)才真正地把外部的數(shù)據(jù)讀入到內(nèi)部總線。上面圖中的兩個(gè)三角形表示的就是輸入緩沖器CPU將根據(jù)不同的指令分別發(fā)出讀端口或讀引腳信號(hào)以完成不同的操作。這是由硬件自動(dòng)完成的,不需要我們操心,1然后再實(shí)行讀引腳操作,否則就可能讀入出錯(cuò),為什么看上面的圖,如果不對(duì)端口置1端口鎖存器原來(lái)的狀態(tài)有可能為0Q端為0Q^為1加到場(chǎng)效應(yīng)管柵極的信號(hào)為1,該場(chǎng)效應(yīng)管就導(dǎo)通對(duì)地呈現(xiàn)低阻抗,此時(shí)即使引腳上輸入的信號(hào)為1,也會(huì)因端口的低阻抗而使信號(hào)變低使得外加的1信號(hào)讀入后不一定是1。若先執(zhí)行置1操作,則可以使場(chǎng)效應(yīng)管截止引腳信號(hào)直接加到三態(tài)緩沖器中實(shí)現(xiàn)正確的讀入,由于在輸入操作時(shí)還必須附加一個(gè)準(zhǔn)備動(dòng)作,所以這類I/O口被稱為準(zhǔn)雙向口。89C51的P0/P1/P2/P3口作為輸入時(shí)都是準(zhǔn)雙向口。
RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。
ALE/PROG:當(dāng)訪問(wèn)外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。因此它可用作對(duì)外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過(guò)一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí), ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無(wú)效。
/PSEN:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號(hào)將不出現(xiàn)。
/EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。
XTAL2:來(lái)自反向振蕩器的輸出。
源文件下載:
原文件(可點(diǎn)擊跳轉(zhuǎn))文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-512152.html
原理圖:
代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-512152.html
/************************************************************
作品名字:簡(jiǎn)易時(shí)鐘(12小時(shí)和24小時(shí)可轉(zhuǎn)換)
功能:六位數(shù)碼管顯示時(shí)分秒
二十四小時(shí)制和十二小時(shí)制可切換
十二小時(shí)制紅燈亮,二十四小時(shí)制紅燈滅
當(dāng)時(shí)間在凌晨0點(diǎn)~中午12點(diǎn)之間時(shí),黃燈亮,此時(shí)按切換按鍵數(shù)碼管的示數(shù)不會(huì)變化
制作說(shuō)明:P0接數(shù)碼管段選,P2低6位接數(shù)碼管位
**************************************************************/
#include<reg52.h> //包含庫(kù)文件
#define uc unsigned char
#define ui unsigned int //宏定義,就是定義ui代替unsigned int,方便下面程序調(diào)用
sbit LED=P3^2;//定義LED
sbit key0=P3^3;//定義小時(shí)切換按鍵
sbit key1=P3^4;//定義調(diào)小時(shí)按鍵
sbit key2=P3^5;//定義調(diào)分鐘按鍵
sbit key3=P3^6;//定義秒清零按鍵
sbit wan=P3^7;//上下午指示燈
uc min,hour,sec,num;//分鐘,小時(shí),秒,定時(shí)器計(jì)時(shí)變量
bit bdata zhi;//小時(shí)制標(biāo)志位
uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*0,1,2,3,4,5,6,7,8,9,.*///共陰極編碼
void delay(ui x)//延時(shí)函數(shù),大約延時(shí)1ms
{
ui i,j;
for(i=0;i<x;i++)
for(j=0;j<121;j++); //執(zhí)行121次大約延時(shí)1ms
}
void display()//掃描顯示函數(shù),高位到低位
{
P0=tab[hour/10];//小時(shí)數(shù)據(jù)是一個(gè)兩位數(shù),除以10得到的商是十位數(shù),然后調(diào)用數(shù)組內(nèi)的對(duì)應(yīng)數(shù)字的編碼賦值給P0口,顯示對(duì)應(yīng)數(shù)字
P2=0xdf;//11011111 選擇對(duì)應(yīng)位
delay(1);//延時(shí)
P2=0xff;//關(guān)閉位選
P0=(tab[hour%10])|0x80;//給第二位后加“點(diǎn)(段選接線最高位是小數(shù)點(diǎn),所以就按位或0x80就是在最高位賦值1,就是顯示小數(shù)點(diǎn))
P2=0xef;//11101111
delay(1);
P2=0xff;
P0=tab[min/10];
P2=0xf7;//11110111
delay(1);
P2=0xff;
P0=(tab[min%10])|0x80;//給第四位后加“點(diǎn)”
P2=0xfb;//11111011
delay(1);
P2=0xff;
P0=tab[sec/10];
P2=0xfd;//11111101
delay(1);
P2=0xff;
P0=tab[sec%10]; //秒數(shù)據(jù)是一個(gè)兩位數(shù),%是取余運(yùn)算,就是除以10的余數(shù),得到個(gè)位數(shù)字
P2=0xfe;//11111110
delay(1);
P2=0xff;
}
void keyscan()//鍵盤掃描,開(kāi)關(guān)接地
{
if(key0==0) //檢測(cè)到按鍵按下
{
delay(5); //延時(shí)去抖
if(key0==0) //再次判斷按鍵是否按下
{
LED=~LED; //LED取反操作
zhi=~zhi; //小時(shí)制取反
if((hour>=12)&&(zhi==0))//小時(shí)大于等于12點(diǎn)時(shí),且小時(shí)制等于0,也就是12小時(shí)制
{
hour=hour-12; //將當(dāng)前小時(shí)數(shù)據(jù)減12賦值給hour
}
if((zhi==1)&&(wan==1))//小時(shí)制為24小時(shí)。是下午時(shí)
{
hour=hour+12;//將小時(shí)數(shù)據(jù)加12賦值給hour
}
}
while(!key0) display();//判斷是否松開(kāi),按鍵不送開(kāi)時(shí),key0是0,取反就是1,一直成立,就一直執(zhí)行后面的顯示函數(shù),按鍵松開(kāi)就跳出
}
if(key1==0) //加小時(shí)按鍵按下
{
delay(5);
if((key1==0)&&(zhi==0)) //12小時(shí)制
{
hour++; //小時(shí)加
if(hour==12) //加到12點(diǎn)
{
hour=0; //小時(shí)清零
wan=~wan; //切換上下午
}
}
if((key1==0)&&(zhi==1)) //24小時(shí)制
{
hour++; //小時(shí)加
if(hour==24) //加到24點(diǎn)
hour=0; //清零
}
while(!key1) display();//判斷是否松開(kāi)
}
if(key2==0) //分加按鍵按下
{
delay(5);
if(key2==0)
{
min++; //分加
if(min==60) //加到60
min=0; //分清零
}
while(!key2) display();//判斷是否松開(kāi)
}
if(key3==0)//秒清零按鍵
{
delay(5);
if(key3==0)
{sec=0;} //秒清零
while(!key3) display();//判斷是否松開(kāi)
}
}
void init() //系統(tǒng)初始化函數(shù)
{
sec=0;//一通電,顯示12:30:00
min=30;
hour=12;
LED=1; //led點(diǎn)亮
zhi=1; //默認(rèn)是24小時(shí)制
wan=1; //下午
TMOD=0x01;//設(shè)置定時(shí)器0工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //定時(shí)器初值50ms
EA=1; //打開(kāi)中斷總開(kāi)關(guān)
ET0=1; //打開(kāi)中斷允許開(kāi)關(guān)
TR0=1; //打開(kāi)定時(shí)開(kāi)關(guān)
}
void shizhi() //小時(shí)制函數(shù)
{
if(hour>=12) //小時(shí)能加到大于12點(diǎn),說(shuō)明是24小時(shí)制
wan=1; //卻換到下午
if((hour<12)&&(zhi==1))//小時(shí)小于12并且是24小時(shí)制
wan=0; //切換到上午
}
void main()//主函數(shù)
{
init(); //調(diào)用初始化函數(shù)
while(1) //進(jìn)入循環(huán)
{
display(); //調(diào)用顯示函數(shù)
keyscan();//掃描是否有鍵按下
shizhi(); //小時(shí)制函數(shù)
}
}
void time0() interrupt 1 //定時(shí)器0工作函數(shù)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //進(jìn)入中斷后重新賦初值50ms
num++; //變量加
if(num==20) //加20次就是1s
{
num=0; //變量清零
sec++; //秒變量加
if(sec==60) //秒加到60
{
sec=0; //秒清零
min++; //分加
if(min==60)//分加到60
{
min=0; //分清零
hour++;//小時(shí)加
if((hour==12)&&(zhi==0)) //小時(shí)加到12,小時(shí)制為12
{
wan=~wan; //切換上下午
hour=0; //小時(shí)清零
}
if((hour==24)&&(zhi==1)) //小時(shí)加到24,小時(shí)制為24小時(shí)制
{
hour=0; //小時(shí)清零
}
}
}
}
}
到了這里,關(guān)于24小時(shí)切換簡(jiǎn)易時(shí)鐘-51單片機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!