找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2292|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

我想讓他循環(huán)點(diǎn)亮一次就行 然后 熄滅 不知道為什么就是熄滅不了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105616 發(fā)表于 2016-2-16 22:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

void delay(uint z){
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}
void main(){
   uchar i;
        for(i=0;i<8;i++){
                P1=P1<<1;
                delay(500);
                if(P1==0){
                        P1=0xff;
                                        }
        }
        }        
我想讓他循環(huán)點(diǎn)亮一次就行  然后 熄滅    不知道為什么就是熄滅不了
好假啊  那么大神幫我看下那里出錯(cuò)了  或者給個(gè)代碼   點(diǎn)亮一次然后熄滅就夠了

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:105616 發(fā)表于 2016-2-16 22:42 | 只看該作者
幾天前我都可以點(diǎn)亮完然后熄滅 不知道為什么 過幾天在做一個(gè)就不行了 想讓他點(diǎn)亮一次 然后就熄滅了 不知道  他為什么一直在循環(huán)點(diǎn)亮
回復(fù)

使用道具 舉報(bào)

板凳
ID:72781 發(fā)表于 2016-2-17 13:36 | 只看該作者
本帖最后由 暗光 于 2016-2-17 13:39 編輯

首先你要知道一點(diǎn),單片機(jī)的程序要有一個(gè)死循環(huán)!也就是進(jìn)入循環(huán)后就不再出來了,因?yàn)閱纹瑱C(jī)程序沒有結(jié)束,不能只運(yùn)行一下就結(jié)束什么都沒有了。據(jù)圖代碼如下,你感受一下
void main()
{
     uchar i;//進(jìn)入主函數(shù),定義變量,初始化各器件,或者執(zhí)行一下功能
     while(1)//進(jìn)入死循環(huán),一直運(yùn)行里面的東西不再出來,除非有中斷或者用goto語句(不推薦用goto語句)
     {
         for(i=0;i<8;i++)
         {
                P1=P1<<1;
                delay(500);
                if(P1==0)
               {
                    P1=0xff;
                }
        }
    }
}//總結(jié),你的程序因?yàn)闆]有死循環(huán)while(1),運(yùn)行一下后,程序結(jié)束,燈的狀態(tài)就不再改變,就是你看到的情況了。死循環(huán)還有for(;;)等方式
回復(fù)

使用道具 舉報(bào)

地板
ID:72781 發(fā)表于 2016-2-17 13:44 | 只看該作者
好吧,好像我回答的并不對(duì)癥,沒有仔細(xì)看問題和程序,第一眼望去就沒有while(1),你這個(gè)問題原因是沒有初始化P1口。然后沒有進(jìn)入死循環(huán),主函數(shù)運(yùn)行完會(huì)復(fù)位重新運(yùn)行,上面我的回答程序是循環(huán)點(diǎn)亮,下面是點(diǎn)亮一次:
void main()
{
     uchar i;
     P0=0xfe;
     for(i=0;i<8;i++)
    {
          P1=P1<<1;
          delay(500);
          if(P1==0)
          {
               P1=0xff;
          }
     }
    while(1);
}
回復(fù)

使用道具 舉報(bào)

5#
ID:105146 發(fā)表于 2016-2-18 01:01 | 只看該作者
樓主沒有看回帖嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:105616 發(fā)表于 2016-2-18 21:00 | 只看該作者
暗光 發(fā)表于 2016-2-17 13:44
好吧,好像我回答的并不對(duì)癥,沒有仔細(xì)看問題和程序,第一眼望去就沒有while(1),你這個(gè)問題原因是沒有初 ...

我的那個(gè)代碼是錯(cuò)在變量聲明  我變量聲明在void maim 里就是循環(huán)  變量聲明在void main 前面就是點(diǎn)亮依次
回復(fù)

使用道具 舉報(bào)

7#
ID:72781 發(fā)表于 2016-2-18 23:49 | 只看該作者
vip2428 發(fā)表于 2016-2-18 21:00
我的那個(gè)代碼是錯(cuò)在變量聲明  我變量聲明在void maim 里就是循環(huán)  變量聲明在void main 前面就是點(diǎn)亮依次

是的,main函數(shù)在單片機(jī)編譯中是個(gè)死循環(huán),main執(zhí)行玩了,會(huì)重新執(zhí)行main,就像復(fù)位一樣,所以加一個(gè)額外的死循環(huán)while(1),這樣就不用讓單片機(jī)重新運(yùn)行了,你設(shè)計(jì)的單片機(jī)產(chǎn)品不是用來反復(fù)重啟的,而是用來工作的。你把變量聲明在main里,每次執(zhí)行完都會(huì)把變量重新初始化,比如你的P1,每次都被初始化為0XFE,所以會(huì)循環(huán)點(diǎn)亮,這個(gè)循環(huán)不是你要的循環(huán),是單片機(jī)執(zhí)行完main重新開始了才循環(huán)的。如果你把變量聲明在外面,是全局變量,編譯器會(huì)分配一個(gè)字節(jié)保存這個(gè)變量的值,剛開始是0xfe,執(zhí)行一次是oxfc,最后變成了ox00,最后main執(zhí)行完,這個(gè)變量是不會(huì)被初始化的,所以下一次的P1初值是0x00.所以顯示是只亮一次
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表