为了账号安全,请及时绑定邮箱和手机立即绑定

c语言,51单片机编程指针问题

c语言,51单片机编程指针问题

C C++
慕田峪6419932 2018-07-31 13:34:37
代码主要有两个问题:1、如果换成define定义的  DATA = cmd; 报错为什么?用P1 = cmd; 就没事2、防抖动函数,不想每次都写,所以定义了一个子函数,但是调用的时候报错,应该是地址,指针的问题。sbit定义的变量不是端口的地址吗? 上代码:#include <reg52.h>   //<reg51.h>包含52单片机寄存器库typedef unsigned int  u16;//函数别名,以下程序u16代表int,u8代表chartypedef unsigned char u8;sbit led1 = P0^0;//控制灯的继电器,开关由光感和人数决定sbit led2 = P0^1;sbit led3 = P0^2;sbit power = P2^6;//总电源开关#define DATA = P1;//定义LDC1602数据端口sbit rs = P0^3;//定义LDC1602控制端口sbit rw = P0^4;sbit en = P0^5;sbit SR501_1 = P0^6;//定义两红外个人体感应模块sbit SR501_2 = P0^7;sbit light1 = P2^0;//定义三个光敏传感器,采用DO模式,与控制灯的继电器一一对应sbit light2 = P2^1;sbit light3 = P2^2;sbit MQ_1 = P2^3;//定义烟雾传感器,低电平有效sbit MQ_vcc = P2^4;sbit buzzer = P2^5;//定义蜂鸣器u8 people = 0;//人的个数u8 num = 0;u8 temp = 1;//烟雾模块取值存放void delay(u16 num)//延时函数,延时时间=num*1ms{u8 x,y;for(x=num; x>0; x--)for(y=110; y>0; y--){;//延时1ms}}void write_cmd (u8 cmd)//LDC1602命令指令输入 {rs = 0;rw = 0;P1 = cmd; //如果换成  DATA = cmd; 报错为什么delay(5);en = 1;delay(5);en = 0;}void write_data (u8 dat)//LDC1602数据指令输入 {rs = 1;rw = 0;P1 = dat;delay(5);en = 1;delay(5);en = 0;}void lcd_init (void)//LDC1602初始化操作 {write_cmd(0x02);write_cmd(0x06);write_cmd(0x0c);write_cmd(0x38);write_cmd(0x01);}u8 read_bit (u8 *ptr)//读端口操作,输入参数ptr是之前定义的端口地址,返回参数是char类型的{        //我用的是51单片机,读端口要防抖动,不想每次都写,所以写了这个子函数 u8 temp = 0; //但是调用出错,而且还是第一个报错,屏蔽没用他会让屏蔽后的第一次调用报错temp = ptr;if (temp != 0) {delay(5);temp = ptr;if (temp != 0){  temp = ptr;  return temp;}}}void SR501_read(void)//检测人员进出个数{u8 num1,num2;num1 = read_bit(SR501_1);//这里的SR501_1是我sbit定义的端口,这个变量不应该是个地址吗num2 = read_bit(SR501_1);//有人为高电平,没人低电平num2 = num2 << 1;//此处人体感应模块二左移做高位,人体感应模块一做地位,链接实际电路再做调整num2 = num2 || num1;switch (num2){//通过判断num2取值大小决定人员进入或出去case 0:break ;case 1:people++;break;case 2:if (people != 0)people--;break;case 3:break;default:break;}}void smart_sw(void){u8 num1,num2,num3;num1 = read_bit(light1);//光强度低于光敏传感器高电平,光强度高于光敏传感器低电平num2 = read_bit(light2);num3 = read_bit(light3);if (people != 0)//如果有人,那么一个光敏传感器控制一个灯{led1 != num1;led2 != num2;led3 != num3;}else if(people == 0)//如果没人,灯全部熄灭{led1 = led2 = led3 = 1;//连等不成立的话分开写} } void init_MQ(void)//中断初始化,烟雾模块要很长时间预热才稳定,用定时器中断取值{    TMOD = 0x01;    TH0 = 0xd8;    TL0 = 0xf0;    EA = 1;    ET0 = 1;    TR0 = 1;MQ_vcc = 1;}void main (void){rw = 0;//初始化LDC1602rs = 0;en = 0;lcd_init();write_cmd(0xc0);//定义光标位置(起始输入位置)SR501_1 = 0;//初始化两个人体感应模块SR501_2 = 0;led1 = led2 = led3 = 1;//初始化灯MQ_vcc = 0;while(1) //大循环{write_data('I');//输入显示数据SR501_read();//检测人员进出个数smart_sw();//智能开关灯init_MQ();//烟雾报警检测}}void MQ_interrupt(void) interrupt 1{TH0 = 0xd8;    TL0 = 0xf0;num++;if(num == 100){temp = MQ_1;num = 0;if (temp == 0)//发生火警{temp = 1;//temp重置led1 = led2 = led3 = 1;//开灯power = 0;//断电}}    }
查看完整描述

2 回答

?
慕沐8561609

TA贡献1条经验 获得超0个赞

#difine  DATA  P1  应该这样定义吧

查看完整回答
反对 回复 2018-08-16
?
AAnonymous

TA贡献62条经验 获得超31个赞

#define 就是纯粹的替换

你这么定义DATA
#define DATA =P1;
下面用的时候写
DATA = cmd;
编译的时候就会被编译器替换为
=P1; = cmd;


查看完整回答
反对 回复 2018-07-31
  • 慕田峪6419932
    慕田峪6419932
    w我用的keil,换成 DATA = cmd; 报错:MAIN.C(45): error C141: syntax error near '=',不知道什么原因
  • AAnonymous
    AAnonymous
    #define DATA P1 试试
  • 慕田峪6419932
    慕田峪6419932
    这样就ok了 ,主要是第二个问题那个指针用法对吗,为什么调用出错?
  • 2 回答
  • 3 关注
  • 1290 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信