欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機時鐘另類調時法 個十位分開調節
[打印本頁]
作者:
lids
時間:
2019-6-24 15:00
標題:
單片機時鐘另類調時法 個十位分開調節
仿真 實物都通過.stc89c52 11.0592MHz晶振 ;具體電路見仿真圖;仿真用5位數碼管顯示88-88的樣式
一個按鍵調節時間:
1.長按key1,進入調時狀態,小時十位開始閃爍,此時再短按key1,小時十位加加,
小時十位在0-2之間變化;(key1可以是按鈕,也可以用觸摸開關)
2.調好后,過5秒自動跳到小時個位閃爍,此時再短按key1,小時個位加加,如果十位是0、1,
小時個位再0-9之間變化;如果十位是2,小時個位在0-3之間變化;
3.小時個位調好后,過5秒,分鐘十位開始閃爍,此時再短按key1,分鐘十位加加,分鐘十位在0-5
之間變化;
4.分鐘十位調好后,過5秒,分鐘個位開始閃爍,此時再短按key1,分鐘個位加加,分鐘個位在0-9
之間變化;
5.分鐘個位調好后,過5秒,退出調時狀態,時鐘正常走時。
在非調時狀態,短按key1,開關LED燈;
小時 、分鐘的個位、十位分開調節,這樣比常規的個位、十位在一起調時快;
QQ截圖20190624145700.jpg
(154.21 KB, 下載次數: 59)
下載附件
2019-6-24 15:00 上傳
單片機源程序如下:
/*********************************************************************************
仿真 實物都通過.stc89c52 11.0592MHz晶振 ;具體電路見仿真圖;仿真用5位數碼管顯示88-88的樣式
一個按鍵調節時間:
1.長按key1,進入調時狀態,小時十位開始閃爍,此時再短按key1,小時十位加加,
小時十位在0-2之間變化;(key1可以是按鈕,也可以用觸摸開關)
2.調好后,過5秒自動跳到小時個位閃爍,此時再短按key1,小時個位加加,如果十位是0、1,
小時個位再0-9之間變化;如果十位是2,小時個位在0-3之間變化;
3.小時個位調好后,過5秒,分鐘十位開始閃爍,此時再短按key1,分鐘十位加加,分鐘十位在0-5
之間變化;
4.分鐘十位調好后,過5秒,分鐘個位開始閃爍,此時再短按key1,分鐘個位加加,分鐘個位在0-9
之間變化;
5.分鐘個位調好后,過5秒,退出調時狀態,時鐘正常走時。
在非調時狀態,短按key1,開關LED燈;
小時 、分鐘的個位、十位分開調節,這樣比常規的個位、十位在一起調時快;
**********************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sclk = P1^0;
sbit dio = P1^1;
sbit ce = P1^2;
sbit wela = P2^7;
sbit dula = P2^6;
sbit led = P1^7;
sbit key1=P3^0; //按鍵 多功能
uchar knum=0,ssnum,fsnum,sgnum,fgnum; //調時 位 閃爍變量
uchar shi,fen,miao;
uchar ss; //秒點閃爍變量
bit zdyw; //自動移位標志
uchar count;//自動移位時間計數變量
/***********寫時分秒地址************/
#define write_shi 0x84
#define write_fen 0x82
#define write_miao 0x80
#define write_ram 0xc0
/***********讀時分秒地址************/
#define read_shi 0x85
#define read_fen 0x83
#define read_miao 0x81
#define read_ram 0xc1
// 0 1 2 3 4 5 6 7 8 9
uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; //共陰不帶小數點
uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 共陰帶小數點
//uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共陽帶小數點
//uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //共陽不帶小數點
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void t0_init() //定時50ms中斷
{
TMOD=0X01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
ET1=1;
}
void display(uchar shi,uchar fen) //顯示函數
{
if(knum==0)
{
ssnum=30;
fsnum=30;
sgnum=30;
fgnum=30;
}
if(knum==3)
{
fsnum++;
ssnum=30;
fgnum=30;
sgnum=30;
}
if(knum==4)
{
fgnum++;
ssnum=30;
fsnum=30;
sgnum=30;
}
if(knum==1)
{
ssnum++;
sgnum=30;
fgnum=30;
fsnum=30;
}
if(knum==2)
{
sgnum++;
ssnum=30;
fsnum=30;
fgnum=30;
}
if(ssnum>=30)
{
// if((shi/10)<1) //如果小時十位小于1,
// {
// wela=1;
// P0=0xfe; //第1位
// wela=0;
//
// dula = 1;
// P0=0xff; // 小時十位就不顯示
// dula = 0;
// }
//
// else
{
wela=1;
P0=0xfe; //第1位
wela=0;
dula=1;
P0=d[shi/10];
dula=0;
P0=0xff;
delay(2);
}
if(ssnum==60)
ssnum=0;
}
if(sgnum>=30)
{
wela=1;
P0=0xfd; //第2位
wela=0;
dula=1;
P0=d[shi%10]; //時的個位,P0=d[shi%10]時的個位小數點閃爍
dula=0; // 時的個位,P0=dd[shi%10]時的個位小數點不閃爍
P0=0xff;
delay(2);
if(sgnum==60)
sgnum=0;
}
// if(miao%2==0) //if(miao%2==0) 1秒閃爍1次
if(ss>=10) // 這里寫為ss>=10,閃爍頻率可調
{
wela=1;
P0=0xfb; //第3位
wela=0;
dula=1;
P0=0x40; //第三位數碼管顯示“— ”
// P0=0x09; //第三位數碼管顯示“= ”
dula=0;
P0=0xff;
delay(2);
}
else
{
wela=1;
P0=0xfb; //第3位
wela=0;
dula=1;
P0=0; //第三位數碼管不顯示
dula=0;
P0=0xff;
delay(2);
}
if(fsnum>=30)
{
wela=1;
P0=0xf7; //第4位
wela=0;
dula=1;
P0=d[fen/10];
dula=0;
P0=0xff;
delay(2);
// wela=1;
// P0=0xef; //第5位
// wela=0;
//
// dula=1;
// P0=d[fen%10];
// dula=0;
// P0=0xff;
// delay(2);
if(fsnum==60)
fsnum=0;
}
if(fgnum>=30)
{
wela=1;
P0=0xef; //第5位
wela=0;
dula=1;
P0=d[fen%10];
dula=0;
P0=0xff;
delay(2);
if(fgnum==60)
fgnum=0;
}
// if(miao%2==0) //if(miao%2==0) 1秒閃爍1次
// if(ss>=10) //if(ss>=10)閃爍頻率可調
// {
// wela=1;
// P0=0xdf; //第6位
// wela=0;
// dula=1;
// P0=0x40; //第六位數碼管顯示“— ”
// dula=0;
// P0=0xff;
//
// delay(2);
// }
//
// else
// {
// wela=1;
// P0=0xdf; //第6位
// wela=0;
// dula=1;
// P0=0; //第六位數碼管不顯示
// dula=0;
// P0=0xff;
//
// delay(2);
// }
//
//
// wela=1;
// P0=0xbf; //第7位
// wela=0;
//
// dula=1;
// P0=d[miao/10]; //秒十位
// dula=0;
// P0=0xff;
// delay(2);
//
//
// wela=1;
// P0=0x7f; //第8位
// wela=0;
//
// dula=1;
// P0=d[miao%10]; //秒個位
// dula=0;
// P0=0xff;
// delay(2);
}
void write_1302(uchar add,dat) //寫1302函數 qx
{
uchar i,temp;
temp=add;
ce=0;
_nop_();
sclk=0;
_nop_();
ce=1;
_nop_();
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if((temp&0x01)==0x01)
dio=1;
else
dio=0;
temp>>=1;
sclk=1;
_nop_();
}
temp=dat;
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if((temp&0x01)==0x01)
dio=1;
else
dio=0;
temp>>=1;
sclk=1;
_nop_();
}
ce=0;
sclk=0;
}
uchar read_1302(uchar add) //讀1302函數 qx
{
uchar dat,dat1,i,temp;
temp=add;
ce=0;
_nop_();
sclk=0;
_nop_();
ce=1;
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if((temp&0x01)==0x01)
dio=1;
else
dio=0;
temp>>=1;
sclk=1;
_nop_();
}
for(i=0;i<8;i++)
{
sclk=0;
_nop_();
if(dio)
dat|=0x80;
if(i<7)
dat>>=1;
sclk=1;
}
dat1=dat/16; //讀出的數值轉為10進制
dat=dat%16;
dat=dat1*10+dat;
ce=0;
sclk=0;
return dat;
}
void init_1302() //初始化函數 設置第一次上電時顯示的時間值
{
write_1302(0x8e,0x00); //保護取消,可以進行寫操作
write_1302(write_miao,0x57); //寫秒57
write_1302(write_fen,0x30); //寫分30
write_1302(write_shi,0x12); //寫時12
write_1302(0x8e,0x80); //保護啟動,不能進行寫操作
}
void read_sf() //讀時分秒
{
shi=read_1302(read_shi);
fen=read_1302(read_fen);
miao=read_1302(read_miao);
display(shi,fen);
}
void keyscan() //按鍵掃描函數
{
uchar fs,fg,shs,shg; //分鐘十位、個位 ,小時十位、個位
static uint a; //按鍵延時變量
fs = fen/10; fg=fen%10; //分鐘十位、個位
shs = shi/10; shg=shi%10; //小時十位、個位
if(key1==0)
{
a++;
if(a>50)
while(!key1)
{
display(shi,fen);
a=0;
zdyw=1;
}
}
else
{
if(a>10 && a<50)
{
count=0; //每次按下,count都要清零,松手后,count都是從0開始計數,這句很重要
a=0;
if(knum==1) //小時十位調節
{
shs++;
if(shs>2) shs=0;
shi=shs*16+shg;
write_1302(write_shi,shi); //寫入1302
read_sf(); //讀出時間,然后顯示
}
/*********************/
if(knum==2) //小時個位調節
{
shg++;
if(shs==0 || shs==1) //如果小時十位為0、1
{
if(shg>9) shg=0; //小時個位可以在0-9變化
}
else //否則,小時個位可以在0-3變化
{
if(shg>3) shg=0;
}
shi=shs*16+shg; //10進制轉為16進制
write_1302(write_shi,shi); //寫入1302
read_sf(); //讀出時間,然后顯示
}
/************************/
if(knum==3) //分鐘十位調節
{
fs++;
if(fs>5) fs=0;
fen=fs*16+fg;
write_1302(write_fen,fen); //寫入1302
read_sf(); //讀出時間,然后顯示
}
/*******************/
if(knum==4) //分鐘個位調節
{
fg++;
if(fg>9) fg=0;
fen=fs*16+fg;
write_1302(write_fen,fen); //寫入1302
read_sf(); //讀出時間,然后顯示
}
/***********************/
if(knum==0) //非調時狀態,短按key1,開關LED
{
led=~led;
}
}
}
}
/************************/
void main()
{
t0_init();
init_1302();
while(1)
{
read_sf();
keyscan();
}
}
void temer1() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
ss++;
if(ss==20) //1秒時間到
{
ss=0;
if(zdyw)
{
count++;
if(count==5) //調時的時候,自動移位快慢調這里,要快就把count的值減小,反之亦然。
{
count=0;
knum++;
if(knum==1)
{
write_1302(0x8e,0x00); //寫保護取消
// write_1302(write_miao,0x80); // 寫秒80,時鐘停止走時;
}
if(knum>4)
{
knum=0;
zdyw=0;
write_1302(write_miao,0x00);
write_1302(0x8e,0x80); //寫保護啟動
}
}
}
}
}
復制代碼
全部資料51hei下載地址:
時鐘個十位分開調節 -1鍵調節.rar
(181.79 KB, 下載次數: 15)
2019-6-24 15:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
我愛學習1024
時間:
2020-6-3 12:12
膜拜大佬
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1