單片機課程設(shè)計
#include#include #define unint unsigned int unint nt=0; void time()interrupt 1 using 1 { TH0=0x3c; TL0=0xb0; nt++; } void main() { unint led=0xfe; TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1; while(1) { if(nt%4==0) {P0=led;} eles P0=0; if(nt>40) {led=_crol_(led,1); if(led==0xef) {led=0xfe;} nt=0; }}
單片機課程設(shè)計,請大家?guī)兔~~
首先先判斷按鍵…用一個寄存器來放按鍵的值 舉個例子吧. 比如R3放按鍵數(shù) 當(dāng)按下第一次時,CJNE R3,#1,AA AA程序就是你要執(zhí)行了第一個L1閃的程序… 這個應(yīng)該懂了吧
單片機課程設(shè)計,誰有報告?
這是我們做的《微機控制技術(shù)》課程設(shè)計,里面包含了課程設(shè)計報告,課程設(shè)計報告非常的完整對各個階段的設(shè)計都有完整的說明,包含所有的源代碼。同時,附帶Protues仿真文件,在安裝了Protues的電腦上就可直接運行仿真文件。希望對相同課題設(shè)計的朋友有所幫助。下面是對內(nèi)容的一些介紹:
=======================================
項目要求與擴展
========================================
1.1 項目要求:
1、 總共可以設(shè)置8位密碼,每位密碼值范圍1—8。
2、 用戶可以自行設(shè)定和修改密碼。
3、 按每個密碼鍵時都有聲音提示。
4、 若鍵入的8位開鎖密碼不完全正確,則報警5S。
5、 開鎖密碼連續(xù)錯3次要報警1分鐘,報警期中輸入密碼無效,以防盜賊多次試探密碼。
6、 鍵入的8位開鎖密碼完全正確才能開鎖,開始時要有1S的提示音。
7、 電磁鎖的電磁線圈每次充電5S,然后恢復(fù)初態(tài)。
8、 密碼鍵盤上只有8個密碼按鍵,鎖內(nèi)有備用電池,只有內(nèi)部上電復(fù)位時才能設(shè)置成終改密碼,因此,僅在門外按鍵是不能修改或設(shè)置密碼的。
9、密碼設(shè)置完畢后要有2S的提示音。
1.2用途與功能擴展:
我們在不改變原有項目要求的基礎(chǔ)上,從實用角度做了如下擴展:
1、將密碼范圍從0~8擴展到為 0~9;使密碼鎖的密碼設(shè)置更加符合人們的習(xí)慣。
2、解除對密碼的位數(shù) (原要求長度為8位)的限定,把主動權(quán)交給用戶,由用戶根據(jù)需要自定義密碼位數(shù),以便于實現(xiàn)任意位密碼的設(shè)置。
3、增加清除鍵用于清除輸入的誤碼:增加密碼輸入確認(rèn)鍵用于對輸入結(jié)果進行確認(rèn)。
=========================================
課程設(shè)計報告目錄
=========================================
目錄
引言 1
一、單片機概述 1
1.1 AT89S52的主要性能 1
1.2 AT89S52的功能特性描述 1
1.3 AT89S52的管腳排列 2
二、硬件設(shè)計 2
2.1 硬件設(shè)計思想 2
2.2 部分硬件方案論述 2
2.2.1 七段數(shù)碼管掃描顯示方式的方案比較 2
2.2.2 鍵盤連接方式方案比較 3
2.3 硬件電路圖 4
2.3.1硬件原理框圖 4
2.3.2 硬件protues仿真原理圖 5
2.4 硬件單元 5
2.4.1 鍵盤輸入單元: 5
2.4.2 顯示單元: 6
2.4.3報警電路模塊: 7
2.4.4晶振電路模塊: 7
2.4.5復(fù)位電路模塊: 7
2.4.6開鎖模塊 8
2.4.7單片機模塊 8
三、軟件設(shè)計 9
3.1 軟件基本思想: 9
3.1.1設(shè)置密碼模式: 9
3.1.2密碼驗證開鎖模式: 9
3.1.3密碼判決: 9
3.2 程序模塊介紹 9
3.3 程序簡述 10
3.4 內(nèi)存單元的分配 10
3.4.1RAM存儲單元的分配方案 10
3.4.2 寄存器的分配方案 10
3.5 程序框圖 11
3.6 子程序清單列表 15
3.7 程序核心代碼(主函數(shù)代碼) 16
四、總結(jié) 20
4.1 基本成果: 20
4.2 技術(shù)特色與創(chuàng)新 20
4.2.1 安全 20
4.2.2 方便 20
4.3 應(yīng)用拓展 20
4.4 與同類課題研究的比對和優(yōu)勢 20
4.4.1 傳統(tǒng)的機械鎖: 21
4.4.2 指紋識別系統(tǒng): 21
4.4.3 我們的特點及優(yōu)勢: 21
五、參考文獻 21
六、收獲與感悟: 22
七、致謝 22
八、附錄 23
8.1電子密碼鎖用戶使用手冊 23
8.2 本組成員及分工情況 24
8.3 程序源代碼
==========================================
如果你需要可以到CSDN下載,資料可以分享。
1單片機課程設(shè)計 波形發(fā)生器的設(shè)計
單片機只能產(chǎn)生方波,還需要外圍器件,da0832加741;再高點的頻率就不行了;也可以波形發(fā)生芯片icl8038,它能同時產(chǎn)生正弦波,方波,三角波,采用ad采集電壓并記錄記錄,加12864液晶顯示;或者是波形發(fā)生電路加整形電路再加單片機采集顯示!三種方法樓主看哪個合適你吧.最后給你一個icl8038電路圖
單片機課程設(shè)計實例
redlightzhu bit p1.0
yellowlightzhu bit p1.1
greenlightzhu bit p1.2
redlightzhi bit p1.3
yellowlightzhi bit p1.4
greenlightzhi bit p1.5
shiw equ 78h
gew equ 79h
xh1 equ 30h
xh2 equ 31h
org 0000h
jmp main
org 0080h
main:
mov xh1,#255
mov xh2,#255
mov p1,#0ffh
mov P0,#0ffh
mov P2,#0ffh
mov dptr,#tab
green:
mov xh1,#255
mov xh2,#255
mov r4,#35
mov r3,#35
loopa:clr greenlightzhu
clr redlightzhi
loop1:lcall shuxian
djnz xh1,loop1
setb greenlightzhu
setb redlightzhi
loop2:lcall shuxian
djnz xh2,loop2
dec r3
dec r4
mov a,r4
cjne a,#5,loopa
greenlight:
mov xh1,#255
mov xh2,#255
mov r4,#5
mov r3,#5
loopb:clr greenlightzhu
clr yellowlightzhu
clr redlightzhi
loop11:lcall shuxian
djnz xh1,loop11
setb greenlightzhu
setb redlightzhi
setb yellowlightzhu
loop12:lcall shuxian
djnz xh2,loop12
dec r3
djnz r4,loopb
red1:
mov xh1,#255
mov xh2,#255
mov r4,#20
mov r3,#20
loopc:clr greenlightzhi
clr redlightzhu
loop21:call shuxian
djnz xh1,loop21
setb greenlightzhi
setb redlightzhu
loop22:call shuxian
djnz xh2,loop22
dec r4
dec r3
mov a,r3
cjne a,#5,loopc
red2:
mov xh1,#255
mov xh2,#255
mov r4,#5
mov r3,#5
loopd:clr greenlightzhi
clr yellowlightzhi
clr redlightzhu
loop31:call shuxian
djnz xh1,loop31
setb greenlightzhi
setb redlightzhu
setb yellowlightzhi
loop32:call shuxian
djnz xh2,loop32
dec r3
djnz r4,loopd
jmp green
shuxian:
mov a,r4
mov b,#10
div ab
mov shiw,a
mov gew,b
movc a,@a+dptr
mov shiw,a
mov a,gew
movc a,@a+dptr
mov gew,a
mov p0,#0ffh
mov p2,#0ffh
clr p2.3
mov p0,shiw
call delay
mov p0,#0ffh
mov p2,#0ffh
clr p2.4
mov p0,gew
call delay
mov a,r3
mov b,#10
div ab
mov shiw,a
mov gew,b
movc a,@a+dptr
mov shiw,a
mov a,gew
movc a,@a+dptr
mov gew,a
mov p0,#0ffH
mov p2,0ffh
clr p2.5
mov p0,shiw
call delay
mov p0,#0ffh
mov p2,#0ffh
clr p2.6
mov p0,gew
call delay
ret
delay:
mov r6,#30;延時1ms子程序
mov r7,#255
d1:djnz r6,d1
d2:djnz r7,d2
ret
tab:
DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
end
人
簡單的單片機課程設(shè)計
S_SET BIT P3.2 ;數(shù)字鐘秒控制位
M_SET BIT P3.3 ;分鐘控制位
H_SET BIT P3.4 ;小時控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
TCNT EQU 34H
ORG 0000H
SJMP START
ORG 000BH
LJMP INT_T0
START:MOV DPTR,#TABLE
MOV P1,#0FEH
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H
MOV TH0,#(65536-50000)/256 ;定時50毫秒
MOV TL0,#(65536-50000)/256
MOV IE,#82H
SETB TR0
;****************************;判斷是否有控制鍵按下,是哪一個鍵按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
LJMP A1
S1: LCALL DELAY ;去抖動
JB S_SET,A1
INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判斷是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1
K1: INC MINUTE ;分鐘值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判斷是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1
K2: INC HOUR ;小時值加1
MOV A,HOUR
CJNE A,#24,J2 ;判斷是否加到24小時
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
LJMP A1
;*********************;等待按鍵抬起
J0: JB S_SET,A1
LCALL DISPLAY
SJMP J0
J1: JB M_SET,A1
LCALL DISPLAY
SJMP J1
J2: JB H_SET,A1
LCALL DISPLAY
SJMP J2
;***********************************************
;定時器中斷服務(wù)程序,對秒,分鐘和小時的計數(shù)
INT_T0:MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)/256
INC TCNT
MOV A,TCNT
CJNE A,#20,RETUNE ;計時1秒
INC SECOND
MOV A,P1
RR A
MOV P1,A
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#25,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE: RETI
;*********************;顯示控制子程序
DISPLAY: MOV A,SECOND ;顯示秒
MOV B,#10
DIV AB
CLR P2.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.1
MOV A,B
CLR P2.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.0
CLR P2.2
MOV P0,#40H
LCALL DELAY
SETB P2.2
MOV A,MINUTE ;顯示分鐘
MOV B,#10
DIV AB
CLR P2.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.4
MOV A,B
CLR P2.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.3
CLR P2.5
MOV P0,#40H
LCALL DELAY
SETB P2.5
MOV A,HOUR ;顯示小時
MOV B,#10
DIV AB
CLR P2.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.7
MOV A,B
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.6
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DELAY: MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
單片機課程設(shè)計:學(xué)校作息時間控制系統(tǒng)的設(shè)計!
C8051f040單片機,內(nèi)部資源豐富,12864液晶顯示器,4X4鍵盤作為輸入模塊,主要是軟件.
單片機課程設(shè)計—–數(shù)字溫度計(要有原程序)
系統(tǒng)程序主要包括C程序主函數(shù)、DS18B20復(fù)位函數(shù)、DS18B20寫字節(jié)函數(shù)、DS18B20讀字節(jié)函數(shù)、溫度計算轉(zhuǎn)換函數(shù)、顯示函數(shù)等等。
以下是DS18B20溫度計C語言程序清單:
/*********************************************************************/
//
// DS18B20溫度計C程序
// 2005.2.28通過調(diào)試
/*********************************************************************/
//使用AT89C2051單片機,12MHZ晶振,用共陽LED數(shù)碼管
//P1口輸出段碼,P3口掃描
//#pragma src(d:\aa.asm)
#include “reg51.h”
#include “intrins.h” //_nop_();延時函數(shù)用
#define Disdata P1 //段碼輸出口
#define discan P3 //掃描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7; //溫度輸入口
sbit DIN=P1^7; //LED小數(shù)點控制
uint h;
//
//
//*******溫度小數(shù)部分用查表法**********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/* 共陽LED段碼表 “0” “1” “2” “3” “4” “5” “6” “7” “8” “9” “不亮” “-” */
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 列掃描控制字
uchar data temp_data[2]={0x00,0x00}; // 讀出溫度暫放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數(shù)據(jù),共4個數(shù)據(jù),一個運算暫存用
//
//
//
/***********11微秒延時函數(shù)**********/
//
void delay(uint t)
{
for(;t>0;t–);
}
//
/***********顯示掃描函數(shù)**********/
scan()
{
char k;
for(k=0;k<4;k++) //四位LED掃描控制
{
Disdata=dis_7[display[k]];
if(k==1){DIN=0;}
discan=scan_con[k];delay(90);discan=0xff;
}
}
//
//
/***********18B20復(fù)位函數(shù)**********/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0; //
delay(50); // 550us
DQ=1; //
delay(6); // 66us
presence=DQ; // presence=0繼續(xù)下一步
}
delay(45); //延時500us
presence = ~DQ;
}
DQ=1;
}
//
//
/**********18B20寫命令函數(shù)*********/
//向 1-WIRE 總線上寫一個字節(jié)
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i–) //
{
DQ=1;_nop_();_nop_();
DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ = val&0x01; //最低位移出
delay(6); //66us
val=val/2; //右移一位
}
DQ = 1;
delay(1);
}
//
/*********18B20讀1個字節(jié)函數(shù)********/
//從總線上讀取一個字節(jié)
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i–)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ = 0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DQ)value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
//
/***********讀出溫度函數(shù)**********/
//
read_temp()
{
ow_reset(); //總線復(fù)位
write_byte(0xCC); // 發(fā)Skip ROM命令
write_byte(0xBE); // 發(fā)讀命令
temp_data[0]=read_byte(); //溫度低8位
temp_data[1]=read_byte(); //溫度高8位
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 發(fā)轉(zhuǎn)換命令
}
//
/***********溫度數(shù)據(jù)處理函數(shù)**********/
work_temp()
{
uchar n=0; //
if(temp_data[1]>127)
{temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//負溫度求補碼
display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=0x0A;}}//最高位為0時都不顯示
if(n){display[3]=0x0B;}//負溫度時最高位顯示”-“
}
//
//
/**************主函數(shù)****************/
main()
{
Disdata=0xff; //初始化端口
discan=0xff;
for(h=0;h<4;h++){display[h]=8;}//開機顯示8888
ow_reset(); // 開機先轉(zhuǎn)換一次
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 發(fā)轉(zhuǎn)換命令
for(h=0;h<500;h++)
{scan();} //開機顯示”8888″2秒
while(1)
{
read_temp(); //讀出18B20溫度數(shù)據(jù)
work_temp(); //處理溫度數(shù)據(jù)
for(h=0;h<500;h++)
{scan();} //顯示溫度值2秒
}
}
//
//*********************結(jié)束**************************//
單片機課程設(shè)計 單片機溫度的檢測與顯示的設(shè)計
用18b20做很簡單啊。
溫度的子程序給你,,你重定義一下接口,主程序已經(jīng)調(diào)用出溫度了,你送到顯示就行了。。
/* 延時t毫秒 */
void delay(uint t)
{
uint i;
while(t–)
{
/* 對于11.0592M時鐘,約延時1ms */
for (i=0;i<125;i++)
{}
}
}
/* 產(chǎn)生復(fù)位脈沖初始化DS18B20 */
void TxReset(void)
{
uint i;
DQ = 0;
/* 拉低約900us */
i = 100;
while (i>0) i–;
DQ = 1; // 產(chǎn)生上升沿
i = 4;
while (i>0) i–;
}
/* 等待應(yīng)答脈沖 */
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ); // 檢測到應(yīng)答脈沖
i = 4;
while (i>0) i–;
}
/* 讀取數(shù)據(jù)的一位,滿足讀時隙要求 */
bit RdBit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延時15us以上,讀時隙下降沿后15us,DS18B20輸出數(shù)據(jù)才有效
b = DQ;
i = 8;
while(i>0) i–;
return (b);
}
/* 讀取數(shù)據(jù)的一個字節(jié) */
uchar RdByte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = RdBit();
b = (j<<7)|(b>>1);
}
return(b);
}
/* 寫數(shù)據(jù)的一個字節(jié),滿足寫1和寫0的時隙要求 */
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{
/* 寫1 */
DQ = 0;
i++;i++; // 延時,使得15us以內(nèi)拉高
DQ = 1;
i = 8;
while(i>0) i–; // 整個寫1時隙不低于60us
}
else
{
/* 寫0 */
DQ = 0;
i = 8;
while(i>0) i–; // 保持低在60us到120us之間
DQ = 1;
i++;
i++;
}
}
}
/* 啟動溫度轉(zhuǎn)換 */
void convert(void)
{
TxReset(); // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
RxWait(); // 等待DS18B20給出應(yīng)答脈沖
delay(1); // 延時
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
}
/* 讀取溫度值 */
void RdTemp(void)
{
TxReset(); // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
RxWait(); // 等待DS18B20給出應(yīng)答脈沖
delay(1); // 延時
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tplsb = RdByte(); // 溫度值低位字節(jié)(其中低4位為二進制的“小數(shù)”部分)
tpmsb = RdByte(); // 高位值高位字節(jié)(其中高5位為符號位)
}
void main(void)
{
do
{
delay(1); // 延時1ms
convert(); // 啟動溫度轉(zhuǎn)換,需要750ms
delay(1000); // 延時1s
RdTemp(); // 讀取溫度
}
while(1);
}
單片機課程設(shè)計電子時鐘程序
#include <at89x51.h> //頭文件包含
#define uchar unsigned char //宏定義
#define uint unsigned int
#define ON 0 //定義0為打開
#define OFF 1 //定義1為關(guān)閉
#define LEDBus P1 //定義p1口為數(shù)碼管段碼口
sbit MIAO =P1^2; //秒點
sbit HOU_S=P3^0; //時十位位選
sbit HOU_G=P3^1; //時個位位選
sbit MIN_S=P3^2; //分十位位選
sbit MIN_G=P3^3; //分個位位選
sbit H_KEY=P3^4; //時調(diào)整鍵
sbit M_KEY=P3^5; //分調(diào)整鍵
bit SHAN; //閃爍標(biāo)志位
uchar second,minute,hour; //定義秒、分、時寄存器
uchar code LEDTab[]={0x14,0xd7,0x4c, //數(shù)碼管段碼表0–9
0x45,0x87,0x25,0x24,0x57,0x04,0x05};
void delay(uchar t); //延時函數(shù)
void init(); //初始化函數(shù)
void display(); //顯示函數(shù)
void min_tiao(); //分調(diào)整函數(shù)
void hou_tiao(); //時調(diào)整函數(shù)
/***************************************
函 數(shù) 名:main
功 能:主函數(shù)
說 明:
入口參數(shù):無
返 回 值:無
****************************************/
void main()
{
init(); //調(diào)用初始化函數(shù)
while(1) //主程序循環(huán)
{
if(!H_KEY) hou_tiao(); //如果時調(diào)整鍵按下(為0),調(diào)用時調(diào)整函數(shù)
if(!M_KEY) min_tiao(); //如果分調(diào)整鍵按下(為0),調(diào)用分調(diào)整函數(shù)
display(); //調(diào)用顯示函數(shù)
}
}
/***************************************
函 數(shù) 名:init
功 能:初始化函數(shù)
說 明:初始化定時器及中斷
入口參數(shù):無
返 回 值:無
***************************************/
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0; //定時器0模式1,50毫秒
ET0=1;TR0=1;EA=1; //開定時器0中斷、啟動定時器0、開總中斷
}
/***************************************
函 數(shù) 名:display
功 能:顯示函數(shù)
說 明:
入口參數(shù):無
返 回 值:無
***************************************/
void display()
{
LEDBus=LEDTab[minute%10]; //分個位送數(shù)碼管顯示
MIAO=SHAN; //秒點閃爍
MIN_G=ON; //打開分個位位選
delay(1); //顯示1毫秒
MIN_G=OFF; //關(guān)閉分個位位選
LEDBus=LEDTab[minute/10]; //分十位送數(shù)碼管顯示
MIAO=SHAN; //秒點閃爍
MIN_S=ON; //打開分十位位選
delay(1); //顯示1毫秒
MIN_S=OFF; //關(guān)閉分十位位選
LEDBus=LEDTab[hour%10]; //時個位送數(shù)碼管顯示
HOU_G=ON; //打開時個位位選
delay(1); //顯示1毫秒
HOU_G=OFF; //關(guān)閉時個位位選
if(hour/10) //如果時十位為0,不顯示十位數(shù)字
{
LEDBus=LEDTab[hour/10]; //時十位送數(shù)碼管顯示
HOU_S=ON; //打開時十位位選
delay(1); //顯示1毫秒
HOU_S=OFF; //關(guān)閉時十位位選
}
}
/***************************************
函 數(shù) 名:min_tiao
功 能:分調(diào)整
說 明:
入口參數(shù):無
返 回 值:無
***************************************/
void min_tiao()
{
while(!M_KEY) display(); //等待分調(diào)整鍵松開
second=0;minute++; //秒清零、分加1
if(minute==60) minute=0; //如果分等于60,分變0
}
/***************************************
函 數(shù) 名:hou_tiao
功 能:時調(diào)整
說 明:
入口參數(shù):無
返 回 值:無
***************************************/
void hou_tiao()
{
while(!H_KEY) display(); //等待時調(diào)整鍵松開
second=0;hour++; //秒清零,時加1
if(hour==24) hour=0; //如果時等于24,時變0
}
/***************************************
函 數(shù) 名:delay
功 能:延時函數(shù)
說 明:
入口參數(shù):t:延時時間長短
返 回 值:無
***************************************/
void delay(uchar t)
{
uchar i; //定義變量
for(;t>0;t–) //如果t大于0,t減1(外層循環(huán))
for(i=124;i>0;i–); //i等于124,如果i大于0,i減1
}
/***************************************
函 數(shù) 名:timer0
功 能:定時器0中斷函數(shù)
說 明:
入口參數(shù):無
返 回 值:無
***************************************/
void timer0() interrupt 1 //定時器0(中斷1)
{
uchar tim1,tim2; //定義臨時變量
TL0=TL0+0XB0;TH0=0X3C; //重裝定時器初值
tim1++; //每中斷一次tim1加1
if(tim1==10) //中斷10(0.5秒)
{
SHAN=!SHAN; //閃爍標(biāo)志取反
tim1=0;tim2++; //tim1清零,tim2加1
if(tim2==2) //到了1秒
{
tim2=0;second++; //tim2清零,秒加1
if(second==60) //如果秒到60
{
second=0;minute++; //秒變0,分加1
if(minute==60) //如果分到60
{
minute=0;hour++; //分變0,時加1
if(hour==24) hour=0; //如果時到24,時變0
}
}
}
}
}
/***************************************
program end 程序結(jié)束