剛學(xué)的單片機(jī),下面的程序是在學(xué)習(xí)中斷和定時器時寫的,已調(diào)試通過,
多功能電子鐘有如下功能:
1,可以用來做電子鐘
2,可以用做報警器(按P3.2時,用做報警)
3,可以用做鬧鐘(按P1.6時,用做鬧鐘)
4,可以顯示星期
程度當(dāng)中還有好多的不妥之處,還請高手門幫忙指正.
程序如下:
(由于注解太多,所以沒有能寫出來,請見諒!!),制作成功后的圖片如附件.
內(nèi)容如下:
#include <AT89X51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code dispcode[]={0x81,0x9f,0xa4,0x8c,0x9a,0xc8,0xc0,0x9d,0x80,0x88};
uchar code DATA[]={0xfc,0x92,0x98,0xac,0x89,0x01,0x5c,0x80,0x88};
uchar dispbitcode[]={0xfe,0xfd,0xfb,0xf7};
uchar dispbuf[8]={0,0,0,0};
uchar dispbitcnt;
uchar second,minite,hour,day;
uchar clockhour,clockminite;
uint tcnt;
uchar mstcnt;
uchar t;
uint a;
//上面的是定義各個變量和數(shù)碼管緩存
void yanshi(uint t)
{
for(;t>0;t--);
}//延時子程序
void beep()
{
while(hour<clockhour){
for(a=0;a<1000;a++)
{yanshi(5);
P1_4=~P1_4;}
for(a=0;a<1000;a++)
{yanshi(5);
P1_4=~P1_4;}
for(a=0;a<5000;a++)
{yanshi(6);
P1_4=~P1_4;}
if(P3_6==0){break;}}
while(minite<clockminite){
for(a=0;a<1000;a++)
{yanshi(5);
P1_4=~P1_4;}
for(a=0;a<1000;a++)
{yanshi(5);
P1_4=~P1_4;}
for(a=0;a<5000;a++)
{yanshi(6);
P1_4=~P1_4;}
if(P3_6==0){break;}}}//報警子程序(P1.4接的是BEEP,P3.6為O時跳出)
void baojing()
{
if(P1_7==0){
yanshi(500);
if(P1_7==0){
while(1){
if(P1_7==1){
while(1){
beep();
if(P3_6==0)
{break;}}}
if(P3_6==0){break;}}}}}//報警執(zhí)行子程序(用P1.7做信號檢測腳,同樣當(dāng)P3.6為0時跳出)
void clock()
{
if(P3_3==0){yanshi(500);
if(P3_3==0){clockminite++;
if(clockminite==60)
{clockminite=0;}
dispbuf[3]=clockminite%10;
dispbuf[2]=clockminite/10;
while(P3_3==0);}}
if(P3_6==0){yanshi(500);
if(P3_6==0){clockhour++;
if(clockhour==24){clockhour=0;}
dispbuf[1]=clockhour%10;
dispbuf[0]=clockhour/10;
while(P3_6==0);}}}//設(shè)定鬧鐘子程序
void key()
{
if(P3_6==0){yanshi(500);
if(P3_6==0){second++;
if(second==60){second=0;}
while(P3_6==0);}}
if(P3_5==0){yanshi(1000);
if(P3_5==0){minite++;
if(minite==60){minite=0;}
dispbuf[3]=minite%10;
dispbuf[2]=minite/10;
while(P3_5==0);}}
if(P3_7==0){yanshi(500);
if(P3_7==0){hour++;
if(hour==24){hour=0;}
dispbuf[1]=hour%10;
dispbuf[0]=hour/10;
while(P3_7==0);}}
if(P3_4==0){yanshi(500);
if(P3_4==0){day++;
if(day==7){day=0; }
P2=DATA[day];
while(P3_4==0);}}
}//設(shè)定時間子程序
void laozhong()
{
if(hour==clockhour){
if(minite==clockminite){
for(a=0;a<1000;a++)
{yanshi(5);
P1_4=~P1_4;}
for(a=0;a<1000;a++)
{yanshi(5);
P1_4=~P1_4;}
for(a=0;a<5000;a++)
{yanshi(6);
P1_4=~P1_4;}}}}//鬧鐘子程序
void display()
{
dispbuf[3]=minite%10;
dispbuf[2]=minite/10;
dispbuf[1]=hour%10;
dispbuf[0]=hour/10;
P2=DATA[day];
}//顯示子程序
void displayclock()
{
dispbuf[7]=clockminite%10;
dispbuf[6]=clockminite/10;
dispbuf[5]=clockhour%10;
dispbuf[4]=clockhour/10;
}//鬧鐘顯示子程序
void time()
{
tcnt++;
if(tcnt==4000){tcnt=0;
second++;
if(second==60){second=0;
minite++;
if(minite==60){minite=0;
hour++;
if(hour==24){hour=0;
day++;
if(day==7){day=0;}}}}
display();}}//時間子程序
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==4){mstcnt=0;
P0=dispcode[dispbuf[dispbitcnt]];
P1=dispbitcode[dispbitcnt];
P2=DATA[day];
dispbitcnt++;}
if(dispbitcnt==4){dispbitcnt=0;}
time();displayclock();}//中斷
void main(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while(1)
{
key();clock();
if(P1_6==0)
{while(1){laozhong();
if(P3_6==0){break;}}}
if(P3_2==0){yanshi(10000);
if(P3_2==0){while(1)
{baojing();
if(P3_6==0)
{break;}
}}}}}
//S1:啟動報警器(P3.2)
//S2: clock minite 加(P3.3)
//S3: 星期加(P3.4)
//S4:time minite 加(P3.5)
//S5: clock hour 加/退出報警器(P3.6)
//S6:time hour 加(P3.7)
//P1-7為信號檢測腳
新手想學(xué)習(xí)一下~謝謝了
好東西多傳傳啊
好東西多傳傳啊
學(xué)習(xí)了
不錯不錯
good
我也是新手啊
學(xué)習(xí)一下!
美中不足:
對于新手程序應(yīng)該有解釋,不能說每一句都要解釋,最起碼的要有,這個程序上 P1_4;P1_7;P3_3;P3_4;P3_5;P3_6;P3_7;以及P0;P1;P2;由于沒有電路原理圖,他們都是什么作用?應(yīng)該加以注釋;這樣會更好一些,便于初學(xué)者入門,哈哈!當(dāng)讓行家一看就知道是怎么連接的
看看,有實(shí)用先仿制
我也是新手啊
要學(xué)習(xí)學(xué)習(xí)!
ok
學(xué)習(xí)一下
看一下學(xué)習(xí)學(xué)習(xí).
我系新手\
看看
過來看看我也是學(xué)這個的。希望我們 以后常聯(lián)系!
只為看不一下
非常感謝了!!
新手,來學(xué)習(xí)學(xué)習(xí)
看看
看看學(xué)習(xí)先
支持
來學(xué)習(xí)一下
學(xué)習(xí)下
很好
學(xué)習(xí)了
拜讀
學(xué)習(xí)下
來看一下
看
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |