DYyanfa 2024-04-09 10:42 采纳率: 31.3%
浏览 4

编译提示不能打开"Uart.h"

编译过程中,总是提示不能打开"UART.h",但是"UART.h"文件是存在的

#define  _RTC_C

#include "reg52.h"
#include "intrins.h"
#include "Uart.h"

#define I2CDelay()  {_nop_();_nop_();_nop_();_nop_();}
sbit RTC_INT = P1^3;
sbit RTC_SDA = P1^4;
sbit RTC_SCL = P1^5;

void DateCheck();
void InitINS8130();
unsigned char INSReadByte(unsigned char addr);
void INSWriteByte(unsigned char addr, unsigned char dat);
void I2CStart();
void I2CStop();    
bit I2CWrite(unsigned char dat);
unsigned char I2CReadNAK();
unsigned char I2CReadACK();

void DateCheck()
{
    unsigned char i;
    unsigned char time[8];
    unsigned char flag;
    flag = INSReadByte(0x1D); //读取Flag registers寄存器
    if((flag & 0x20) != 0) //判断UF位是否为1,1表示有时间更新
    {    
        for(i=0;i<7;i++) //time6-0存放年、月、日、周、时、分、秒
        {
            time[i] = INSReadByte(0x10 + i);//0x10为SEC起始地址
            UartSend(time[i]); //发送年月日时分秒
        }
        INSWriteByte(0x1D,0x06);//UF位清零,写入寄存器默认值0x06
    }
}
void InitINS8130()
{
    unsigned char i;
    unsigned char code InitTime[] = {0x00,0x30,0x12,0x01,0x01,0x01,0x24};
    for(i=0; i<7; i++) //设置初始时间为24年01月01日 周1 12点30分00秒
    {
        E2WriteByte(0x10 + i, InitTime[i]);
    }
}
unsigned char INSReadByte(unsigned char addr)
{
    do{
        I2CStart();//步骤1:发送起始条件
        if(I2CWrite(0x32<<1)) //步骤2和3:发送写模式和地址,验证ACK信号
        {
            break;
        }
        I2CStop();
    }while(1);
    do
    {
        if(I2CWrite(addr))//步骤4和5:发送8130读取地址,验证ACK信号
        {
            break;
        }
    }while(1);
    I2CStart(); //步骤6:发送RESTART
    do{
        if(I2CWrite((0x32 << 1) | 0x01))//步骤7和8:发送读模式和地址;验证ACK信号
        {
            break;
        }
    }
    dat = I2CReadNAK();//步骤9:CPU读取数据
    I2CStop();
    return dat;
}
void INSWriteByte(unsigned char addr, unsigned char dat)//单字节写入
{
    do{
        I2CStart();//步骤1:发送启动条件
        if(I2CWrite(0x32<<1))//步骤2和3:发送从地址和写模式,验证ACK信号。RTC地址0b0110010
        {
            break;
        }
        I2CStop();
    }while(1);
    do{
        if(I2CWrite(addr))//步骤4和5:发送写地址,验证ACK信号
        {
            break;
        }
    }while(1);
    
    do{
        if(I2CWrite(dat))//步骤6和7:写入数据到addr
        {
            break;
        }
    }while(1);
    I2CStop();    
}
void I2CStart()
{
    RTC_SDA = 1; //首先确保SDASCL都是高电平
    RTC_SCL = 1;
    I2CDelay();
    RTC_SDA = 0; //先拉低SDA
    I2CDelay();
    RTC_SCL = 0; //再拉低SCL
}
void I2CStop()
{
    RTC_SCL = 0; //首先确保SDASCL都是低电平
    RTC_SDA = 0;
    I2CDelay();
    RTC_SCL = 1; //先拉高SCL
    I2CDelay();
    RTC_SDA = 1; //再拉高SDA
    I2CDelay();
}
/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */
bit I2CWrite(unsigned char dat)
{
    bit ack;  //用于暂存应答位的值
    unsigned char mask;  //用于探测字节内某一位值的掩码变量

    for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行
    {
        if ((mask&dat) == 0)  //该位的值输出到SDARTC_SDA = 0;
        else
            RTC_SDA = 1;
        I2CDelay();
        RTC_SCL = 1;          //拉高SCL
        I2CDelay();
        RTC_SCL = 0;          //再拉低SCL,完成一个位周期
    }
    RTC_SDA = 1;   //8位数据发送完后,主机释放SDA,以检测从机应答
    I2CDelay();
    RTC_SCL = 1;   //拉高SCL
    ack = RTC_SDA; //读取此时的SDA值,即为从机的应答值
    I2CDelay();
    RTC_SCL = 0;   //再拉低SCL完成应答位,并保持住总线

    return (~ack); //应答值取反以符合通常的逻辑:
                   //0=不存在或忙或写入失败,1=存在且空闲或写入成功
}
unsigned char I2CReadNAK()
{
    unsigned char mask;
    unsigned char dat;

    RTC_SDA = 1;
    for(mask=0x80; mask!=0; mask>>=1)
    {
        I2CDelay();
        RTC_SCL = 1;
        if(RTC_SDA == 0)
            dat &= ~mask;
        else
            dat |= mask;
        I2CDelay();
        RTC_SCL = 0;
    }
    RTC_SDA = 1;
    I2CDelay();
    RTC_SCL = 1;
    I2CDelay();
    RTC_SCL = 0;

    return dat;
}

unsigned char I2CReadACK()
{
    unsigned char mask;
    unsigned char dat;

    RTC_SDA = 1;
    for(mask=0x80; mask!=0; mask>>=1)
    {
        I2CDelay();
        RTC_SCL = 1;
        if(RTC_SDA == 0)
            dat &= ~mask;
        else
            dat |= mask;
        I2CDelay();
        RTC_SCL = 0;
    }
    RTC_SDA = 0;
    I2CDelay();
    RTC_SCL = 1;
    I2CDelay();
    RTC_SCL = 0;

    return dat;
}



  • 写回答

4条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-09 10:42
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:编译过程中,总是提示不能打开"UART.h",但是"UART.h"文件是存在的。 分析:从代码中可以看出,程序中没有包含"UART.h"文件,但是在程序中使用了"UartSend()"函数,由此推断"UartSend()"函数的定义可能在"UART.h"文件中。 解决方法:在程序中添加#include "UART.h"语句,将"UART.h"文件包含进来。另外,需要检查一下"UART.h"文件路径是否正确,确保该文件在程序所在的文件夹中。 示例代码: #include #include #include "Uart.h" #define I2CDelay() {_nop_();_nop_();_nop_();_nop_();} sbit RTC_INT = P1^3; sbit RTC_SDA = P1^4; sbit RTC_SCL = P1^5; void DateCheck(); void InitINS8130(); unsigned char INSReadByte(unsigned char addr); void INSWriteByte(unsigned char addr, unsigned char dat); void I2CStart(); void I2CStop(); void DateCheck(){ unsigned char i; unsigned char time[8]; unsigned char flag; flag = INSReadByte(0x1D); //读取Flag registers寄存器 if((flag & 0x20) != 0) //判断UF位是否为1,1表示有时间更新 { for(i=0;i<7;i++) //time6-0存放年、月、日、周、时、分、秒 { time[i] = INSReadByte(0x10 + i);//0x10为SEC起始地址 UartSend(time[i]); //发送年月日时分秒 } INSWriteByte(0x1D,0x06);//UF位清零,写入寄存器默认值0x06 } } void InitINS8130(){ unsigned char i; unsigned char code InitTime[] = {0x00,0x30,0x12,0x01,0x01,0x01,0x24}; for(i=0; i<7; i++) //设置初始时间为24年01月01日 周1 12点30分00秒 { E2WriteByte(0x10 + i, InitTime[i]); } } unsigned char INSReadByte(unsigned char addr){ do{ I2CStart();//步骤1:发送起始条件 if(I2CWrite(0x32<<1)) //步骤2和3:发送写模式和地址,验证ACK信号 { break; } I2CStop(); }while(1); do{ if(I2CWrite(addr))//步骤4和5:发送8130读取地址,验证ACK信号 { break; } }while(1); I2CStart(); //步骤6:发送RESTART do{ if(I2CWrite((0x32 << 1) | 0x01))//步骤7和8:发送读模式和地址;验证ACK信号 { break; } }while(1); dat = I2CReadNAK();//步骤9:CPU读取数据 I2CStop(); return dat; } void INSWriteByte(unsigned char addr, unsigned char dat)//单字节写入 { do{ I2CStart();//步骤1:发送启动条件 if(I2CWrite(0x32<<1))//步骤2和3:发送从地址和写模式,验证ACK信号。RTC地址0b0110010 { break; } I2CStop(); }while(1); do{ if(I2CWrite(addr))//步骤4和5:发送写地址,验证ACK信号 { break; } }while(1); do{ if(I2CWrite(dat))//步骤6和7:写入数据到addr { break; } }while(1); I2CStop(); } void I2CStart(){ RTC_SDA = 1; //首先确保SDA、SCL都是高电平 RTC_SCL = 1; I2CDelay(); RTC_SDA = 0; //先拉低SDA I2CDelay(); RTC_SCL = 0; //再拉低SCL } void I2CStop(){ RTC_SCL = 0; //首先确保SDA、SCL都是低电平 RTC_SDA = 0; I2CDelay(); RTC_SCL = 1; //先拉高SCL I2CDelay(); RTC_SDA = 1; //再拉高SDA I2CDelay(); } /* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */ bit I2CWrite(unsigned char dat){ bit ack; //用于暂存应答位的值 unsigned char mask; //用于探测字节内某一位值的掩码变量 for (mask=0x80; mask!=0; mask>>=1) //逐位写数据 { RTC_SCL = 0; //拉低SCL if(dat & mask) //根据mask计算出应该写入什么值 { RTC_SDA = 1; } else { RTC_SDA = 0; } I2CDelay(); RTC_SCL = 1; //拉高SCL I2CDelay(); } RTC_SCL = 0; //拉低SCL RTC_SDA = 1; //释放SDA引脚 I2CDelay(); RTC_SCL = 1; //再拉高SCL I2CDelay(); ack = !RTC_SDA; //读取从机应答位的值 RTC_SCL = 0; //拉低SCL return ack; } unsigned char I2CReadNAK(){ unsigned char mask; unsigned char dat=0; RTC_SDA = 1; //释放SDA引脚 for(mask=0x80; mask!=0; mask>>=1) //逐位读取数据 { RTC_SCL = 1; //拉高SCL I2CDelay(); if(RTC_SDA) //根据SDA引脚值计算出应该读取什么值 { dat |= mask; } RTC_SCL = 0; //拉低SCL I2CDelay(); } RTC_SDA = 1; //释放SDA引脚 I2CDelay(); return dat; }
    评论

报告相同问题?

问题事件

  • 创建了问题 4月9日

悬赏问题

  • ¥15 Qt移植后在开发板上无法运行
  • ¥15 关于STID337-32D15YB开发板LINUX调试
  • ¥15 有没有熟悉自动化点胶设备,有个加密狗,想复制一份软件到另个设备
  • ¥15 mysql 部分截取字符串
  • ¥15 关于unity角色打包ab问题
  • ¥20 只有一个C盘,磁盘管理分区
  • ¥15 PVE8.2版本ceph的监控项状态stopped不能销毁
  • ¥15 如何加快视频观看速度?
  • ¥15 HP P2000存储 硬盘损坏两块如何更换
  • ¥15 c#的richTextBox控件有更好的替代品吗