久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

新人課程設計。單片機電子時鐘問題。

查看數: 3271 | 評論數: 8 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2018-6-9 21:13

正文摘要:

本來已經完成了但是又加上一條串口直接設置定時時間,并實時顯示剩余時間。理論本來就沒弄太懂,跌跌撞撞完成了。但是加上又難弄了。 在這個的基礎上可以修改嗎?   3.1口修改時分秒,dp是選 ...

回復

ID:324844 發表于 2018-6-27 11:08
加P3^4一個按鍵定義為k2,該按鍵鎖死則開始從當前時間倒計時,釋放則恢復正常時鐘。可以先用你的k1,中斷0和1進行設置定時時間,再鎖死,也可以鎖死再實時設置
#include<reg51.h>

#define uchar unsigned char//宏替換

#define uint  unsigned int

sbit k1=P3^1;             //第一個按鍵,選擇設置
sbit k2=P3^4;
bit c;
uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數碼管段碼表(0-9,-)

uchar disbuf[8];         //聲明顯示緩沖區8個單元
uchar hour=12;          //聲明小時變量,初值為12

uchar minute=59;        //聲明分變量,初值為59

uchar second;           //聲明秒變量

uchar t0n;              //定時器T0中斷計數,定時50ms,中斷20次為1秒

uchar dis;             //調時狀態下,顯示小數點位

void delay()          //延時子程序,用于顯示子程序

{

uint j;

for(j=300;j>0;j--);

}

                      //顯示子程序,參數dis為顯示小數點位

void display(uchar dis) // ????????????????????????????

{

uchar j,disbit=0x01;  //位碼(未知)

for(j=0;j<8;j++)

{

P2=~disbit;       //P2口輸出位碼

if(dis>0&&dis==j) //調時狀態下,顯示小數點(看不懂)

P0=distab[disbuf[j]]+0x80; //在小時,分,秒位上顯示小數點

else

P0=distab[disbuf[j]]; //其它位正常顯示

disbit<<=1;           //取下一個位碼

delay();              //延時

}

}

void main()//主函數

{

disbuf[2]=disbuf[5]=10;//數碼管第3,6位顯示-

TMOD=0x01;  //t0定時器方式1

TH0 =0x3C;    //單片機晶振頻率=12M,定時50ms,時間常數=3CB0

TL0 =0xB0;

IE  =0x82;    //開定時器T0中斷(EX1外部中斷1沒開)

TR0 =1;       //啟動定時器T0

IT0 =1;       //設置外部中斷為下降沿有效

IT1 =1;

while(1)

{

display(dis); //調顯示子程序(未知)

if(k1==0)     //選擇設置

{

dis++;    //停止計時,進入調時狀態(暫停了秒計時)

EX0=1;    //調時狀態下,允許外部INT0,INT1中斷

EX1=1;    //用來調小時,分,秒

if(dis>7) //調小時,在小時位顯示小數點

{

dis=0; //滅小數點

t0n=0; //調時結束,開始計時

TR0=1;

EX0=0; //關外部中斷

EX1=0;

}

else if(dis==2)dis=4; //調分,在分位顯示小數點

else if(dis==5)dis=7; //調秒,在秒位顯示小數點

while(k1==0)display(dis); //等待按鍵釋放

}
//這里做改動
if(c==0);
{
if(t0n>=20&&dis==0) //中斷20次,1秒到,計時狀態下時鐘計時

{

t0n=0;

second++;      //秒加1

if(second>=60) //到60秒

{

second=0;

minute++;      //分加1

if(minute>=60) //到60分

{

minute=0;

hour++;    //小時加1

if(hour>=24)

hour=0;

}

}
}
}
if(k2==0)
{
c=~c;
ET0=~ET0;
while(k1==0)display(dis);
}
if(c==1)
{

second--;      //秒加1

if(second==0xff) //到60秒

{

second=59;

minute--;      //分加1

if(minute==0xff) //到60分

{

minute=59;

hour--;    //小時加1

if(hour==0xff)

hour=23;

}
}
}


disbuf[0]=hour/10;    //顯示小時十位

disbuf[1]=hour%10;    //顯示小時個位

disbuf[3]=minute/10;  //顯示分十位

disbuf[4]=minute%10;  //顯示分個位

disbuf[6]=second/10;  //顯示秒十位

disbuf[7]=second%10;  //顯示秒個位

}

}

//定時器T0中斷服務子程序

void T0_isr() interrupt 1

{

TH0=0x3C;  //重寫時間常數

TL0=0xb0;

t0n++;     //中斷次加1

}

//外部中斷INT0服務程序,調時狀態下,加1

void INT0_ISR() interrupt 0

{

if(dis==1)     //調小時

{

hour++;    //小時加1

if(hour>=24)

hour=0;

}

if(dis==4)     //調分

{

minute++;  //分加1

if(minute>=60)

minute=0;

}

if(dis==7)     //調秒

{

second++;  //秒加1

if(second>=60)

second=0;

}

}

//外部中斷INT1服務程序,調時狀態下,減1

void INT1_ISR() interrupt 2

{

if(dis==1)   //調小時

{

hour--;  //小時減1

if(hour==0xff)

hour=23;

}

if(dis==4)    //調分

{

minute--; //分減1

if(minute==0xff)

minute=59;

}

if(dis==7)   //調秒

{

second--;//秒減1

if(second==0xff)

second=59;

}

}

]4FU{4{@BOYR16ES6]9K_US.png (242.02 KB, 下載次數: 49)

]4FU{4{@BOYR16ES6]9K_US.png

時鐘.rar

18.3 KB, 下載次數: 4

ID:324844 發表于 2018-6-27 09:32
在P3^4上加上一個按鍵命名為k2,k2鎖死就會自動倒計時,k2打開就恢復,可以直接先用你的k1中斷0中斷1設置時間再鎖死k2,也可以先鎖死再用你的k1和中斷0中斷1調整
#include<reg51.h>

#define uchar unsigned char//宏替換

#define uint  unsigned int

sbit k1=P3^1;             //第一個按鍵,選擇設置
sbit k2=P3^4;
bit c;
uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數碼管段碼表(0-9,-)

uchar disbuf[8];         //聲明顯示緩沖區8個單元
uchar hour=12;          //聲明小時變量,初值為12

uchar minute=59;        //聲明分變量,初值為59

uchar second;           //聲明秒變量

uchar t0n;              //定時器T0中斷計數,定時50ms,中斷20次為1秒

uchar dis;             //調時狀態下,顯示小數點位

void delay()          //延時子程序,用于顯示子程序

{

uint j;

for(j=300;j>0;j--);

}

                      //顯示子程序,參數dis為顯示小數點位

void display(uchar dis) // ????????????????????????????

{

uchar j,disbit=0x01;  //位碼(未知)

for(j=0;j<8;j++)

{

P2=~disbit;       //P2口輸出位碼

if(dis>0&&dis==j) //調時狀態下,顯示小數點(看不懂)

P0=distab[disbuf[j]]+0x80; //在小時,分,秒位上顯示小數點

else

P0=distab[disbuf[j]]; //其它位正常顯示

disbit<<=1;           //取下一個位碼

delay();              //延時

}

}

void main()//主函數

{

disbuf[2]=disbuf[5]=10;//數碼管第3,6位顯示-

TMOD=0x01;  //t0定時器方式1

TH0 =0x3C;    //單片機晶振頻率=12M,定時50ms,時間常數=3CB0

TL0 =0xB0;

IE  =0x82;    //開定時器T0中斷(EX1外部中斷1沒開)

TR0 =1;       //啟動定時器T0

IT0 =1;       //設置外部中斷為下降沿有效

IT1 =1;

while(1)

{

display(dis); //調顯示子程序(未知)

if(k1==0)     //選擇設置

{

dis++;    //停止計時,進入調時狀態(暫停了秒計時)

EX0=1;    //調時狀態下,允許外部INT0,INT1中斷

EX1=1;    //用來調小時,分,秒

if(dis>7) //調小時,在小時位顯示小數點

{

dis=0; //滅小數點

t0n=0; //調時結束,開始計時

TR0=1;

EX0=0; //關外部中斷

EX1=0;

}

else if(dis==2)dis=4; //調分,在分位顯示小數點

else if(dis==5)dis=7; //調秒,在秒位顯示小數點

while(k1==0)display(dis); //等待按鍵釋放

}
//這里做改動
if(c==0);
{
if(t0n>=20&&dis==0) //中斷20次,1秒到,計時狀態下時鐘計時

{

t0n=0;

second++;      //秒加1

if(second>=60) //到60秒

{

second=0;

minute++;      //分加1

if(minute>=60) //到60分

{

minute=0;

hour++;    //小時加1

if(hour>=24)

hour=0;

}

}
}
}
if(k2==0)
{
c=~c;
ET0=~ET0;
while(k1==0)display(dis);
}
if(c==1)
{

second--;      //秒加1

if(second==0xff) //到60秒

{

second=59;

minute--;      //分加1

if(minute==0xff) //到60分

{

minute=59;

hour--;    //小時加1

if(hour==0xff)

hour=23;

}
}
}


disbuf[0]=hour/10;    //顯示小時十位

disbuf[1]=hour%10;    //顯示小時個位

disbuf[3]=minute/10;  //顯示分十位

disbuf[4]=minute%10;  //顯示分個位

disbuf[6]=second/10;  //顯示秒十位

disbuf[7]=second%10;  //顯示秒個位

}

}

//定時器T0中斷服務子程序

void T0_isr() interrupt 1

{

TH0=0x3C;  //重寫時間常數

TL0=0xb0;

t0n++;     //中斷次加1

}

//外部中斷INT0服務程序,調時狀態下,加1

void INT0_ISR() interrupt 0

{

if(dis==1)     //調小時

{

hour++;    //小時加1

if(hour>=24)

hour=0;

}

if(dis==4)     //調分

{

minute++;  //分加1

if(minute>=60)

minute=0;

}

if(dis==7)     //調秒

{

second++;  //秒加1

if(second>=60)

second=0;

}

}

//外部中斷INT1服務程序,調時狀態下,減1

void INT1_ISR() interrupt 2

{

if(dis==1)   //調小時

{

hour--;  //小時減1

if(hour==0xff)

hour=23;

}

if(dis==4)    //調分

{

minute--; //分減1

if(minute==0xff)

minute=59;

}

if(dis==7)   //調秒

{

second--;//秒減1

if(second==0xff)

second=59;

}

}

]4FU{4{@BOYR16ES6]9K_US.png (242.02 KB, 下載次數: 54)

]4FU{4{@BOYR16ES6]9K_US.png

時鐘.rar

18.3 KB, 下載次數: 4

ID:351040 發表于 2018-6-13 17:30
多加一個顯示倒計時
ID:193818 發表于 2018-6-13 14:17
1.我先提一點,樓主應該不打算做實物吧?因為做實物的畫,你的數碼管驅動電路需要重新設計下。
2.你現在是一般時鐘,需要外加一個功能,我不清楚你說的串口是啥。姑且認為你是說按鍵,通過按鍵切換到這個模式,然后設計相應位置,再確定。這里應該還需要一個中斷,然后用另一個定時器。當中斷觸發時數碼管顯示倒計時模式,然后你設置運行,當倒計時結束后,中斷結束返回時鐘畫面。個人愚見

評分

參與人數 1黑幣 +8 收起 理由
hedianzi + 8 絕世好帖!

查看全部評分

ID:336165 發表于 2018-6-13 13:43
你這個的具體功能是什么
ID:348416 發表于 2018-6-10 16:46
jizi 發表于 2018-6-10 14:38
串口是什么串口是通訊還是什么?
你要的是倒計時在數碼管上顯示嗎?
還是增加多一個模式?

多加一個模式,在數碼管顯示倒計時。  倒計時時間可以設置的。
ID:272269 發表于 2018-6-10 14:38
串口是什么串口是通訊還是什么?
你要的是倒計時在數碼管上顯示嗎?
還是增加多一個模式?
ID:303383 發表于 2018-6-9 22:56
提示: 作者被禁止或刪除 內容自動屏蔽

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜ww| 一区二区在线 | 日韩精品久久 | 伊人春色成人网 | 国产免费一区二区 | 成人深夜福利网站 | 亚洲精品一 | 日日想夜夜操 | 国产精品99久久久久久宅男 | 91精品国产色综合久久不卡98口 | 欧美日韩在线播放 | 精品一区免费 | 日韩第一区 | 久久在线免费 | 免费观看www7722午夜电影 | 亚洲精品美女 | 欧美xxxx性 | 91网在线播放 | 色综合一区二区三区 | 97精品国产97久久久久久免费 | 国产91 在线播放 | 国产一区二区三区在线 | 黄网站免费入口 | 国产精品色 | 羞羞视频一区二区 | 五月婷婷导航 | 久久久久久久久久毛片 | 网站黄色在线免费观看 | www.玖玖玖| 91在线视频在线观看 | www.亚洲精品| 国产日韩欧美激情 | 欧美涩| 精品视频在线播放 | 一级毛片视频免费观看 | 日本电影韩国电影免费观看 | 欧美影院 | 久久久久国产一区二区三区四区 | 久久成人免费 | 亚洲精品久久久久久久久久久久久 | 中文字幕亚洲区 |