找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5332|回复: 1
打印 上一主题 下一主题
收起左侧

error C267: 'AT24C04_SendByte': requires ANSI-style prototype?大神帮帮忙

[复制链接]
跳转到指定楼层
楼主
ID:205378 发表于 2017-5-30 16:35 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
#include <common.h>
#define uchar unsigned char
float v_low = 2.8;//电压范围下限
float v_high = 4.5;//电压范围上限
uchar BUF[2];//从at24c04中读取的数据存储在这
uchar w_buf[2]; //写入at24c04中的数据存在这里

//延时函数大约1ms
void delay_ms(int ms)
{
int i;
while(ms--)
{
for(i=0;i<100;i++);
}
}

//连续写入两个数据
void AT24C04_Write(uchar dat_1,uchar dat_2)
{
AT24C04_Start(); //起始信号
AT24C04_SendByte(0xa0); //发送设备地址+写信号
AT24C04_SendByte(0x00); //发送存储单元地址
AT24C04_SendByte(dat_1); //写入数据1
AT24C04_SendByte(dat_2); //写入数据2
AT24C04_Stop(); //停止信号
}

//连续读出两个数据
void AT24C04_ReadPage()
{
uchar i;
AT24C04_Start(); //起始信号
AT24C04_SendByte(0xa0); //发送设备地址+写信号
AT24C04_SendByte(0x00); //发送存储单元地址
AT24C04_Start(); //起始信号
AT24C04_SendByte(0xa1); //发送设备地址+读信号
for (i=0; i<2; i++)
{
BUF[i] = AT24C04_RecvByte();
if (i == 1)
{
AT24C04_SendACK(1); //最后一个数据需要会NAK
}
else
{
AT24C04_SendACK(0); //回应ACK
}
}
AT24C04_Stop(); //停止信号
}

//LCD显示数字处理函数
void show_num(uchar num,uchar flag)
{
uchar temp[3],i;
float re_val;//电压实际值
float read_low,read_h; //将从AT24C04中读取电压范围数据转化成对应小数形式

re_val = num/255.0*5.0; //实际电压计算公式

num = re_val*10; //保留一位小数

AT24C04_ReadPage();//从AT24C04中读取电压范围数据,存储在BUF数组中
// BUF[0]表示下限,BUF[1]表示上限
//存入AT24C04中的数据是uchar unsigned型,在这里转化成float型
read_low =BUF[0]/10.0;
read_h= BUF[1]/10.0;
if(re_val >= read_low && re_val <= read_h) //如果电压在范围内
{
temp[0] = num/10 + '0';
temp[1] = '.';
temp[2] = num%10 + '0';
}else if(re_val < read_low ) //如果低于设定值
{
temp[0] = 'L';
temp[1] = 'O';
temp[2] = 'W';
}else if(re_val > read_h ) //如果高于设定值
{
temp[0] = 'H';
temp[1] = 'I';
temp[2] = 'G';
}

for(i=0;i<3;i++)//用液晶显示结果
{
LCD_Manifest(flag,3+i,temp[i]);
}

//显示电压范围的上限
num = read_h * 10;
temp[0] = num/10 + '0';
temp[1] = '.';
temp[2] = num%10 + '0';
for(i=0;i<3;i++)//用液晶显示结果
{
LCD_Manifest(1,12+i,temp[i]);
}

//显示电压范围的下限
num = read_low * 10;
temp[0] = num/10 + '0';
temp[1] = '.';
temp[2] = num%10 + '0';
for(i=0;i<3;i++)//用液晶显示结果
{
LCD_Manifest(2,12+i,temp[i]);
}
}

//主函数
void main()
{
uchar val;//电压值

LCD_Init(); //液晶初始化
IIC_Init();//I2C总线初始化

w_buf[0] =v_low*10;
w_buf[1] =v_high*10;
AT24C04_Write(w_buf[0],w_buf[1]); //将数据写入AT24C04

LCD_Manifest(1,0,'V');//在lcd1602中显示字符
LCD_Manifest(1,1,'1');
LCD_Manifest(1,2,':');
LCD_Manifest(2,0,'V');
LCD_Manifest(2,1,'2');
LCD_Manifest(2,2,':');

LCD_Manifest(1,10,'H');
LCD_Manifest(1,11,':');
LCD_Manifest(2,10,'L');
LCD_Manifest(2,11,':');


while(1)
{
//按键检测程序
if(key_1 == 0)//调节范围的下限
{
delay_ms(100); //延时消除抖动
if(key_1 == 0)
{
//v_low = v_low - 0.1;
// if(v_low < 0.0)
//v_low = v_high;

w_buf[0] =v_low*10;
w_buf[1] =v_high*10;
AT24C04_Write(w_buf[0],w_buf[1]); //将数据写入AT24C04
}
}
if(key_2 == 0)//调节范围的上限
{
delay_ms(100); //延时消除抖动
if(key_2 == 0)
{
v_high = v_high + 0.1;
if(v_high > 5.0)
v_high = v_low;

w_buf[0] =v_low*10;
w_buf[1] =v_high*10;
AT24C04_Write(w_buf[0],w_buf[1]); //将数据写入AT24C04
}
}


ADC_Send_Byte(0x90,0x41);//通道一ADC转换
val=ADC_Receive_Byte(0x90);//读取AD转换的值
show_num(val,1);
ADC_Send_Byte(0x90,0x42);//通道二ADC转换
val=ADC_Receive_Byte(0x90);//读取AD转换的值
show_num(val,2);


}
}

#include<iic.h>
void IIC_Init()//总线初始化
{

SCL=1;
IIC_DELAY();
SDA=1;
IIC_DELAY();
}
void IIC_Start() //启动信号
{

SDA=1;
IIC_DELAY();
SCL=1;
IIC_DELAY();
SDA=0;
IIC_DELAY();
}
void IIC_Stop()//停止信号
{

SDA=0;
IIC_DELAY();
SCL=1;
IIC_DELAY();
SDA=1;
IIC_DELAY();
}
void IIC_Ack() //应答信号
{
unsigned char i;
SCL=1;
IIC_DELAY();;
while((SDA==1)&&(i<255))i++;
SCL=0;
IIC_DELAY();
}
void IIC_Write_Byte(u8 date)//写一个字节
{
u8 i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
IIC_DELAY();
SDA=CY;//最高位将移入PSW寄存器的CY位中,然后将CY赋给SDA
IIC_DELAY();
SCL=1;
IIC_DELAY();
}
SCL=0;
IIC_DELAY();
SDA=1;
IIC_DELAY();
}
u8 IIC_Read_Byte()//读一个字节
{
u8 i,temp;
for(i=0;i<8;i++)
{
SCL=0;
IIC_DELAY();
temp=(temp<<1)|SDA;
IIC_DELAY();
SCL=1;
IIC_DELAY();
}
SCL=0;
IIC_DELAY();
SDA=1;
IIC_DELAY();
return temp;
}
#include <reg51.h>
#include"lcd1602.h"
void delay(u8 z)//延时函数
{
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}


void LCD_Write_Cmd(u8 com )//液晶写命令
{
LCD_RS=0;//选择写命令模式
LCD_dat=com;//将要写的命令字送到数据总线上
delay(1);
LCD_E=1;//使能端给一高脉冲,高脉冲有效
delay(1);
LCD_E=0;
}
void LCD_Write_Data(u8 date)//数据写命令
{
LCD_RS=1;//选择写数据模式
LCD_dat=date;
delay(1);
LCD_E=1;//使能端给一高脉冲,高脉冲有效
delay(1);
LCD_E=0;
}
void LCD_Init()//液晶初始化
{

LCD_WR=0;
LCD_Write_Cmd(0x38);//设置16*2显示,5*7点阵,8位数据接口
LCD_Write_Cmd(0x0c);//设置开显示,不显示光标
LCD_Write_Cmd(0x06);//写一个字符后地址指针自动加1

LCD_Write_Cmd(0x80);//数据指针定位到第一行第一个字处

}
// 使得写命令和写数据通过一个函数完成
void LCD_Manifest(u8 row,u8 add,u8 date)
{
if(row==1) LCD_Write_Cmd(0x80+add);
if(row==2)LCD_Write_Cmd(0xc0+add);
LCD_Write_Data(date);
}
#include"iic.h"
#include"pcf8591.h"

//ADC发送字节[命令]数据函数
void ADC_Send_Byte(u8 addr,u8 com)
{
IIC_Start();//启动总线
IIC_Write_Byte(addr);//发送器件地址
IIC_Ack();
IIC_Write_Byte(com);//发送数据
IIC_Ack();
IIC_Stop();//结束总线
}

//ADC读字节数据函数
u8 ADC_Receive_Byte(u8 addr)
{
u8 c;
IIC_Start();//启动总线
IIC_Write_Byte(addr+1);      //发送器件地址,如果是读则最低位为1即0x91
IIC_Ack();
c=IIC_Read_Byte(); //读取数据

IIC_Ack(); //发送非就答位
IIC_Stop();//结束总线
return(c);
}
#include"AT24C04.h"
void Delay5us()
{
BYTE n = 4;
while (n--)
{
_nop_();
_nop_();
}
}
void Delay5ms()
{
WORD n = 2500;
while (n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void AT24C04_Start()
{
AT_SDA = 1; //拉高数据线
AT_SCL = 1; //拉高时钟线
Delay5us(); //延时
AT_SDA = 0; //产生下降沿
Delay5us(); //延时
AT_SCL = 0; //拉低时钟线
}
void AT24C04_Stop()
{
AT_SDA = 0; //拉低数据线
AT_SCL = 1; //拉高时钟线
Delay5us(); //延时
AT_SDA = 1; //产生上升沿
Delay5us(); //延时
}
void AT24C04_SendACK(bit ack)
{
AT_SDA = ack; //写应答信号
AT_SCL = 1; //拉高时钟线
Delay5us(); //延时
AT_SCL = 0; //拉低时钟线
Delay5us(); //延时
}
bit AT24C04_RecvACK()
{
AT_SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = AT_SDA; //读应答信号
AT_SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
void AT24C04_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
AT_SDA = CY; //送数据口
AT_SCL = 1; //拉高时钟线
Delay5us(); //延时
AT_SCL = 0; //拉低时钟线
Delay5us(); //延时
}
AT24C04_RecvACK();
}
BYTE AT24C04_RecvByte()
{
BYTE i;
BYTE dat = 0;
AT_SDA = 1; //使能内部上拉,准备读取数据
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
AT_SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= AT_SDA; //读数据
AT_SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:205378 发表于 2017-5-31 16:43 | 显示全部楼层
有没有大神在线等,指点迷津
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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