欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
自學(xué)15天的初級菜鳥用if和while語句寫了可以用按鍵設(shè)置時間的倒計時程序
[打印本頁]
作者:
elise
時間:
2017-5-19 13:28
標(biāo)題:
自學(xué)15天的初級菜鳥用if和while語句寫了可以用按鍵設(shè)置時間的倒計時程序
本帖最后由 elise 于 2017-5-23 10:19 編輯
或許接觸電子器件比較早,對電子器件十分的熱愛,但一直都是定位在興趣愛好里。和工作一點關(guān)系都沒有。自己從事的是汽車的裝潢改裝工作。
為了增加自己的改裝能力,我發(fā)現(xiàn)我有必要去學(xué)習(xí)單片機,但是年紀(jì)已經(jīng)不小了,30多歲了又是0基礎(chǔ)。又沒有時間去專業(yè)的機構(gòu)學(xué)習(xí)。于是就此開始自學(xué)。買了2手的51單片機學(xué)習(xí)板,開始一邊看視頻一邊琢磨研究。
前些天寫了一個在軟件中設(shè)置時間的倒計時程序,寫完之后一直在研究如何用按鍵來設(shè)置定時時間。
今天早上終于寫出來測試通過啦。
來跟大家分享喜悅的心情,同時帖上程序。忘高手指點一二。
因為是初學(xué)者,很多語句都不會用,所以就硬生生的用if和while語句把程序?qū)懴聛砹恕?br /> 程序可能寫的有點亂。我加點注釋讓大家看明白點。
/*這個程序?qū)ξ襾碚f已經(jīng)很不容易了,寫寫改改,可能對高手來說實在是太簡單,程序運行中有以下問題:第一,當(dāng)設(shè)置時間的按鍵暗下去的同時,原先顯示的0000中前3位數(shù)會滅掉,按鍵松掉之后才會顯示。第二,設(shè)置秒的時候,我只寫了秒的十位數(shù)的設(shè)置,個位數(shù)沒有設(shè)置,一是覺得必要性不大,但是在特殊的情況下需要用到的話還是可以加語句來實現(xiàn)的。第三,進入到聲光提示的時候,如果需要退出提示恢復(fù)初始值,按鍵需要長按*/
今天花了點時間修改了下程序,現(xiàn)在按鍵的時候不會有閃爍了,聲光提示的時候也不需要長按了,按一下就能退出。
而且在設(shè)置的時候,短按一下S2是時間加一,按住的話數(shù)字會快速增加。S3和S4也是一樣的效果。提高設(shè)定時間的效率。
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit dx=P2^6;
sbit wx=P2^7;
sbit beep=P2^3;
sbit s2=P3^4;
sbit s3=P3^5;
sbit s4=P3^6;
sbit s5=P3^7;
uchar c,d,e,f,g,h,i,tt;
uint x,y,num;
void delay(x);
void init();
void display(num);
void main()
{
init();
while(h)
{
if(s2==0)
{
for(y=15;y>0;y--)
{
display(num);
}
if(s2==0)
d++;
display(num);
}
if(d==10)
{
d=0;
c++;
if(c==10)
c=0;
}
if(s3==0)
{
for(y=15;y>0;y--)
{
display(num);
}
if(s3==0)
d--;
display(num);
}
if(d==255)
{
d=9;
c--;
if(c==255)
c=9;
}
if(s4==0)
{
for(y=15;y>0;y--)
{
display(num);
}
if(s4==0)
e++;
display(num);
}
if(e==6)
{
e=0;
}
if((s5==0)&&(c+d+e+f!=0))
{
for(y=7;y>0;y--)
{
display(num);
}
if((s5==0)&&(c+d+e+f!=0))
g=1;
h=0;
while(!s5)
{
display(num);
}
}
display(num);
}
while(g)
{
if(s5==0)
{
for(y=15;y>0;y--)
{
display(num);
}
if(s5==0)
g=0;
h=1;
}
TR0=g;
display(num);
if(tt==20)
{
tt=0;
f--;
if(f==255)
{
f=9;
e--;
}
if(e==255)
{
e=5;
}
if((e==5)&&(f==9))
{
d--;
}
if(d==255)
{
d=9;
c--;
}
if((c==0)&&(d==0)&&(e==0)&&(f==0))
{
g=0;
i=1;
}
}
}
while(i)
{
P0=0xc3;
wx=1;
wx=0;
P0=0x3f;
dx=1;
beep=0;
for(y=7000;y>0;y--)
{
if(s5==0)
{
delay(8000);
if(s5==0)
g=0;
h=1;
i=0;
while(!s5);
}
}
beep=1;
for(y=7000;y>0;y--)
{
if(s5==0)
{
delay(8000);
if(s5==0)
g=0;
h=1;
i=0;
while(!s5);
}
}
beep=0;
for(y=7000;y>0;y--)
{
if(s5==0)
{
delay(8000);
if(s5==0)
g=0;
h=1;
i=0;
while(!s5);
}
}
beep=1;
P0=0x00;
dx=0;
for(y=40000;y>0;y--)
{
if(s5==0)
{
delay(8000);
if(s5==0)
g=0;
h=1;
i=0;
while(!s5);
}
}
}
}
void delay(x)
{
while(x--);
}
void init()
{
TMOD=0X01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
c=0;
d=0;
e=0;
f=0;
i=0;
num=1000*c+100*d+10*e+d;
g=0;
h=1;
}
void display(num)
{
P0=0xfb;
wx=1;
wx=0;
P0=table[c];
dx=1;
dx=0;
delay(100);
P0=0xf7;
wx=1;
wx=0;
P0=table[d];
dx=1;
dx=0;
delay(100);
P0=0xef;
wx=1;
wx=0;
P0=table[e];
dx=1;
dx=0;
delay(100);
P0=0xdf;
wx=1;
wx=0;
P0=table[f];
dx=1;
dx=0;
delay(100);
}
void timer() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
tt++;
}
作者:
elise
時間:
2017-5-19 13:46
哦,,忘了說明一下,我的學(xué)習(xí)板晶振是11.0592M的,如果晶振是12M的,那么程序里TH0和TL0里面的46080就需要改為50000.
作者:
elise
時間:
2017-5-19 21:13
后來我又做了一次測試,用手機計時和軟件計時,計時時間為99分鐘,到最后結(jié)束的時候,誤差為1秒左右,軟件計時慢了一秒左右。這個是不是可以理解為每一次中斷循環(huán)中產(chǎn)生的時間差的累計?
作者:
admin
時間:
2017-5-21 01:51
elise 發(fā)表于 2017-5-19 21:13
后來我又做了一次測試,用手機計時和軟件計時,計時時間為99分鐘,到最后結(jié)束的時候,誤差為1秒左右,軟件 ...
樓主如果是每一次都是慢了一秒,肯定是由于晶振不準(zhǔn)等問題導(dǎo)致的,可以考慮在代碼中將此誤差修正,參考資料:
http://www.raoushi.com/bbs/dpj-56167-1.html
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1