用STC单片机的朋友请进,凡实验并报告结果者赠送100芯币,斑竹无虚言

2019-03-24 19:49发布

首先,我想说,以下我说的这件事情,实在有点匪夷所思,大家可以认为是我糊涂了,或者喝醉了也不无不可(的确,刚才我郁闷了半天的确是买了一罐啤酒在喝)但是,我所看到的现象实在让我难以理解,所以请大家帮个忙,做做实验。我现在手上有3500多芯币,也就是说,我的芯币足以支付给35个朋友,而且我保证绝对不食言。事实上,这并不是一个很复杂的实验。
首先要求,你使用的51单片机最好是STC12C2052或者STC12C2052AD。至于用其他STC型号的朋友,我也会酌情考虑给芯币(我这个招集贴有点狠了,所以估计未来几日内我会瞬间破产,请大家原谅。)帖子标题不是骗人,只是有80字限制,我只能把具体型号压在这里
以下是程序,你会惊讶它如此简单。是的,我希望所有人都会发帖恶狠狠地骂我脑子给驴踢了。
#include<reg52.h>
sfr SPSTAT = 0x84;  //这就是一个简单的定义:定义SFR里地址为0x84的一个寄存器为SPSTAT,是的,如果你做过SPI通信你就知道,它是SPI三个寄存器之一,事实上,这次我正是在做SPI通信。
void main(void){ SPSTAT = 0xF3;   //简单的赋值       P1 = SPSTAT;          //通过P1口的流水灯,我只是想看一下0xF3而已...}
好了,在你做实验以前,是该让你知道,为啥我会发这么一个贴,并给出一个这么脑残的程序让大家测试了。
事情如我注释里所说,我本来在做SPI的通信,这是准备用在nRF24L01的操作里的,因为我没有做过SPI的,我决定先做一下SPI,确定我能通过SPI把数据传递出去(我在两个2052之间做通信)
可是,现在你们请忽略以上这些背景,因为,到最后,也是刚才,我做的只有一件事情。就是跑上面那个只有三句代码的破程序。
你猜猜我看到的P1流水灯是怎么个亮法?好吧我告诉你——全亮!全亮!!!我多希望我瞎了!!!我又尝试了一下把SPSTAT这个寄存器赋予其他地址,比如它附近的0x83,0x87,甚至在pdf里,空定义的0x80.我也试过,可是它们好好的,就是亮了两个灯(第3 和 第4位,当然是从LSB开始数起)
我开始产生一种奇怪的想法,当然这种想法,因为有过太多次的惨痛经验,我不敢说出来,也不敢去相信。但是我还是试了,我换了一块STC12C2052AD。(这是同一个系列的,差别只在多了一个AD,而且PDF里也是放在一起说的。)
可是,实验的结果一模一样!
面对这样的结果,我真的不知道该做何感想......但也许我真的糊涂了——是的,我经常犯一些极端的弱智错误,所以,我诚心诚意发帖,请求大家帮忙,测试测试。看看程序,也许你能一下看出问题何在。
对了,我们差点忘记,老姚在pdf里常说的一句话。说“STC的速度实在太快了,所以可能IO口的变化来不及......."那么,我又加试了下面这个程序#include<reg52.h>
sfr SPSTAT = 0x84;
void main(void){    char i = 0; SPSTAT = 0xF3;    for(i = 0; i < 40;i++)    {}       P1 = SPSTAT;    while(1);}我可以告诉你,结果一模一样
我想起,我之前忘了在第一个程序里加一个死循环,让单片机停在那里,嗯嗯......很值得怀疑哦(是吗?)没关系,我也给你试试#include<reg52.h>
sfr SPSTAT = 0x84;
void main(void){   SPSTAT = 0xF3;          P1 = SPSTAT;    while(1);
}
不好意思,我也希望它的结果会不一样......

-=----------------好了,童鞋们,大叔们,阿姨们,姐姐们......请帮我做这样一个实验吧.小弟无以为报,但还有3500个芯币。(当然了,你如果有兴趣,还可以把那128个RAM地址全试一遍,也许你会有更多新发现。当然,我也更希望,老姚会看到这个帖子,然后指教一下我这个后生,犯了什么错误)



此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
wshwan
2019-03-26 18:52
“镭射”应该说清楚了呀。SPSTAT寄存器中的SPIF标志位是SPI 传输完成标志,当一次串行传输完成时,SPIF 置位;当SPI 处于主模式且SSIG=0 时,如果/SS 为输入
并被驱动为低电平,SPIF 也将置位。注意“SPIF标志通过软件向其写入1清零”。也就是说当你给它写1的时候,实际上是清楚该标志位(即使该标志位当前为1,执行该条指令后也会被清为零),那下条指令读出来的当然是零。同时,从数据手册上可以看出,单片机复位后该标志位也为零。WCOL位也是同样的道理。对于单片机的保留位,在没有明确说明的情况下,读出来的大多数为零(在其他型号单片机上试过),故你这程序表现出来的也就是全亮了。

一周热门 更多>