用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条回答
辛昕
1楼-- · 2019-03-26 11:56

你说的是啥,我没听懂.....
敢情你的意思是我写1是零,写零还是零?
辛昕
2楼-- · 2019-03-26 13:22
 精彩回答 2  元偷偷看……
wshwan
3楼-- · 2019-03-26 18:52
“镭射”应该说清楚了呀。SPSTAT寄存器中的SPIF标志位是SPI 传输完成标志,当一次串行传输完成时,SPIF 置位;当SPI 处于主模式且SSIG=0 时,如果/SS 为输入
并被驱动为低电平,SPIF 也将置位。注意“SPIF标志通过软件向其写入1清零”。也就是说当你给它写1的时候,实际上是清楚该标志位(即使该标志位当前为1,执行该条指令后也会被清为零),那下条指令读出来的当然是零。同时,从数据手册上可以看出,单片机复位后该标志位也为零。WCOL位也是同样的道理。对于单片机的保留位,在没有明确说明的情况下,读出来的大多数为零(在其他型号单片机上试过),故你这程序表现出来的也就是全亮了。
wshwan
4楼-- · 2019-03-26 22:27
补充一下:如果该SPIF位已经置位了,从数据手册上看,当你写0的时候是不会影响该标志位的。如果是采用中断的方式,中断服务子程序中是需要写1来清除该标志位的,否则会不停的产生中断(其它信号的单片机上有试过)。对于datasheet上明确说明硬件清除或没有特别说明需软件清除的情况下,往往在中断服务子程序中就不需要软件去清除了。一旦进入中断服务子程序,单片机就会自动清除该中断标志位的。
li1323500
5楼-- · 2019-03-27 01:04
那单片机控制SPI串口数据的寄存器不是有3个吗?1、spctl  2、spstat  3、spdat
  spctl  为控制寄存器,你那程序里好像没有设置吧  ; spstat  为状态寄存器  只能读  ;
spdat 为数据寄存器,读写的数据的值都是这个入口/出口啊。你那程序好像也没有写到啊。
还是仔细看下那PDF资料吧。
li1323500
6楼-- · 2019-03-27 05:41
我那SPSTAT寄存器也没看清楚,它相当于UART的SCON寄存器的低两位一样,是一标志寄存器。满足一定要求是就置为位某位,软件上通过判断这些标志来决定程序的执行方向。而SPDAT寄存器就相当于UART串口通信的SUBF,读写数据都要通过它来传递到引脚上。

一周热门 更多>