打印

什么功能?

[复制链接]
1258|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llia|  楼主 | 2023-1-8 23:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在下面程序中,
uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1;//然后将RST(CE)置高电平。
        _nop_();

        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

        RST = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;        
}

   dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?

使用特权

评论回复
沙发
llia|  楼主 | 2023-1-8 23:25 | 只看该作者
dat1 = DSIO;//从最低位开始接收,数据明明是给了dat1,但是最后return 的数据 却是  dat ?

使用特权

评论回复
板凳
huangchui| | 2023-1-8 23:27 | 只看该作者

dat=(dat>>1)|(dat1<<7),dat=(dat按位右移1位)相或同假为假一真即真|(dat1按位左移7位)

使用特权

评论回复
地板
jiajs| | 2023-1-8 23:27 | 只看该作者
boot完后执行S/W reset命令即可跳转到AP区域去执行应用程序

使用特权

评论回复
5
yszong| | 2023-1-8 23:29 | 只看该作者
dat右移1位,左侧空位补0;dat1左移7位,右侧空位补0,将两个结果按位或运算,赋值给dat

使用特权

评论回复
6
kangzj| | 2023-1-8 23:32 | 只看该作者
你的程序最后一句话写的是return dat;如果想返回dat1,就写return dat1;

使用特权

评论回复
7
songqian17| | 2023-1-8 23:34 | 只看该作者
for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

使用特权

评论回复
8
pengf| | 2023-1-8 23:36 | 只看该作者

dat>>1,右移一位,高1位补零,变成0XXXXXXX。dat1<<7左移七位,低7位补零,变成X0000000,

使用特权

评论回复
9
zhenykun| | 2023-1-8 23:37 | 只看该作者
dat = (dat>>1) | (dat1<<7)  就是dat右移一位, dat1左移7位,当两个条件任何一个为真时,结果为1.

使用特权

评论回复
10
zwll| | 2023-1-9 23:25 | 只看该作者
晶振电压为电源电压一半   示波器测晶振波形

使用特权

评论回复
11
renyaq| | 2023-1-9 23:28 | 只看该作者
如果真的是AT89C2051,即使降低时钟频率,功耗也低不了多少。在时钟停止时,还有十几个mA的电流呢。

使用特权

评论回复
12
huangchui| | 2023-1-9 23:30 | 只看该作者
看数据手册就按一下负载电容大小,我们用的时候是12p的

使用特权

评论回复
13
yufe| | 2023-1-9 23:32 | 只看该作者

看数据手册就按一下负载电容大小,我们用的时候是12p的

使用特权

评论回复
14
zhuhuis| | 2023-1-9 23:35 | 只看该作者
从表面上看,应该是代码的问题,和别的没有什么关系的。一定是代码出现问题了。

使用特权

评论回复
15
zhuhuis| | 2023-1-9 23:37 | 只看该作者
我感觉是你的程序或者代码哪里出现了问题,别的好像没有什么问题的。

使用特权

评论回复
16
tpgf| | 2023-2-3 09:17 | 只看该作者
假如dat=00001010B,dat1=00000001B,其中B是二进制的意思,dat>>1意思是右移一位,dat=00001010B右移一位=00000101B。dat1<<7意思是左移七位,dat1=00000001B左移七位=10000000B。(dat>>1) | (dat1<<7)意思是括号中的两个数进行“或”运算。在不能理解的情况下可以把它简单理解为相加,(dat>>1) | (dat1<<7)=(00000101B) | (10000000B)=(00000101B) + (10000000B)= 10000101B=133。可以用十进制运算来验证一下,00000101B=5,10000000B=128,00000101B+10000000B=5+128=133,运算结果是相等的。

使用特权

评论回复
17
nawu| | 2023-2-3 09:28 | 只看该作者

温度是单总线的,一个温度值需要读8次,显然dat1只有最低位有效,通过(dat1<<7)将有效位移至最高位,然后在(dat)的最高位。通过8次移位,正好将8次读到的值赋值到dat。

使用特权

评论回复
18
aoyi| | 2023-2-3 09:36 | 只看该作者
dat>>1,右移一位,高1位补零,变成0XXXXXXX。
dat1<<7左移七位,低7位补零,变成X0000000,
(dat>>1)|(dat1<<7),逐位或,即相当于取前者后7位,取后者前1位,构成8位。
dat=(dat>>1)|(dat1<<7),新构成的8位给dat‘
最终结果就是:取dat前7位作其后7位,而取dat1后1位代替dat的高1位。

使用特权

评论回复
19
zljiu| | 2023-2-3 09:51 | 只看该作者
因为DS1302是从低位开始读取的,首先把最低位读取出来,dat = (dat>>1) | (dat1<<7);dat1向左移动7位,放在最高位。而dat是要读取的数据嘛,不断向右移动,8次就读完。不断的或运算就能把最终的dat读出,可以认为dat1就是一个中间变量把。

使用特权

评论回复
20
gwsan| | 2023-2-3 10:21 | 只看该作者
你要看看它的电路与你以前有什么不同

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

961

主题

8893

帖子

4

粉丝