欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關(guān)于一個單片機電子鐘 前一個貼發(fā)的有點遜 這個貼附程序和原理圖
[打印本頁]
作者:
907383184@qq.co
時間:
2019-10-30 12:51
標題:
關(guān)于一個單片機電子鐘 前一個貼發(fā)的有點遜 這個貼附程序和原理圖
程序的目的是實現(xiàn) 八位數(shù)碼管實時顯示時分秒,循環(huán)顯示周期為“00-00-00 至 23-59-59”。
按鍵1設(shè)置時加 按鍵2設(shè)置時減1 按鍵3進入設(shè)置模式 按鍵4切換鬧鐘和時鐘顯示界面 按鍵5設(shè)置時位選
大部分內(nèi)容已經(jīng)實現(xiàn) 在我想加入T1做為定時檢測鬧鐘與時鐘數(shù)值并在鬧鐘與時鐘數(shù)值相等時使得蜂鳴器響1分鐘 但T1定時器中斷無法正常運作。
TIM截圖20191030123740.png
(64.51 KB, 下載次數(shù): 65)
下載附件
2019-10-30 12:51 上傳
單片機源程序如下:
#include <reg51.h>
#define uc unsigned char
#define ui unsigned int
uc code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uc code weima[]={0xfe,0xfd,0xf7,0xef,0xbf,0x7f};
int zancun1[6];
int zancun2[6];
uc second1=0,minute1=0,hour1=0,second2=0,minute2=0,hour2=0;
ui mode=0,set=0,setw=0,set1=0,setw1=0;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
sbit K5=P3^4;
sbit P00=P0^0;
void chu1(uc x,y,z,o,p,q)
{
zancun1[0]=x%10;
zancun1[1]=x/10;
zancun1[2]=y%10;
zancun1[3]=y/10;
zancun1[4]=z%10;
zancun1[5]=z/10;
zancun2[0]=o%10;
zancun2[1]=o/10;
zancun2[2]=p%10;
zancun2[3]=p/10;
zancun2[4]=q%10;
zancun2[5]=q/10;
}
void save1()
{
second1=zancun1[1]*10+zancun1[0];
minute1=zancun1[3]*10+zancun1[2];
hour1=zancun1[5]*10+zancun1[4];
}
void save2()
{
second2=zancun2[1]*10+zancun2[0];
minute2=zancun2[3]*10+zancun2[2];
hour2=zancun2[5]*10+zancun2[4];
}
ui chouse(int a,int b)
{
switch(a)
{
case 0: if(b<=0||b>=10){b=0;}zancun1[0]=b;break;
case 1: if(b<=0||b>=6){b=0;}zancun1[1]=b;break;
case 2: if(b<=0||b>=10){b=0;}zancun1[2]=b;break;
case 3: if(b<=0||b>=6){b=0;}zancun1[3]=b;break;
case 4: if(b<=0||b>=5){b=0;}zancun1[4]=b;break;
case 5: if(b<=0||b>=3){b=0;}zancun1[5]=b;break;
}
return (set=b);
}
ui chouse2(int a,int b)
{
switch(a)
{
case 0: if(b<=0||b>=10){b=0;}zancun2[0]=b;break;
case 1: if(b<=0||b>=6){b=0;}zancun2[1]=b;break;
case 2: if(b<=0||b>=10){b=0;}zancun2[2]=b;break;
case 3: if(b<=0||b>=6){b=0;}zancun2[3]=b;break;
case 4: if(b<=0||b>=5){b=0;}zancun2[4]=b;break;
case 5: if(b<=0||b>=3){b=0;}zancun2[5]=b;break;
}
return (set1=b);
}
void delay(unsigned int y)
{
unsigned char j;
unsigned int i;
for(i=0;i<y;i++)
for(j=0;j<120;j++);
}
void shizhong(ui o,p,q)
{
P1=weima[0];
P2=duan[o%10];
delay(8);
P1=weima[1];
P2=duan[o/10];
delay(8);
P1=weima[2];
P2=duan[p%10];
delay(8);
P1=weima[3];
P2=duan[p/10];
delay(8);
P1=weima[4];
P2=duan[q%10];
delay(8);
P1=weima[5];
P2=duan[q/10];
delay(8);
P1=0xdb;
P2=0x40;
delay(8);
P1=0xff;
}
void time0s()
{
TMOD|=0X01;
TH0=0X3c;
TL0=0Xb0;
ET0=1;
TR0=1;
PT0=1;
PT1=0;
}
void time1sON()
{
TMOD|=0X10;
TH1=0X3c;
TL1=0Xb0;
ET1=1;
TR1=1;
}
void Time0() interrupt 1
{
static ui i=0;
TH0=0X3C;
TL0=0Xb0;
i++;
if(i==20)
{
i=0;
second1++;
if(second1==60)
{
second1=0;
minute1++;
}
if(minute1==60)
{
minute1=0;
hour1++;
}
if(hour1==24)
{
hour1=0;
}
}
}
void Time1() interrupt 3
{
static ui i=0,r=0;
TH1=0X3C;
TL1=0Xb0;
if(i==20)
{
r++;
if(r==60)
{
if(minute1==minute2&&hour1==hour2)
{
for(r=0;r<10;r++)
{
P00=~P00;
delay(100);
r=0;
}
}
}
}
}
void key()
{
EA=1;
EX1=1;
IT1=1;
EX0=1;
IT0=1;
}
void key3() interrupt 0
{
EX1=0;
chu1(second1,minute1,hour1,second2,minute2,hour2);
while(1)
{
if(mode==0)
{
set=zancun1[setw];
P1=weima[setw];
P2=duan[set];
delay(400);
P1=0xff;
delay(400);
if(K1==0){delay(50);set++;chouse(setw,set);}
if(K2==0){delay(50);set--;chouse(setw,set);}
if(K5==0){delay(50);setw++;set=0;if(setw>=6){setw=0;}}
if(K3==0){delay(50);save1();set=0;setw=0;break;}
}
else
{
set1=zancun2[setw1];
P1=weima[setw1];
P2=duan[set1];
delay(400);
P1=0xff;
delay(400);
if(K1==0){delay(50);set1++;chouse2(setw1,set1);}
if(K2==0){delay(50);set1--;chouse2(setw1,set1);}
if(K5==0){delay(50);setw1++;set1=0;if(setw1>=6){setw1=0;}}
if(K3==0){delay(50);save2();set1=0;setw1=0;break;}
}
}
IE0=0;
IE1=0;
EX1=1;
}
void key4() interrupt 2
{
mode=~mode;
IE1=0;
}
void main()
{
key();
time0s();
time1sON();
while(1)
{
if(mode==0)
{
shizhong(second1,minute1,hour1);
}
if(mode!=0)
{
shizhong(second2,minute2,hour2);
}
}
}
復制代碼
作者:
angmall
時間:
2019-10-30 19:09
程序分享出來給需要的人作參考
//實驗平臺:TX-1C開發(fā)板(板子上是有源蜂鳴器,程序按無源編寫的)
//K1鍵調(diào)整選擇,K2鍵+,長按連+,K3鍵-,長按連-,K4鍵鬧鐘設(shè)置
//定時器初始化程序根據(jù)晶振頻率選擇
//用計數(shù)法代替軟件延時,提高走時精度
//數(shù)碼管采用分時動態(tài)顯示,約2ms顯示1位
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define key_S 300 //宏定義短按(約20ms)
#define key_L 6000 //宏定義長按(約2/3s)
#define key_M 3000 //宏定義長按(約1/3s)
sbit K1 = P3^4; //調(diào)整選擇/退出
sbit K2 = P3^5; //++,長按連+
sbit K3 = P3^6; //--,長按連-
sbit K4 = P3^7; //調(diào)整時間
sbit dula=P2^6; //段選
sbit wela=P2^7; //位選
sbit allow=P2^5; //LED使能
sbit Buzzer=P2^3; //蜂鳴器
uchar code table[]={ //0~F數(shù)組
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint Cnt200us; //定義200微秒變量
uchar hour=12,min=0,sec=0; //定義時、分、秒變量
uchar hour4=12,min4=0; //定義鬧鐘時、分變量
uchar Choice=0,Choice4=0; //調(diào)整走時的選擇變量、設(shè)置鬧鐘的選擇變量
bit Buzzer_sign; //蜂鳴器鬧鐘標志
bit Twinkle,second=1; //閃爍標志、秒標志
bit ban=0; //調(diào)鬧禁止調(diào)時標志
bit B_sign=0;
/**************************************
定時器0/1初始化程序 @12.000MHz
**************************************/
/*
void Timer0Init(void)
{
TMOD= 0x22; //設(shè)置定時器模式
TL0 = 0x38; //設(shè)置定時初值200微秒
TH0 = 0x38; //設(shè)置定時重載值200微秒
TR0 = 1; //定時器0開始計時
EA=1; //開總中斷
ET0=1; //開定時器0中斷
}
*/
/***************************************
定時器0/1初始化程序 @11.0592MHz
***************************************/
void Timer_Init()
{
TMOD = 0x02; //設(shè)置自動重載模式
TL0 = 0x48; //設(shè)置定時初值200微秒
TH0 = 0x48; //設(shè)置定時重載值200微秒
TR0 = 1; //定時器0開始計時
EA=1; //開總中斷
ET0=1; //開定時器0中斷
}
/*************************
按鍵掃描程序
*************************/
void key_scan()
{
static bit key1_sign,key4_sign; //按鍵自鎖標志變量
static uint count1,count2,count3=0,count4=0;//消抖計數(shù)變量
if((!K1)&&(ban==0)) //檢測按鍵1按下與不在調(diào)鬧禁止狀態(tài)有效
{
count1++; //消抖計數(shù)1自+1
if((count1>=key_S)&&(key1_sign==0))//檢測消抖計數(shù)與按鍵1自鎖標志
{
key1_sign=1; //按鍵1自鎖標志置1
Choice++; //調(diào)整選擇變量自+1
if(Choice>=4) //調(diào)整時間選擇0正常走時,1調(diào)時,2調(diào)分,3調(diào)秒
{
Choice=0; //調(diào)整時間選擇清0
TF0=0; //定時器溢出標志TF0清0
Cnt200us=0; //時間變量Cnt200us自+1
}
}
}
else
{
key1_sign=0; //按鍵1自鎖標志清0
count1=0; //消抖計數(shù)count1清0
}
if(!K2)
{
count2++;
if(count2>=key_L) //長按快調(diào)
{
if(Choice==1) //選擇變量1調(diào)時
{
hour++;
if(hour>=24)
hour=0;
}
if(Choice==2) //選擇變量2調(diào)分
{
min++;
if(min>=60)
min=0;
}
if(Choice==3) //選擇變量3調(diào)秒
{
sec++;
if(sec>=60)
sec=0;
}
if(Choice4==1) //選擇變量1調(diào)時
{
hour4++;
if(hour4>=24)
hour4=0;
}
if(Choice4==2) //選擇變量2調(diào)分
{
min4++;
if(min4>=60)
min4=0;
}
count2=key_M;
}
}
else //按鍵抬起
{
if(count2>key_S && count2<key_L)//短按
{
if(Choice==1) //選擇變量1調(diào)時
{
hour++;
if(hour>=24)
hour=0;
}
if(Choice==2) //選擇變量2調(diào)分
{
min++;
if(min>=60)
min=0;
}
if(Choice==3) //選擇變量3調(diào)秒
{
sec++;
if(sec>=60)
sec=0;
}
if(Choice4==1) //選擇變量1調(diào)時
{
hour4++;
if(hour4>=24)
hour4=0;
}
if(Choice4==2) //選擇變量2調(diào)分
{
min4++;
if(min4>=60)
min4=0;
}
}
count2=0; //count2清0
}
if(!K3)
{
count3++;
if(count3>=key_L) //長按
{
if(Choice==1) //選擇變量
{
hour--;
if(hour>=24)
hour=23;
}
if(Choice==2) //選擇變量
{
min--;
if(min>=60)
min=59;
}
if(Choice==3) //選擇變量
{
sec--;
if(sec>=60)
sec=59;
}
if(Choice4==1) //選擇變量
{
hour4--;
if(hour4>=24)
hour4=23;
}
if(Choice4==2) //選擇變量
{
min4--;
if(min4>=60)
min4=59;
}
count3=key_M;
}
}
else //按鍵抬起
{
if(count3>key_S && count3<key_L)//短按
{
if(Choice==1) //選擇變量
{
hour--;
if(hour>=24)
hour=23;
}
if(Choice==2) //選擇變量
{
min--;
if(min>=60)
min=59;
}
if(Choice==3) //選擇變量
{
sec--;
if(sec>=60)
sec=59;
}
if(Choice4==1) //選擇變量
{
hour4--;
if(hour4>=24)
hour4=23;
}
if(Choice4==2) //選擇變量
{
min4--;
if(min4>=60)
min4=59;
}
}
count3=0; //count3清0
}
if((!K4)&&(Choice==0)) //檢測按鍵4按下與不在調(diào)時狀態(tài)有效
{
count4++; //消抖計數(shù)1自+1
if((count4>=key_S)&&(key4_sign==0))//檢測消抖計數(shù)與按鍵1自鎖標志
{
key4_sign=1; //按鍵4自鎖標志置1
Choice4++; //調(diào)整選擇變量自+1
if(Choice4==1||Choice4==2)
ban=1;
else ban=0;
if(Choice4>=4) //調(diào)整鬧鐘時間選擇0鬧鐘關(guān)閉,1調(diào)時,2調(diào)分,3開啟鬧鐘
{
Choice4=0; //調(diào)整時間選擇清0
}
}
}
else
{
key4_sign=0; //按鍵4自鎖標志清0
count4=0; //消抖計數(shù)count1清0
}
}
/********************************
數(shù)碼管顯示程序
********************************/
void display()
{
static uchar num=0; //分時顯示變量
if((Choice4>0)&&(Choice4<3))//鬧鐘設(shè)置顯示部分
{
P0=0x00; //消隱
dula=1;
dula=0;
switch(num)
{
case 0:
P0=0x7e; //時十位位碼
wela=1;
wela=0;
P0=table[hour4/10]; //時十位段碼
dula=1;
dula=0;
num++;
break;
case 1:
P0=0x7d; //時個位位碼
wela=1;
wela=0;
if((Twinkle==1)&&(Choice4==1))//時點閃爍
P0=table[hour4%10];
else
P0=table[hour4%10]|0x80;//時個位段碼+點
dula=1;
dula=0;
num++;
break;
case 2:
P0=0x7b; //分十位位碼
wela=1;
wela=0;
P0=table[min4/10]; //分十位段碼
dula=1;
dula=0;
num++;
break;
case 3:
P0=0x77; //分個位位碼
wela=1;
wela=0;
if((Twinkle==1)&&(Choice4==2))//分點閃爍
P0=table[min4%10];
else
P0=table[min4%10]|0x80;//分個位段碼+點
dula=1;
dula=0;
num++;
break;
case 4:
P0=0xef; //秒十位位碼
wela=1;
wela=0;
P0=0x40; //秒十位段碼
dula=1;
dula=0;
num++;
break;
case 5:
P0=0xdf; //秒個位位碼
wela=1;
wela=0;
P0=0x40; //秒個位段碼
dula=1;
dula=0;
num=0;
break;
}
}
else //正常走時和調(diào)整時間顯示部分
{
P0=0x00; //消隱
dula=1;
dula=0;
switch(num)
{
case 0:
P0=0x7e; //時十位位碼
wela=1;
wela=0;
P0=table[hour/10]; //時十位段碼
dula=1;
dula=0;
num++;
break;
case 1:
P0=0x7d; //時個位位碼
wela=1;
wela=0;
if((Twinkle==1)&&(Choice==1))//時點閃爍
P0=table[hour%10];
else
P0=table[hour%10]|0x80;//時個位段碼+點
dula=1;
dula=0;
num++;
break;
case 2:
P0=0x7b; //分十位位碼
wela=1;
wela=0;
P0=table[min/10]; //分十位段碼
dula=1;
dula=0;
num++;
break;
case 3:
P0=0x77; //分個位位碼
wela=1;
wela=0;
if((Twinkle==1)&&(Choice==2))//分點閃爍
P0=table[min%10];
else
P0=table[min%10]|0x80;//分個位段碼+點
dula=1;
dula=0;
num++;
break;
case 4:
P0=0xef; //秒十位位碼
wela=1;
wela=0;
P0=table[sec/10]; //秒十位段碼
dula=1;
dula=0;
num++;
break;
case 5:
P0=0xdf; //秒個位位碼
wela=1;
wela=0;
if((Choice4==3)&&(Choice!=3))
P0=table[sec%10]|0x80;//鬧鐘啟動后秒個位+點
else if((Twinkle==1)&&(Choice==3))//秒點閃爍+點
P0=table[sec%10]|0x80;
else
P0=table[sec%10];//秒個位段碼
dula=1;
dula=0;
num=0;
break;
}
}
}
/********************************
鬧鐘程序
********************************/
void Buzzer_nz()
{
if((Choice4==3)&&(hour4==hour)&&(min4==min)&&(sec<30))
Buzzer_sign=1;
else Buzzer_sign=0;
if((second==1)&&(Buzzer_sign==1)) //計時周期1s
{
// TR1 = 1; //定時器1開,蜂鳴器響一下
B_sign=1;
second=0; //定時周期1s變量清0
}
}
/********************************
主程序
********************************/
void main(void)
{
Timer_Init(); //初始化定時器
allow=0; //關(guān)閉LED
while(1)
{
if(sec>=60) //如果秒>=60
{
sec=0; //秒清0
min++; //分自+1
if(min>=60) //分>=60
{
min=0; //分清0
hour++; //小時自+1
if(hour>=24) //小時>=24
hour=0; //小時清0
}
}
key_scan(); //按鍵掃描
display(); //顯示
Buzzer_nz(); //鬧鐘
}
}
/*-----------------------------
定時器0中斷服務(wù)程序 200微秒
------------------------------*/
void timer0() interrupt 1
{
static uint count3=0;
Cnt200us++; //時間變量Cnt200us自+1
if((Cnt200us>1250 && Cnt200us<2500)||(Cnt200us>3750 && Cnt200us<5000))//閃爍頻率2Hz
Twinkle=1; //閃爍標志
else Twinkle=0;
if(Cnt200us>=4991) //在此可以調(diào)整精度
{
Cnt200us=0; //變量Cnt200us清0
second=1;
if(Choice!=3) //調(diào)整選擇變量為3停止走秒
sec++; //秒自+1
}
if(B_sign==1)
{
Buzzer=~Buzzer;
count3++;
if(count3>=500) //0.1秒時間到500
{
count3=0; //計數(shù)清0
Buzzer=1; //蜂鳴器端口清0
B_sign=0; //蜂鳴器標志清0
}
}
}
/*-----------------------------
定時器1中斷服務(wù)程序 250微秒
(無源蜂鳴器驅(qū)動程序)
------------------------------*/
/*
void timer1() interrupt 3
{
static uint count3=0; //中斷計數(shù)變量
count3++; //中斷計數(shù)變量count3自+1
Buzzer=~Buzzer; //蜂鳴器端口取反
if(count3>=500) //0.1秒時間到500
{
count3=0; //計數(shù)清0
Buzzer=1; //蜂鳴器端口清0
TR1 = 0; //定時器1關(guān)閉
}
}*/
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1