c语言错误c237,error c237:function already has a body单片机程序编译错误

程序是找别的大佬借鉴的想实现的功能是先超声波测距离 然后距离小于10或者大于100时候pwm调占空比为0 距离在10到20时减少占空比 20到30时占空比不变 30到100时占空比增加

问题如图

4b6180da312b6fe159f6de66e5269030.png

0231ebf5b7354e99253670ec9a778100.png

error c237:function already has a body

单片机源程序如下:

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit rs=P2^0;            //1602的数据/指令选择控制线

sbit rw=P2^1;           //1602的读写控制线

sbit en=P2^2;          //1602的使能控制线

sbit trig=P2^5;      //超声波测距模块Trig

sbit echo=P3^2;     //超声波测距模块Echo

bit flag1;         //触发信号标志位//

uchar count;           //中断累加变量

long int distance;    //测量所得距离

unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字

void delay(uint n)

{

uint x,y;

for(x=n;x>0;x--)

for(y=110;y>0;y--);

}

void delayt(uint x)

{

uchar j;

while(x-- > 0)

{

for(j = 0;j < 125;j++)

{

;

}

}

}

void lcd_wcom(uchar com)

{

rs=0;                //选择指令寄存器

rw=0;               //选择写

P0=com;            //把命令字送入P0

delay(5);         //延时一小会儿,让1602准备接收数据

en=1;            //使能线电平变化,命令送入1602的8位数据口

en=0;

}

void lcd_wdat(uchar dat)

{

rs=1;             //选择数据寄存器

rw=0;            //选择写

P0=dat;         //把要显示的数据送入P0

delay(5);      //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。

en=1;         //使能线电平变化,数据送入1602的8位数据口

en=0;

}

void lcd_init()

{

lcd_wcom(0x38);       //8位数据,双列,5*7字形  ,用到功能设定指令

lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令

lcd_wcom(0x06);     //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令

lcd_wcom(0x01);    //清屏,用到了清屏指令

}

void lcd_xianshi()

{

lcd_wcom(0x80+0x40);

lcd_wdat('D');

lcd_wdat('i');

lcd_wdat('s');

lcd_wdat('t');

lcd_wdat('a');

lcd_wdat('n');

lcd_wdat('c');

lcd_wdat('e');

lcd_wdat(':');

lcd_wcom(0x80+0x4c);

lcd_wdat('.');

lcd_wcom(0x80+0x4e);//单位是厘米//

lcd_wdat('c');

lcd_wdat('m');

}

void init_t0()

{

TMOD=0x01;

TL0=0x66;

TH0=0xfc;              //1ms

ET0=1;

EA=1;

}

void trigger()

{

trig=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

trig=1;

}

void init_measuring()

{

trig=1;

echo=1;

count=0;

}

void measuring()

{

uchar l;

uint h,y;

TR0 = 1;

while(echo==1)

{

;

}

TR0 = 0;

l = TL0;

h = TH0;

y = (h << 8) + l;

y = y - 0xfc66;//us部分

distance = y + 1000 * count;//计算总时间,单位是微秒

TL0 = 0x66;

TH0 = 0xfc;

delayt(30);

distance = 3453* distance / 20000;//原始为:(0.34毫米/us)*时间/2//

}

void display(uint x)

{

uchar qian,bai,shi,ge;

qian=x/1000;

bai=(x/100);

shi=(x/10);

ge=x;

lcd_wcom(0x80+0x49);//单位是厘米//

lcd_wdat(table[qian]);

lcd_wdat(table[bai]);

lcd_wdat(table[shi]);

lcd_wcom(0x80+0x4d);

lcd_wdat(table[ge]);

}

void main()

{   lcd_init();          //液晶初始化

init_t0();          //定时器0初始化

init_measuring();  //超声波相应端口初始化

while(1)

{

lcd_xianshi();   //液晶显示特定字符

trigger();      //触发超声波启动

while(echo==0)          //等待回声

{

;

}

measuring();           //进行距离测量

display(distance);    //对测量结果进行显示

init_measuring();    //超声波相应端口初始化

delayt(10000);        //每次测量间隔1s

}

}

//……………………………………………中断服务函数…………………………………………………//

void T_0()interrupt 1

{

TF0 = 0;

TL0 = 0x66;

TH0 = 0xfc;

count++;

if(count==18)

{

TR0 =0;

TL0 = 0x66;

TH0 = 0xfc;

count = 0;

}

}

#include

#define uchar unsigned char

#define V_TH0  0XFF

#define V_TL0  0XF6

#define V_TMOD 0X01

void init_sys(void);            /*系统初始化函数*/

void Delay5Ms(void);

unsigned char ZKB1,ZKB2;

void main (void)

{

init_sys();

ZKB1=40;            /*占空比初始值设定*/

ZKB2=70;            /*占空比初始值设定*/

while(1)

{

if (distance<10&distance>100) //如果距离<10或者大于100,占空比为0

{

Delay5Ms();

if (distance<10&distance>100)

{

ZKB1=0;

ZKB2=100;

}

}

if (20

{

Delay5Ms();

if (20

{

ZKB1=ZKB1;

ZKB2=100-ZKB1;

}

}

if (30

{

Delay5Ms();

if (30

{

ZKB1++;

ZKB2=100-ZKB1;

}

}

if (10

{

Delay5Ms();

if (10

{

ZKB1--;

ZKB2=100-ZKB1;

}

}

/*对占空比值限定范围*/

if (ZKB1>99) ZKB1=1;

if (ZKB1<1) ZKB1=99;

}

}

/******************************************************

*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/

void init_sys(void)            /*系统初始化函数*/

{

/*定时器初始化*/

TMOD=V_TMOD;

TH0=V_TH0;

TL0=V_TL0;

TR0=1;

ET0=1;

EA=1;

}

//延时

void Delay5Ms(void)

{

unsigned int TempCyc = 1000;

while(TempCyc--);

}

/*中断函数*/

void timer0(void) interrupt 1 using 2

{

static uchar click=0;                  /*中断次数计数器变量*/

TH0=V_TH0;                                    /*恢复定时器初始值*/

TL0=V_TL0;

++click;

if (click>=100) click=0;

if (click<=ZKB1)      /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/

P1_0=0;

else

P1_0=1;

if (click<=ZKB2)

P1_1=0;

else

P1_1=1;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值