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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3014|回復: 15
打印 上一主題 下一主題
收起左側

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

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

該程序是一本教材中關于數碼管的程序。在Keil中,第89句無論如何都通不過,錯誤提示為“void"附近語法錯誤。第89句為一T/C0定時函數,程序如下:
89  void TimerInit(void)90  {
91       TH0=(65536-5000)/256;
92       TL0=(65536-5000)%256;       //定時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          //控制數碼管字型碼端口
unsigned char        Timer0lRQEvent=0;   //T/CO 中斷事件
unsigned char        TimelSecEvent=0;    //定時 1 秒事件
unsigned int TimeCount=0;              //時間計數值
unsigned char        SegCurPosition=0;   //當前點亮的數碼管

//為了驗證共陽極的字型碼是共陰極的反碼,共陽極字型碼為共陰極的反碼
//共陽極字型碼存儲在代碼區,用關鍵字“code”聲明
code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F};

//片選數碼管數組,存儲在代碼區,用關鍵字"code"聲明
code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};

//數碼管顯示數據緩沖區
unsigned char SegBuf [4] ={0};

/**********************************************
*函數名稱:LS164Send
*輸    入:無
*輸    出:無
*功    能:74LS164發送單個字節
**********************************************/

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

void SegDisplay(void)
{
    unsigned char t;
    SEG_PORT=0x0F;                         //熄滅所有數碼管
    t=SegCode[SegBuf[ SegCurPosition]];    //確定當前的字型碼
    LS164Send(t);
    SEG_PORT=SegPosition[SegCurPosition];  //選中一個數碼管來系顯示
    if(++SegCurPosition>=4)                //下次要點亮的數碼管
    {
        SegCurPosition=0;
    }
/***********************************************
*函數名稱:TimerInit
*輸    入:無
*輸    出:無
*功    能:T/C初始化
***********************************************/
void TimerInit(void)
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;       //定時5ms
TMOD=0x01;                  //T/C0 模式1
}
/                void TimerInit(void)
{
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;       //定時5ms
    TMOD=0x01;                  //T/C0 模式1
}/
/***********************************************
函數名稱:Timer0Start
*輸   入:無
*輸   出:無
*功   能:T/C0啟動
***********************************************/
void Timer0Start(void)
{
    TR0=1;
    ET0=1;
}
/***********************************************
*函數名稱:PortInit
*輸    入:無
*輸    出:無
*功    能:I/O口初始化
***********************************************/
void PortInit(void)
{
    P0=Pl=P2=P3=0xFF;
}
/***********************************************
*函數名稱:main
*輸    入:無
*輸    出:無
*功    能:函數主體
***********************************************/
void main(void)
{
    PortInit();
    TimerInit();
    Timer0Start();
    SegRefreshDisplayBuf();
    EA=1;
    while(1)
    {
        if(Timer0lRQEvent)                    //檢測定時中斷事件是否產生
        {  
            Timer0IRQEvent=0;
            if(TimelSecEvent)             //檢測1秒事件是否產生
            {
                TimelSecEvent=0;
                if(++TimeCount>=9999)    //計數值自加
                {
                    TimeCount=0;
                }
                SegRefreshDisplayBuf( );   //刷新緩沖區
            }
            SegDisplay( );                      //點亮選中的數碼管
        }
    }
}
/***********************************************
*函數名稱:Timer0IRQ
*輸           入:無
*輸        出:無
*功        能:T/CO中斷服務函數
***********************************************/
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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:863362 發表于 2023-1-7 10:14 | 只看該作者
最好把出錯的信息也粘貼出來
回復

使用道具 舉報

板凳
ID:253767 發表于 2023-1-7 13:00 | 只看該作者
謝謝。問題已經找到,是在其前一句的最后少一個大括號。
回復

使用道具 舉報

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

使用道具 舉報

5#
ID:342822 發表于 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          //控制數碼管字型碼端口
unsigned char        Timer0lRQEvent=0;   //T/CO 中斷事件
unsigned char        TimelSecEvent=0;    //定時 1 秒事件
unsigned int TimeCount=0;              //時間計數值
unsigned char        SegCurPosition=0;   //當前點亮的數碼管

//為了驗證共陽極的字型碼是共陰極的反碼,共陽極字型碼為共陰極的反碼
//共陽極字型碼存儲在代碼區,用關鍵字“code”聲明
code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F};

//片選數碼管數組,存儲在代碼區,用關鍵字"code"聲明
code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};

//數碼管顯示數據緩沖區
unsigned char SegBuf [4] ={0};

/**********************************************
*函數名稱:LS164Send
*輸    入:無
*輸    出:無
*功    能:74LS164發送單個字節
**********************************************/

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

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

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

/***********************************************
函數名稱:Timer0Start
*輸   入:無
*輸   出:無
*功   能:T/C0啟動
***********************************************/
void Timer0Start(void)
{
    TR0=1;
    ET0=1;
}
/***********************************************
*函數名稱:PortInit
*輸    入:無
*輸    出:無
*功    能:I/O口初始化
***********************************************/
void PortInit(void)
{
    P0=P1=P2=P3=0xFF;
}
/***********************************************
*函數名稱:main
*輸    入:無
*輸    出:無
*功    能:函數主體
***********************************************/
void main(void)
{
    PortInit();
    TimerInit();
    Timer0Start();
    SegRefreshDisplayBuf();
    EA=1;
    while(1)
    {
        if(Timer0lRQEvent)                    //檢測定時中斷事件是否產生
        {  
            Timer0lRQEvent=0;
            if(TimelSecEvent)             //檢測1秒事件是否產生
            {
                TimelSecEvent=0;
                if(++TimeCount>=9999)    //計數值自加
                {
                    TimeCount=0;
                }
                SegRefreshDisplayBuf( );   //刷新緩沖區
            }
            SegDisplay( );                      //點亮選中的數碼管
        }
    }
}
/***********************************************
*函數名稱:Timer0IRQ
*輸           入:無
*輸        出:無
*功        能:T/CO中斷服務函數
***********************************************/
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;
    }
}
回復

使用道具 舉報

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

使用道具 舉報

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

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


P0=Pl=P2=P3=0xFF;
P1寫成Pl
仔細找找吧~~~~~
回復

使用道具 舉報

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

使用道具 舉報

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

那個是{的行號
回復

使用道具 舉報

10#
ID:88256 發表于 2023-1-7 22:34 | 只看該作者
在貼出來的所有程序里,有兩個TimerInit函數,其中第2個估計是想注釋掉,但是注釋不應該是 /* 加 */ 的嗎?沒有星號能行?




回復

使用道具 舉報

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

謝謝指點。這個程序是從PDF書中復制后進行文字識別的,這類錯誤很多,都已一個個找出,程序已經能夠正常運行了。
回復

使用道具 舉報

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

謝謝指點。90是行號,在復制過程中跟在了上一行的后面。
回復

使用道具 舉報

13#
ID:253767 發表于 2023-1-9 06:53 | 只看該作者
hhdsdy 發表于 2023-1-7 22:34
在貼出來的所有程序里,有兩個TimerInit函數,其中第2個估計是想注釋掉,但是注釋不應該是 /* 加 */ 的嗎? ...

謝謝指點。您說得對,大意了。
回復

使用道具 舉報

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

謝謝大家熱情分析指點,所有錯誤都已經找到,程序已經能夠正常運行了。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 手机在线一区二区三区 | 色爱区综合| 亚洲欧美中文日韩在线v日本 | 婷婷久久五月 | 欧美综合一区 | 日本亚洲精品成人欧美一区 | 黄色亚洲| 五月天天色| 国产真实乱全部视频 | 日韩一级 | 特黄毛片 | 91久久精品国产免费一区 | 国产日韩欧美一区二区在线播放 | 成人18亚洲xxoo | 久久剧场| 伦理午夜电影免费观看 | 日韩在线综合 | 91大神在线看 | 伊人春色成人 | 91精品国产日韩91久久久久久 | 国产偷录视频叫床高潮对白 | 中文字幕在线看 | 免费观看黄 | 我想看国产一级毛片 | 日本一区二区高清不卡 | 国产一区二区日韩 | 欧美a∨ | 毛片一级黄色 | 日韩免费在线 | 久久国产成人 | 九九热这里只有精品在线观看 | 久久精品国产一区二区三区 | 久久国产亚洲精品 | 在线一区视频 | 欧美日本韩国一区二区 | 久草99 | 国产精品一区在线 | 亚洲午夜精品在线观看 | 久久日韩粉嫩一区二区三区 | 久久久一区二区三区 | 日本午夜免费福利视频 |