找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1703|回复: 15
收起左侧

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

[复制链接]
ID:253767 发表于 2023-1-7 08:25 | 显示全部楼层 |阅读模式
本帖最后由 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;
    }
}



回复

使用道具 举报

ID:863362 发表于 2023-1-7 10:14 | 显示全部楼层
最好把出错的信息也粘贴出来
回复

使用道具 举报

ID:253767 发表于 2023-1-7 13:00 | 显示全部楼层
谢谢。问题已经找到,是在其前一句的最后少一个大括号。
回复

使用道具 举报

ID:253767 发表于 2023-1-7 13:03 | 显示全部楼层
出错的信息中译文就是“ “void"附近的语法错误。”
回复

使用道具 举报

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;
    }
}
回复

使用道具 举报

ID:491923 发表于 2023-1-7 19:25 | 显示全部楼层
看明白了!
回复

使用道具 举报

ID:342822 发表于 2023-1-7 20:13 | 显示全部楼层

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


P0=Pl=P2=P3=0xFF;
P1写成Pl
仔细找找吧~~~~~
回复

使用道具 举报

ID:654797 发表于 2023-1-7 21:38 | 显示全部楼层
括号后而的90是怎么回事
回复

使用道具 举报

ID:88256 发表于 2023-1-7 22:28 | 显示全部楼层
vscos 发表于 2023-1-7 21:38
括号后而的90是怎么回事

那个是{的行号
回复

使用道具 举报

ID:88256 发表于 2023-1-7 22:34 | 显示全部楼层
在贴出来的所有程序里,有两个TimerInit函数,其中第2个估计是想注释掉,但是注释不应该是 /* 加 */ 的吗?没有星号能行?

51hei图片20230107223042.png


回复

使用道具 举报

ID:253767 发表于 2023-1-9 06:48 | 显示全部楼层
taotie 发表于 2023-1-7 20:13
unsigned char        Timer0lRQEvent=0;   //T/CO 中断事件
Timer0IRQEvent
Timer0lRQEvent

谢谢指点。这个程序是从PDF书中复制后进行文字识别的,这类错误很多,都已一个个找出,程序已经能够正常运行了。
回复

使用道具 举报

ID:253767 发表于 2023-1-9 06:51 | 显示全部楼层
vscos 发表于 2023-1-7 21:38
括号后而的90是怎么回事

谢谢指点。90是行号,在复制过程中跟在了上一行的后面。
回复

使用道具 举报

ID:253767 发表于 2023-1-9 06:53 | 显示全部楼层
hhdsdy 发表于 2023-1-7 22:34
在贴出来的所有程序里,有两个TimerInit函数,其中第2个估计是想注释掉,但是注释不应该是 /* 加 */ 的吗? ...

谢谢指点。您说得对,大意了。
回复

使用道具 举报

ID:253767 发表于 2023-1-9 06:54 | 显示全部楼层
本帖最后由 tieq1952 于 2023-1-19 15:30 编辑

谢谢大家热情分析指点,所有错误都已经找到,程序已经能够正常运行了。
回复

使用道具 举报

ID:910913 发表于 2023-1-13 09:56 | 显示全部楼层
还可以,程序不太繁琐
回复

使用道具 举报

ID:412177 发表于 2023-6-19 18:15 | 显示全部楼层
好多地方都是把英文小写“l”,和1搞混了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表