找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1095|回复: 4
收起左侧

error C141: syntax error near 'void'求助解决单片机C语言代码错误

[复制链接]
ID:1058155 发表于 2022-12-18 14:08 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<intrins.h>
unsigned char code cdis1[]={"SPEED:"};
unsigned char code cdis2[]={"r/min"};
sbit LCD_RS=P2^6;//寄存器选择位将RS位定义为P2.6引脚
sbit LCD_RW=P2^5;//读写选择位将RW位定义为P2.5引脚
sbit LCD_EN=P2^7;//使能信号位将EN位定义为P2.7引脚
bit sec=0;
unsigned char msec=0,Hdata=0,Ldata=0,Count=0;
unsigned long temp=0;
unsigned char data display[]={0x00,0x00,0x00,0x00,0x00};
char code reserve[3] _at_ 0x3b;//保留0x3b开始的3个字节
/*********************************************************
us延时函数
*********************************************************/
void delayNOP()
{
_nop_();
        _nop_();
_nop_();
_nop_();
}
/*********************************************************
ms延时函数
*********************************************************/
void delayms(unsigned int ms)
{
unsigned char n;
while(ms--)
{
for(n=0;n<114;n++);}
}
/**********************************************************
检查LCD忙状态lcd_busy为1时忙等待。
lcd-busy为0时,闲可写指令与数据。
**********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS=0;//根据规定RS为低电平RW为高电平时可以读状态
LCD_RW=1;
LCD_EN=1;//EN=1才允许读写
delayNOP();//空操作给硬件反应时间
result=(bit)(P0&0x80);//将忙碌标志电平赋给P0.7
LCD_EN=0;//将E恢复低电平
return(result);
}
/**********************************************************写指令数据到LCDRS=LRW=LE=高脉冲D0-D7=指令码。
**********************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());//如果忙就等待
LCD_RS=0;//根据规定RS和R/W同时为低电平时可以写入指令
LCD_RW=0;
LCD_EN=1;//E置低电平(写指令时E为高脉冲就是让E从0到1发生正跳变所以应先置"0")
P0=cmd;//将数据送入P0口即写入指令或地址
delayNOP();//空操作给硬件反应时间
LCD_EN=0;//当由高电平跳变成低电平时液晶模块开始执行命令
}
/**********************************************************
将数据(字符的标准ASCII码)写入液晶模块
**********************************************************/
void lcd_wdat(unsigned char dat)
{
while(lcd_busy());
LCD_RS=1;//RS为高电平RW为低电平时可以写入数据
LCD_RW=0;
LCD_EN=1;
P0=dat;//将数据送入P0口即将数据写入液晶模块
delayNOP();
LCD_EN=0;
//当E由高电平跳变成低电平时液晶模块开始执行命令}
/**********************************************************
LCD初始化设定
**********************************************************/

void lcd_init(void)
{
        delayms(15);//延时15ms首次写指令时应给LCD一段较长的反应时间
        lcd_wcmd(0x38);//显示模式设置16*2显示5*7点阵8位数据
        delayms(5);//延时5ms给硬件一点反应时间
        lcd_wcmd(0x38);
        delayms(5);//延时5ms给硬件一点反应时间
        lcd_wcmd(0x38);//连续三次确保初始化成功
        delayms(5);//延时5ms给硬件一点反应时间
        lcd_wcmd(0x0c);//显示模式设置显示开无光标光标不闪烁
        delayms(5);//延时5ms给硬件一点反应时间
        lcd_wcmd(0x06);//显示模式设置光标右移字符不移
        delayms(5);//延时5ms给硬件一点反应时间
        lcd_wcmd(0x01);//清屏幕指令将以前的显示内容清除
        delayms(5);//延时5ms给硬件一点反应时间
}
/**********************************************************
指定字符显示的实际地址
**********************************************************/
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
/**********************************************************
显示函数
**********************************************************/
void play()
{
unsigned char n;
        for(n=0;n<=3;n++)//数据转换
        {
        display[n]=temp%10+0x30;
        temp=temp/10;
        }
display[4]=temp+0x30;
for(n=4;n>0;n--)//高位为"0"不显示
{
        if(display[n]==0x30)
                display[n]=0x20;
        else
                break;
}
lcd_pos(0x46);//显示实际频率值
for(n=4;n!=0xff;n--)
lcd_wdat(display[n]);
}
/*********************************************************
主函数
*********************************************************/
void main()
{
unsigned char m;
unsigned long frq_num;
P0=0xff;
lcd_init();//LCD初始化
lcd_pos(0x00);//设置显示位置为第一行
for(m=0;m<6;m++)
lcd_wdat(cdis1[m]);//显示字符
lcd_pos(0x4b);//设置显示位置为第二行
for(m=0;m<5;m++)
lcd_wdat(cdis2[m]);//显示字符
TMOD=0x51;//定时器0工作在定时方式//定时器1工作在计数方式
TH0=0x4c;//50ms定时
TL0=0x00;
TH1=0x00;//计数初值
TL1=0x00;
ET0=1;//使能TIMER0中断
ET1=1;//使能TIMER1中断
EA=1;//允许中断
PT1=1;//定义TIMER1中断优先
TR0=1;
TR1=1;
while(1)
{
        if(sec)
        {
        Hdata=TH1;//取计数值
        Ldata=TL1;
        frq_num=((Count*65535+Hdata*256+Ldata)*60/80);//取数计算
        TH1=0;
        TL1=0;
        sec=0;
        Count=0;
        TR1=1;
        TR0=1;//决定了中断方式为T1定时计数中断
        }
temp=frq_num;
play();
}
}
/**********************************************************
Time0
中断函数
**********************************************************/
void Time0() interrupt 1
{
TH0=0x4c;//50ms定时
TL0=0x00;
msec++;
if(msec==20)//50*20=1S
{TR0=0;//关闭TIMER0
TR1=0;//关闭TIMER1
msec=0;
sec=1;//置秒标记位
}
}
/**********************************************************
Time1
中断函数
**********************************************************/
void Time1() interrupt 3
{
Count++;
}


回复

使用道具 举报

ID:121859 发表于 2022-12-18 17:54 | 显示全部楼层
前一个函数void lcd_wdat(unsigned char dat)
少了一个}。加上就好了
回复

使用道具 举报

ID:68189 发表于 2022-12-18 19:49 | 显示全部楼层
/**********************************************************
将数据(字符的标准ASCII码)写入液晶模块
**********************************************************/
void lcd_wdat(unsigned char dat)
{
while(lcd_busy());
LCD_RS=1;//RS为高电平RW为低电平时可以写入数据
LCD_RW=0;
LCD_EN=1;
P0=dat;//将数据送入P0口即将数据写入液晶模块
delayNOP();
LCD_EN=0;
//当E由高电平跳变成低电平时液晶模块开始执行命令}

看最后一个字符  }  被注释了,,,,,,,,,这个函数没有配对的 }  

回复

使用道具 举报

ID:814525 发表于 2022-12-18 20:55 | 显示全部楼层
void delayms(unsigned int ms)
void lcd_wdat(unsigned char dat)
两个函数都少了一个}
回复

使用道具 举报

ID:161164 发表于 2022-12-18 23:28 | 显示全部楼层
2022-12-18_232448.png
2022-12-18_232726.png

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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