2566|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教:为何keil 8编译后运行正常,模式0编译后结果错误? [复制链接]

#include
#include   //包含_nop_()函数定义的头文件

/*****************************************************
基础函数功能:延时5ns
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
#define DELAYNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();};   

/*****************************************************
基础函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
           unsigned char i,j;
          for(i=0;i<10;i++)
        {
                   for(j=0;j<33;j++)
                {
                }
    }
}
/*****************************************************
基础函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(unsigned char m_ms)
{
           unsigned char i;
        for(i=0;i         {
            delay1ms();
        }
}
/*****************************************************
基础函数功能:延时若干秒
入口参数:n
***************************************************/
void delays(unsigned char m_s)
{
           unsigned char i;
        for(i=0;i         {
            delaynms(1000);
        }
}

//*****************************************************
//x5045子程序
//*****************************************************

sbit SCK=P2^2;       //将SCK位定义为P2.引脚
sbit SI=P2^3;        //将SI位定义为P2.3引脚
sbit SO=P2^5;        //将SO位定义为P2.5引脚
sbit CS=P2^4;        //将CS位定义为P2.4引脚

#define WREN 0x06    //写使能锁存器允许
#define WRDI 0x04    //写使能锁存器禁止
#define WRSR 0x01    //写状态寄存器
#define READ 0x03    //读出
#define WRITE 0x02   //写入

/*****************************************************
函数功能:从X5045的当前地址读出数据
出口参数:x
***************************************************/
unsigned char ReadCurrent(void)
{
           unsigned char i;
        unsigned char x=0x00;      // 储存从X5045中读出的数据
        SCK=1;                     // 将SCK置于已知的高电平状态
    DELAYNOP();                // 延时5us
       
        for(i = 0; i < 8; i++)
        {
            SCK=1;                 // 拉高SCK
            DELAYNOP();            // 延时5us
            SCK=0;                 // 在SCK的下降沿输出数据
             DELAYNOP();            // 延时5us
                   x<<=1;                 // 将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据   
                  x|=(unsigned char)SO;  // 将SO上的数据通过按位“或“运算存入 x     
                   DELAYNOP();            // 延时5us
        }
        return(x);                 // 将读取的数据返回
}
/*****************************************************
函数功能:写数据到X5045的当前地址
入口参数:dat
***************************************************/
void WriteCurrent(unsigned char m_writedata)
{
           unsigned char i;
        SCK=0;                             // 将SCK置于已知的低电平状态
           DELAYNOP();                        // 延时5us
        for(i = 0; i < 8; i++)             // 循环移入8个位
        {
                  SI=(bit)(m_writedata&0x80);    // 通过按位“与”运算将最高位数据送到S
                                                 // 因为传送时高位在前,低位在后
                   DELAYNOP();                    // 延时5us
                  SCK=0;
            DELAYNOP();                    // 延时5us
                  SCK=1;                         // 在SCK上升沿写入数据
            DELAYNOP();                    // 延时5us
            m_writedata<<=1;               // 将y中的各二进位向左移一位,因为首先写入的是字节的最高位
  }
}
/*****************************************************
函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护
入口参数:rs;  //储存寄存器状态值
***************************************************/
void WriteSR(unsigned char m_WriteRs)
{
           DELAYNOP();                   // 延时5us
          CS=0;                         // 拉低CS,选中X5045
          WriteCurrent(WREN);           // 写使能锁存器允许
          CS=1;                         // 拉高CS
          CS=0;                         // 重新拉低CS,否则下面的写寄存器状态指令将被丢弃
          WriteCurrent(WRSR);           // 写状态寄存器
          WriteCurrent(m_WriteRs);      // 写入新设定的寄存器状态值
          CS=1;                         // 拉高CS
}
/*****************************************************
函数功能:写数据到X5045的指定地址
入口参数:addr
***************************************************/
void WriteSet(unsigned char m_WriteSetData,unsigned char m_WriteAddress)
{
           DELAYNOP();                       // 延时5us
           SCK=0;                            // 将SCK置于已知状态
           DELAYNOP();                       // 延时5us
           CS=0;                             // 拉低CS,选中X5045
           DELAYNOP();                       // 延时5us
        WriteCurrent(WREN);               // 写使能锁存器允许
           DELAYNOP();                       // 延时5us
        CS=1;                             // 拉高CS
           DELAYNOP();                       // 延时5us
           CS=0;                             // 重新拉低CS,否则下面的写入指令将被丢弃
           DELAYNOP();                       // 延时5us
        WriteCurrent(WRITE);              // 写入指令
           DELAYNOP();                       // 延时5us
        WriteCurrent(m_WriteAddress);     // 写入指定地址
           DELAYNOP();                       // 延时5us
        WriteCurrent(m_WriteSetData);     // 写入数据
           DELAYNOP();                       // 延时5us
        CS=1;                             // 拉高CS
           DELAYNOP();                       // 延时5us
           SCK=0;                            // 将SCK置于已知状态
}
/*****************************************************
函数功能:从X5045的指定地址读出数据
入口参数:addr
出口参数:dat
***************************************************/
unsigned char ReadSet(unsigned char m_ReadSetAdress)
{
        unsigned char m_ReadSetData;

           DELAYNOP();                       // 延时5us
        SCK=0;                            // 将SCK置于已知状态
           DELAYNOP();                       // 延时5us
        CS=0;                             // 拉低CS,选中X5045
        WriteCurrent(READ);               // 开始读
           DELAYNOP();                       // 延时5us
        WriteCurrent(m_ReadSetAdress);    // 写入指定地址
           DELAYNOP();                       // 延时5us
        m_ReadSetData=ReadCurrent();      // 读出数据
           DELAYNOP();                       // 延时5us
        CS=1;                             // 拉高CS
           DELAYNOP();                       // 延时5us
        SCK=0;                            // 将SCK置于已知状态
           DELAYNOP();                       // 延时5us
        return m_ReadSetData;             // 返回读出的数据
}

/*--------------------------------------
    读X5045状态
--------------------------------------*/
unsigned char X5045ReadStatus(void)
{
        unsigned char val;
        CS = 0;                    // 打开X5045片选
        DELAYNOP();                // 延时5us
        WriteCurrent(0x05);        // 发送读X5045状态命令
        val = ReadCurrent();       // 接收X5045状态数据
        CS = 1;                    // 打开X5045片选
        DELAYNOP();                // 延时5us
        return val;
}

/*****************************************************
函数功能:看门狗复位程序
***************************************************/
void WatchDog(void)
{
        CS=1;                  // 拉高CS
           DELAYNOP();            // 延时5us
        CS=0;                  // CS引脚的一个下降沿复位看门狗定时器
           DELAYNOP();            // 延时5us
        CS=1;                  // 拉高CS
           DELAYNOP();            // 延时5us
}

unsigned char m_ShowData;
unsigned char m_X5045Adress = 0x00;

main()
{
        WriteSR(0x12);        //写状态寄存器(设定看门狗溢出时间为600ms,写不保护)
          delaynms(10);         //X5045的写入周期约为10ms
       
        while(1)
        {
                delaynms(10);                             //X5045的写入周期约为10ms
                //WriteSet(0x56,m_X5045Adress);             //将数据m_ShowData”写入指定地址“0x00”
                  delaynms(10);                             //X5045的写入周期约为10ms

                  delaynms(100);                             //X5045的写入周期约为10ms
                m_ShowData = ReadSet(m_X5045Adress);      //将数据读出送显示
                m_ShowData = X5045ReadStatus();
                  delaynms(10);                             //X5045的写入周期约为10ms
        }
}
此帖出自51单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表