yzex86 2023-06-17 23:44 采纳率: 66.7%
浏览 36
已结题

C51编程报错 error C141: syntax error near 'void'

【Keil5 C51报错】#2.c(428): error C141: syntax error near 'void'
下面是我的全部代码

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <absacc.h>
#define BaudRate 9600//波特率为9600
#define  LcdData P0//定义lcd端口——p0

#define DA0832 XBYTE[0xFFFE]//定义DAC0832端口地址,用于功能三数模转换
#define uchar unsigned char
#define uint unsigned int//定义简写形式
sbit LS373_LE=P3^6;//定义led灯口变量
sbit KEY_INT=P3^2;//INT0的引脚
sbit KEY_LINE0=P2^6;
sbit KEY_LINE1=P2^5;
sbit KEY_LINE2=P2^4;//第一行,第二行和第三行
sbit CS1=P1^7;
sbit CS2=P1^6;
sbit CS3=P1^5;
sbit CS4=P1^4;//接7端数码管的下端
sbit RS=P1^2; //并行的指令/数据选择信号, H数据, L命令
sbit RW=P1^1; //并行读写选择信号, H读, L写
sbit EN=P1^0; //并行使能端, H有效, L无效 
bit FlagKeyChecked;//按键是否被按下
unsigned char AMP;//生成波形函数需要的相关变量
unsigned char LedVal;
unsigned char LedsVal=0xFE;//11111110
unsigned int IntervalLedsChange=500;//led的初始点亮时间为500ms
unsigned char T0_High;
unsigned char T0_Low;//定义THO和TLO
int Cnt1ms;//计数变量
int Cnt1ms7Seg;//七段数码管的值
bit FlagLedsChange=0;
bit FlagUartSend=0;//uart发送标志
bit FlagKeyPressing=0;//INT0中断标志变量
bit FlagKeyPressed=0;//INT0
unsigned char QianWei;
unsigned char BaiWei;
unsigned char ShiWei;
unsigned char GeWei;//定义数码管的四位数字变量
unsigned int DispVal7Seg;
unsigned char Fs = 1; //定义一个函数频率变量,用于改变其频率,设定初始频率为256*1=256ms
unsigned char mod2;
unsigned char mod3;//处理选择功能后的按键
unsigned char Fasong;
unsigned char revDataCount;
unsigned char Jieshou;
unsigned char a;//用于ascii码值的变量
unsigned char ZhongJianzhi;//用于实验三功能二的中间变量
long HZ=11059200L;//频率为11.0592MHZ
unsigned char code SegCode[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};//七段数码管0-9
 char send[2];
 char rece[2];//功能二接收和发送使用的空间
bit Flag1sOK;//定时器中断标志变量
uchar code sin_tab[] =        //正弦波输出表
{
     0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
     0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
     0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
     0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
     0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
     0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
     0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
     0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
     0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
     0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
     0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
     0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
     0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
     0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
     0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E
};
char code KeyCode[3][4]=       //定义按键数组
{
    {'1','2','3','4'},
    {'5','6','7','8'},
    {'9','0','*','#'}
};
unsigned char Ascii(unsigned char a)//转换ascii码值
{
    if(a<9)
        return a + 0x30;
}
unsigned char ScanMatrixKeys(void)//逐行扫描函数
{
    static unsigned char CurScanLine=0;//扫描行
    unsigned char Val_Column;
    unsigned char j;
    unsigned char ret;    
    bit FlagKeyChecked1;
    ret = 0;
    P2 |= 0x7F;        //P2.0~P2.6 = 1; 行和列全部置1
    switch (CurScanLine)
    {
        case 0:
            KEY_LINE0 = 0; //LINE0 = 0;    //当前扫描行输出0        
        break;
        case 1:
            KEY_LINE1 = 0; //LINE1 = 0;
        break;
        case 2:
            KEY_LINE2 = 0; //LINE2 = 0;
        break;
    }
    FlagKeyChecked1 = 0;
    Val_Column = P2;    //读列值
    Val_Column &= 0x0F; //保留低4位列值
    if(Val_Column != 0x0F)
    {
        for(j=0;j<4;j++)
        {
            if((Val_Column & (1<<(3-j))) == 0x00)  //找出为0的列
            {
                ret = KeyCode[CurScanLine][j];       //保存键码
                FlagKeyChecked1 = 1;
                break;
            }
        }
        if(FlagKeyChecked1)
        {
            do
            {
                P2 |= 0x0F;                //列线都置1
                Val_Column = P2;           //读列值
                Val_Column &= 0x0F;        //保留低4位列值
            }while(Val_Column != 0x0F);  //等待按键释放
        }
    }
    CurScanLine = (CurScanLine+1)%3;  //0 1 2 
    return ret;
}

void LedChange(unsigned char val)//控制led的改变函数
{
    unsigned char temp1;
    unsigned char temp2;
    
    EA = 0;
    temp1 = P0;     //临时保存P0 P1的值
    temp2 = P1;
    P1 &= 0x0f;     //close 7-seg LED 
    
    P0 = val;
    LS373_LE = 1;
    LS373_LE = 0;    //led产生下降沿
    
    P1 = temp2;
    P0 = temp1;    //恢复原值
    EA = 1;
}
void EInt0_Init(void)//下降沿触发中断
{
    EX0 = 1;
    IT0 = 1;     
}
void T0_Init(void)//TO的初始化
{
    TMOD &= 0xF0;
    TMOD |= 0x01;  //T0 方式1
    T0_High = (65536-1*HZ/12000)/256;
    T0_Low  = (65536-1*HZ/12000)&0xFF; //1ms定时
    TH0 = T0_High;
    TL0 = T0_Low;
    ET0 = 1;       //使能T0中断
    TR0 = 1;
}
unsigned char Lcd_CheckBusy(void)
{
    unsigned char Busy;
    LcdData=0xff;
    RS=0;
    RW=1;
    EN=1;
    _nop_(); 
    Busy=LcdData&0x80;
    EN=0;
    return Busy;
}

void Lcd_WriteCmd(unsigned char CmdCode)
{  
    while(Lcd_CheckBusy());
       RS=0;
       RW=0;
       EN=0;
       _nop_();  
    _nop_();
       LcdData=CmdCode;
       _nop_(); 
    _nop_();
       EN=1;
       _nop_();  
    _nop_();
       EN=0;
}
void Lcd_WriteData(unsigned char Data)
{  
    while(Lcd_CheckBusy());
    RS=1;
    RW=0;
    EN=0;
    _nop_();  
    _nop_(); 
    LcdData=Data;
    EN=1;
    _nop_();
    _nop_();
    EN=0;
}

void Lcd_Init()//lcd的初始化
{  
    Lcd_WriteCmd(0x30);       //选择基本指令集
    Lcd_WriteCmd(0x0c);       //开显示,光标关,闪烁关
    Lcd_WriteCmd(0x01);       //清除显示,并且设定地址指针为00H
    Lcd_WriteCmd(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void Lcd_Clear(unsigned char Mode)
{
    unsigned char x,y,ii;
    unsigned char Temp;
    if(Mode%2==0)
        Temp=0x00;
    else
        Temp=0xff;
    Lcd_WriteCmd(0x36);//扩充指令 绘图显示
    for(ii=0;ii<9;ii+=8)   
        for(y=0;y<0x20;y++)     
            for(x=0;x<8;x++)
            {     
                EA=0;
                Lcd_WriteCmd(y+0x80);        //行地址
                Lcd_WriteCmd(x+0x80+ii);     //列地址     
                Lcd_WriteData(Temp); //写数据 D15-D8 
                Lcd_WriteData(Temp); //写数据 D7-D0 
                EA=1;
            }
    Lcd_WriteCmd(0x30);
}        
void Send_Byte(unsigned char val)//发送函数,到串口
{
    SBUF = val;
    while(TI==0);//等待发送完成
    TI = 0;    //发送完成后清零发送标志位
}
void Send_Bytes(unsigned char *pbuf ,int size)//发送到串口
{
    int i;
    for(i=0;i<size;i++)
    {
        Send_Byte(pbuf[i]);
    }
}
void Uart_ISR(void) interrupt 4//串口中断接收函数,发送不使用中断
{
    unsigned char val;

    if(RI)//如果RI等于1,说明数据已经接收完成
    {
        RI = 0;//RI清零
        val= SBUF;
    }
}

void Uart_Init(void)//uart的初始化
{
    SCON = 0x50;   //Mode = 1  ren = 1
    TMOD &= 0x0F;
    TMOD |= 0x20;  //T1 方式2 
    PCON &= 0x7f; 
    TH1  = 256-HZ/32/12/BaudRate;
    TL1  = TH1;  
    ES   = 1;
    TR1  = 1;
}
void Init_gVars(void)//数码管的初始化
{
    Cnt1ms      = 0;
    Flag1sOK    = 0;
    LedVal      = 0;
    Cnt1ms7Seg  = 0;
  
    IntervalLedsChange = 500;
    DispVal7Seg = IntervalLedsChange;
    QianWei = DispVal7Seg/1000;
    BaiWei  = DispVal7Seg%1000/100;
    ShiWei  = DispVal7Seg%100/10;
    GeWei   = DispVal7Seg%10;
}

void T0_Isr(void) interrupt 1//TO的中断
{
    static unsigned char CntKeyJitter=0;      //注意static的用法
    static unsigned char CurScanCs=0;    

    TF0 = 0;//终端溢出标志清零
    
    if(++Cnt1ms >= DispVal7Seg)  //1s is ok;
    {
        Cnt1ms = 0;
        Flag1sOK = 1;
    }

    if(FlagKeyPressing)                      //貌似INT0键被按下,检查INT0是否真的被按下
    {
        if(++CntKeyJitter >= 40)          //延时20ms后再读按键,如为零则真有键被按下,否则是抖动
        {
            CntKeyJitter = 0;
            if(KEY_INT == 0)              //读INT0引脚,为0:键正被按下...
                FlagKeyPressed  = 1;
            else                                  //读INT0引脚,为1:无键按下
                FlagKeyPressed  = 0;
            
            FlagKeyPressing = 0;    
        }    
    }
    if(++Cnt1ms7Seg >= 5) //50Hz Scan 7SEG
    {
        Cnt1ms7Seg = 0;
        P1 &= 0x0f;   //CS1-4 = 0 //场消隐
        switch (CurScanCs)
        {
            case 0x00:
                P0  = SegCode[QianWei];
                CS4 = 1;
            break;
            case 0x01:
                P0  = SegCode[BaiWei];//显示具体数字
                CS3 = 1;
            break;
            case 0x02:
                P0  = SegCode[ShiWei];
                CS2 = 1;
            break;
            case 0x03:
                P0  = SegCode[GeWei];
                CS1 = 1;
            break;
        }
        CurScanCs = (CurScanCs+1)%4;  //0 1 2 3 0 1 2 3;     
    }
    
    TH0 = T0_High; //重新重装T0初值
    TL0 = T0_Low;    
}

void EInt0_Isr(void) interrupt 0
{
    FlagKeyPressing = 1;         //貌似INT0键被按下...
}
void update_tube(int newval)
{
    unsigned int val;
    val = newval;
    QianWei = val/1000;
    BaiWei  = val%1000/100;
    ShiWei  = val%100/10;
    GeWei   = val%10;
    
}
void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char *Str)
{
    if((y>3)||(x>7))
        return;//如果指定位置不在显示区域内,则不做任何写入直接返回
    EA=0;
    switch(y)
    {
        case 0:
                Lcd_WriteCmd(0x80+x);
                break;
        case 1:
                Lcd_WriteCmd(0x90+x);
                break;                
        case 2:
                Lcd_WriteCmd(0x88+x);
                break;
        case 3:
                Lcd_WriteCmd(0x98+x);
                break;
    }
    while(*Str>0)
    {  
        Lcd_WriteData(*Str);
          Str++;     
    }
    EA=1;
}
void Delay_MS(uint n )//延时函数
{
    unsigned int i, j;
for(i = n; i > 0; i--)
    for(j = 110; j > 0; j--);
}
 
void stair()//生成锯齿波函数
{
    uchar i;
    for(i = 0 ;i < 255; i++)
    {
        DA0832 = i;
        Delay_MS(Fs);
    }
}
void trian()//生成三角波函数
{
    uchar i;
    for(i = 255 ;i < 255; i++)
    {
        DA0832 = i;
        Delay_MS(Fs);
    }
    
    for(i-1 ;i > 255; i--)
    {
        DA0832 = i;
        Delay_MS(Fs);
    }
}

void sin()//生成正弦波函数
{
    uchar i;
    for(i = 0; i < 255; i++)
    {
        DA0832 = sin_tab[i];
    }

 void main(void)
{
    T0_Init();//定时器0:1ms定时,中断方式处理溢出
      Uart_Init();//uart的初始化
      EInt0_Init(); //下降沿触发中断,INT0的初始化
      Init_gVars();//数码管的初始化
      Lcd_Init();//lcd的初始化
      Lcd_Clear(0);
      Lcd_WriteStr(0,0,"1.流水灯测试");
      Lcd_WriteStr(0,1,"2.串口功能测试");
      Lcd_WriteStr(0,2,"3.D/A功能测试");
      Lcd_WriteStr(0,3,"周子焯 1010212223");
      TI = 1;
    EA=1;//开启总中断允许开关
    while(1)
 {
         unsigned char CurKey;
    CurKey = ScanMatrixKeys();
    switch(CurKey)
  {
        case 1:
    {
            if(Flag1sOK)//如果Flag1sOK为1
         {
            Flag1sOK = 0;
            LedChange( LedsVal);//11111110
            LedsVal = ~ LedsVal;//00000001
            LedsVal = LedsVal<<1;//00000010
            LedsVal = ~ LedsVal;    //11111101
            if(LedsVal==0xFF)
            { 
                LedsVal =0xFE;
            }
         }//跑马灯实现

         if(FlagKeyPressed)       //有INT0按键按下了吗?
         {
        
            FlagKeyPressed = 0;
            FlagKeyPressing = 0;
            FlagUartSend = 1;  //置串口需要发出标志
            DispVal7Seg =  DispVal7Seg-10;
            update_tube(DispVal7Seg);
            if(DispVal7Seg < 0)//判断是否小于500ms
                    DispVal7Seg = 500;
         }
        if(FlagUartSend)       //需要发送数据至串口吗?
        {
            FlagUartSend = 0;
            Send_Bytes((unsigned char *)&IntervalLedsChange,sizeof(DispVal7Seg)); //注意字节顺序
        }
        break;
    }
        case 2:
    {//串口测试功能测试子菜单
        Lcd_Clear(0);//清屏
      Lcd_WriteStr(0,0,"1.发送功能测试");
      Lcd_WriteStr(0,1,"2.接收功能测试");
            //如果按键按下了
            //发送功能测试
            while(1)
    {
            mod2 = ScanMatrixKeys();
            if(mod2==1)//串口发送相应ASCII码值
            {    
                  Fasong  = ScanMatrixKeys();
                  ZhongJianzhi = Ascii(Fasong);
                  Send_Bytes((unsigned char *)ZhongJianzhi,1);
            }
                //2.接受功能测试//使用中断!!!,这里不写
        break;
    }
    }
        case 3:
        {
            //数模转换功能子菜单,频率的改变可借助INT0键,显示频率借助数码管    Send_Bytes
        Lcd_Clear(0);//清屏
      Lcd_WriteStr(0,0,"1.输出锯齿波");
      Lcd_WriteStr(0,1,"2.输出三角波");
      Lcd_WriteStr(0,2,"3.输出正弦波");
            while(1)
            {
            mod3 = ScanMatrixKeys();
            if(FlagKeyPressed)       //有INT0按键按下了吗?,用于INT0改变输出函数的频率,并且打在数码管上
        {
        
            FlagKeyPressed = 0;
            FlagKeyPressing = 0;
            FlagUartSend = 1;  //置串口需要发出标志
            Fs += Fs;//按下int0后,频率增加1ms
            update_tube(Fs);//更新数码管显示数据
            if(Fs >= 17)//判断是否大于一定值16.6ms为人类肉眼可见最高
            {Fs=1;}

        }
          if(FlagUartSend)       //需要发送数据至串口吗?
           {
              FlagUartSend = 0;
              Send_Bytes((unsigned char *)&Fs,sizeof(Fs)); //注意字节顺序
           }
            if(mod3==1)
                stair();
            if(mod3==2)
                trian();
            if(mod3==3)
                sin();
            break;
        }
     }
  }
 }
}


#个人认为是主函数下面出了问题

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-06-18 00:03
    关注
    main函数的缩进调整下,看上去是花括号不匹配
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 已采纳回答 6月18日
  • 创建了问题 6月17日

悬赏问题

  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参