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

QQ登錄

只需一步,快速開始

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

求助:該程序第89句被卡住,不能通過(guò),又不明白原因

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 tieq1952 于 2023-1-7 08:27 編輯

該程序是一本教材中關(guān)于數(shù)碼管的程序。在Keil中,第89句無(wú)論如何都通不過(guò),錯(cuò)誤提示為“void"附近語(yǔ)法錯(cuò)誤。第89句為一T/C0定時(shí)函數(shù),程序如下:
89  void TimerInit(void)90  {
91       TH0=(65536-5000)/256;
92       TL0=(65536-5000)%256;       //定時(shí)5ms
93       TMOD=0x01;                  //T/C0 模式1
94  }

全部程序如下 :


#include <reg52.h>
sbit        P0_4=0x84;       //P0.4位地址84H
sbit        P0_5=0x85;       //P0.5位地址85H
/****************************************
*          大量宏定義,便于代碼移植和閱讀     *
*****************************************/

#define HIGH        1                    //定義HIGH為高電平
#define LOW        0                    //定義LOW為低電平
#define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;}
#define LS164_CLK(x)  {if((x))P0_5=1;else P0_5=0;}
#define SEG_PORT      P0          //控制數(shù)碼管字型碼端口
unsigned char        Timer0lRQEvent=0;   //T/CO 中斷事件
unsigned char        TimelSecEvent=0;    //定時(shí) 1 秒事件
unsigned int TimeCount=0;              //時(shí)間計(jì)數(shù)值
unsigned char        SegCurPosition=0;   //當(dāng)前點(diǎn)亮的數(shù)碼管

//為了驗(yàn)證共陽(yáng)極的字型碼是共陰極的反碼,共陽(yáng)極字型碼為共陰極的反碼
//共陽(yáng)極字型碼存儲(chǔ)在代碼區(qū),用關(guān)鍵字“code”聲明
code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F};

//片選數(shù)碼管數(shù)組,存儲(chǔ)在代碼區(qū),用關(guān)鍵字"code"聲明
code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};

//數(shù)碼管顯示數(shù)據(jù)緩沖區(qū)
unsigned char SegBuf [4] ={0};

/**********************************************
*函數(shù)名稱:LS164Send
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:74LS164發(fā)送單個(gè)字節(jié)
**********************************************/

void LS164Send(unsigned char byte)
{
    unsigned char j ;
    for (j=0;j<=7;j++)           //對(duì)輸入數(shù)據(jù)進(jìn)行移位檢測(cè)
    {
        if(byte&(1<<(7-j)))      //檢測(cè)字節(jié)當(dāng)前位
        {
            LS164_DATA(HIGH);    //串行數(shù)據(jù)輸入引腳為高電平
        }
        else
        {
            LS164_DATA(LOW);     //串行數(shù)據(jù)輸入引腳為低電平
        }
        LS164_CLK(LOW);          //同步時(shí)鐘輸入端以一個(gè)上升沿結(jié)束確定該位的值
        LS164_CLK(HIGH);
    }
}
/**********************************************
*函數(shù)名稱:SegRef reshDisplayBuf
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:數(shù)碼管刷新顯示緩存
**********************************************/
void SegRefreshDisplayBuf(void)
{
    SegBuf[0]=TimeCount%10;                      //個(gè)位
    SegBuf[1]=TimeCount/10%10;           //十位
    SegBuf[2]=TimeCount/100%10;          //百位   
    SegBuf[3]=TimeCount/1000%10;         //千位
}
/***********************************************
*函數(shù)名稱:SegDisplay
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:數(shù)碼管顯示數(shù)據(jù)
***********************************************/

void SegDisplay(void)
{
    unsigned char t;
    SEG_PORT=0x0F;                         //熄滅所有數(shù)碼管
    t=SegCode[SegBuf[ SegCurPosition]];    //確定當(dāng)前的字型碼
    LS164Send(t);
    SEG_PORT=SegPosition[SegCurPosition];  //選中一個(gè)數(shù)碼管來(lái)系顯示
    if(++SegCurPosition>=4)                //下次要點(diǎn)亮的數(shù)碼管
    {
        SegCurPosition=0;
    }
/***********************************************
*函數(shù)名稱:TimerInit
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:T/C初始化
***********************************************/
void TimerInit(void)
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;       //定時(shí)5ms
TMOD=0x01;                  //T/C0 模式1
}
/                void TimerInit(void)
{
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;       //定時(shí)5ms
    TMOD=0x01;                  //T/C0 模式1
}/
/***********************************************
函數(shù)名稱:Timer0Start
*輸   入:無(wú)
*輸   出:無(wú)
*功   能:T/C0啟動(dòng)
***********************************************/
void Timer0Start(void)
{
    TR0=1;
    ET0=1;
}
/***********************************************
*函數(shù)名稱:PortInit
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:I/O口初始化
***********************************************/
void PortInit(void)
{
    P0=Pl=P2=P3=0xFF;
}
/***********************************************
*函數(shù)名稱:main
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:函數(shù)主體
***********************************************/
void main(void)
{
    PortInit();
    TimerInit();
    Timer0Start();
    SegRefreshDisplayBuf();
    EA=1;
    while(1)
    {
        if(Timer0lRQEvent)                    //檢測(cè)定時(shí)中斷事件是否產(chǎn)生
        {  
            Timer0IRQEvent=0;
            if(TimelSecEvent)             //檢測(cè)1秒事件是否產(chǎn)生
            {
                TimelSecEvent=0;
                if(++TimeCount>=9999)    //計(jì)數(shù)值自加
                {
                    TimeCount=0;
                }
                SegRefreshDisplayBuf( );   //刷新緩沖區(qū)
            }
            SegDisplay( );                      //點(diǎn)亮選中的數(shù)碼管
        }
    }
}
/***********************************************
*函數(shù)名稱:Timer0IRQ
*輸           入:無(wú)
*輸        出:無(wú)
*功        能:T/CO中斷服務(wù)函數(shù)
***********************************************/
void Timer0IRQ(void) interrupt 1
{
    static unsigned int cnt=0;
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;          //重載初值
    Timer0IRQEvent=l;
    if(++cnt>=200)
    {
        cnt=0;
        TimelSecEvent=l;
    }
}



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

使用道具 舉報(bào)

沙發(fā)
ID:863362 發(fā)表于 2023-1-7 10:14 | 只看該作者
最好把出錯(cuò)的信息也粘貼出來(lái)
回復(fù)

使用道具 舉報(bào)

板凳
ID:253767 發(fā)表于 2023-1-7 13:00 | 只看該作者
謝謝。問(wèn)題已經(jīng)找到,是在其前一句的最后少一個(gè)大括號(hào)。
回復(fù)

使用道具 舉報(bào)

地板
ID:253767 發(fā)表于 2023-1-7 13:03 | 只看該作者
出錯(cuò)的信息中譯文就是“ “void"附近的語(yǔ)法錯(cuò)誤!
回復(fù)

使用道具 舉報(bào)

5#
ID:342822 發(fā)表于 2023-1-7 18:46 | 只看該作者
/* Main.c file generated by New Project wizard
*
* Created:   周六 1月 7 2023
* Processor: AT89C52
* Compiler:  Keil for 8051
*/

#include <reg52.h>
sbit        P0_4=0x84;       //P0.4位地址84H
sbit        P0_5=0x85;       //P0.5位地址85H
/****************************************
*          大量宏定義,便于代碼移植和閱讀     *
*****************************************/

#define HIGH        1                    //定義HIGH為高電平
#define LOW        0                    //定義LOW為低電平
#define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;}
#define LS164_CLK(x)  {if((x))P0_5=1;else P0_5=0;}
#define SEG_PORT      P0          //控制數(shù)碼管字型碼端口
unsigned char        Timer0lRQEvent=0;   //T/CO 中斷事件
unsigned char        TimelSecEvent=0;    //定時(shí) 1 秒事件
unsigned int TimeCount=0;              //時(shí)間計(jì)數(shù)值
unsigned char        SegCurPosition=0;   //當(dāng)前點(diǎn)亮的數(shù)碼管

//為了驗(yàn)證共陽(yáng)極的字型碼是共陰極的反碼,共陽(yáng)極字型碼為共陰極的反碼
//共陽(yáng)極字型碼存儲(chǔ)在代碼區(qū),用關(guān)鍵字“code”聲明
code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F};

//片選數(shù)碼管數(shù)組,存儲(chǔ)在代碼區(qū),用關(guān)鍵字"code"聲明
code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};

//數(shù)碼管顯示數(shù)據(jù)緩沖區(qū)
unsigned char SegBuf [4] ={0};

/**********************************************
*函數(shù)名稱:LS164Send
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:74LS164發(fā)送單個(gè)字節(jié)
**********************************************/

void LS164Send(unsigned char byte)
{
    unsigned char j ;
    for (j=0;j<=7;j++)           //對(duì)輸入數(shù)據(jù)進(jìn)行移位檢測(cè)
    {
        if(byte&(1<<(7-j)))      //檢測(cè)字節(jié)當(dāng)前位
        {
            LS164_DATA(HIGH);    //串行數(shù)據(jù)輸入引腳為高電平
        }
        else
        {
            LS164_DATA(LOW);     //串行數(shù)據(jù)輸入引腳為低電平
        }
        LS164_CLK(LOW);          //同步時(shí)鐘輸入端以一個(gè)上升沿結(jié)束確定該位的值
        LS164_CLK(HIGH);
    }
}
/**********************************************
*函數(shù)名稱:SegRef reshDisplayBuf
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:數(shù)碼管刷新顯示緩存
**********************************************/
void SegRefreshDisplayBuf(void)
{
    SegBuf[0]=TimeCount%10;                      //個(gè)位
    SegBuf[1]=TimeCount/10%10;           //十位
    SegBuf[2]=TimeCount/100%10;          //百位   
    SegBuf[3]=TimeCount/1000%10;         //千位
}
/***********************************************
*函數(shù)名稱:SegDisplay
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:數(shù)碼管顯示數(shù)據(jù)
***********************************************/

void SegDisplay(void)
{
    unsigned char t;
    SEG_PORT=0x0F;                         //熄滅所有數(shù)碼管
    t=SegCode[SegBuf[ SegCurPosition]];    //確定當(dāng)前的字型碼
    LS164Send(t);
    SEG_PORT=SegPosition[SegCurPosition];  //選中一個(gè)數(shù)碼管來(lái)系顯示
    if(++SegCurPosition>=4)                //下次要點(diǎn)亮的數(shù)碼管
    {
        SegCurPosition=0;
    }
}

/***********************************************
*函數(shù)名稱:TimerInit
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:T/C初始化
***********************************************/
void TimerInit(void)
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;       //定時(shí)5ms
TMOD=0x01;                  //T/C0 模式1
}

/***********************************************
函數(shù)名稱:Timer0Start
*輸   入:無(wú)
*輸   出:無(wú)
*功   能:T/C0啟動(dòng)
***********************************************/
void Timer0Start(void)
{
    TR0=1;
    ET0=1;
}
/***********************************************
*函數(shù)名稱:PortInit
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:I/O口初始化
***********************************************/
void PortInit(void)
{
    P0=P1=P2=P3=0xFF;
}
/***********************************************
*函數(shù)名稱:main
*輸    入:無(wú)
*輸    出:無(wú)
*功    能:函數(shù)主體
***********************************************/
void main(void)
{
    PortInit();
    TimerInit();
    Timer0Start();
    SegRefreshDisplayBuf();
    EA=1;
    while(1)
    {
        if(Timer0lRQEvent)                    //檢測(cè)定時(shí)中斷事件是否產(chǎn)生
        {  
            Timer0lRQEvent=0;
            if(TimelSecEvent)             //檢測(cè)1秒事件是否產(chǎn)生
            {
                TimelSecEvent=0;
                if(++TimeCount>=9999)    //計(jì)數(shù)值自加
                {
                    TimeCount=0;
                }
                SegRefreshDisplayBuf( );   //刷新緩沖區(qū)
            }
            SegDisplay( );                      //點(diǎn)亮選中的數(shù)碼管
        }
    }
}
/***********************************************
*函數(shù)名稱:Timer0IRQ
*輸           入:無(wú)
*輸        出:無(wú)
*功        能:T/CO中斷服務(wù)函數(shù)
***********************************************/
void Timer0IRQ(void) interrupt 1
{
    static unsigned int cnt=0;
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;          //重載初值
    Timer0lRQEvent=1;
    if(++cnt>=200)
    {
        cnt=0;
        TimelSecEvent=1;
    }
}
回復(fù)

使用道具 舉報(bào)

6#
ID:491923 發(fā)表于 2023-1-7 19:25 | 只看該作者
看明白了!
回復(fù)

使用道具 舉報(bào)

7#
ID:342822 發(fā)表于 2023-1-7 20:13 | 只看該作者

unsigned char        Timer0lRQEvent=0;   //T/CO 中斷事件
Timer0IRQEvent
Timer0lRQEvent
大寫I  小寫 l


P0=Pl=P2=P3=0xFF;
P1寫成Pl
仔細(xì)找找吧~~~~~
回復(fù)

使用道具 舉報(bào)

8#
ID:654797 發(fā)表于 2023-1-7 21:38 | 只看該作者
括號(hào)后而的90是怎么回事
回復(fù)

使用道具 舉報(bào)

9#
ID:88256 發(fā)表于 2023-1-7 22:28 | 只看該作者
vscos 發(fā)表于 2023-1-7 21:38
括號(hào)后而的90是怎么回事

那個(gè)是{的行號(hào)
回復(fù)

使用道具 舉報(bào)

10#
ID:88256 發(fā)表于 2023-1-7 22:34 | 只看該作者
在貼出來(lái)的所有程序里,有兩個(gè)TimerInit函數(shù),其中第2個(gè)估計(jì)是想注釋掉,但是注釋不應(yīng)該是 /* 加 */ 的嗎?沒(méi)有星號(hào)能行?




回復(fù)

使用道具 舉報(bào)

11#
ID:253767 發(fā)表于 2023-1-9 06:48 | 只看該作者
taotie 發(fā)表于 2023-1-7 20:13
unsigned char        Timer0lRQEvent=0;   //T/CO 中斷事件
Timer0IRQEvent
Timer0lRQEvent

謝謝指點(diǎn)。這個(gè)程序是從PDF書中復(fù)制后進(jìn)行文字識(shí)別的,這類錯(cuò)誤很多,都已一個(gè)個(gè)找出,程序已經(jīng)能夠正常運(yùn)行了。
回復(fù)

使用道具 舉報(bào)

12#
ID:253767 發(fā)表于 2023-1-9 06:51 | 只看該作者
vscos 發(fā)表于 2023-1-7 21:38
括號(hào)后而的90是怎么回事

謝謝指點(diǎn)。90是行號(hào),在復(fù)制過(guò)程中跟在了上一行的后面。
回復(fù)

使用道具 舉報(bào)

13#
ID:253767 發(fā)表于 2023-1-9 06:53 | 只看該作者
hhdsdy 發(fā)表于 2023-1-7 22:34
在貼出來(lái)的所有程序里,有兩個(gè)TimerInit函數(shù),其中第2個(gè)估計(jì)是想注釋掉,但是注釋不應(yīng)該是 /* 加 */ 的嗎? ...

謝謝指點(diǎn)。您說(shuō)得對(duì),大意了。
回復(fù)

使用道具 舉報(bào)

14#
ID:253767 發(fā)表于 2023-1-9 06:54 | 只看該作者
本帖最后由 tieq1952 于 2023-1-19 15:30 編輯

謝謝大家熱情分析指點(diǎn),所有錯(cuò)誤都已經(jīng)找到,程序已經(jīng)能夠正常運(yùn)行了。
回復(fù)

使用道具 舉報(bào)

15#
ID:910913 發(fā)表于 2023-1-13 09:56 | 只看該作者
還可以,程序不太繁瑣
回復(fù)

使用道具 舉報(bào)

16#
ID:412177 發(fā)表于 2023-6-19 18:15 | 只看該作者
好多地方都是把英文小寫“l(fā)”,和1搞混了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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