用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条回答
chunyang
1楼-- · 2019-03-25 01:46
0x84地址是SPI的状态寄存器,该寄存器的低6位是不可操作的,上电后内容恒定且无意义,所以有此现象不怪,还是楼主看器件手册不够仔细造成的编程错误,编程并非语法正确就正确,还要满足硬件规范。
对于SPI接口,如果设计中采用TSSOP等小型封装且PCB设计紧凑,那么不一定非要用硬件SPI接口,更多的时候应先满足走线的便利性并尽量减少过孔,硬件SPI连线不方便时应就近连线同时采用软件虚拟SPI,虚拟SPI是非常容易且灵活的。
顺便一说,12C1052-5052(不论是否带AD)均为台湾Megawin的MPC82E52(低压版为82LE52),MA801和MA802(低压版)是其大客户版,器件手册可以去Megawin的官方网站下载,建议看原厂手册。
chunyang
2楼-- · 2019-03-25 02:00
 精彩回答 2  元偷偷看……
anqi90
3楼-- · 2019-03-25 03:34
电脑不在手边不好查资料,不过隐约记得有些寄存器是不能读取的,不知道辛昕是不是踩到地雷了…
辛昕
4楼-- · 2019-03-25 08:20
低六位不恒定是吧。
那好,那我就试试 SPSTAT = 0x14;

哦,应该是说“低六位恒定为某个初始值是吧”(按照这现象来看,那我该理解为全零咯。)

我刚才刷牙想了想,这个解释从一开始就不可接受吧。
因为我的流水灯是外面用上拉电阻的,所以0是亮的,1是灭的。
那我第一次赋值 0xF3,最高两位(如果它们也是固定的初始值那我也没办法了——那这个寄存器也就没存在得意义了。)
最高两位是高,灯也应该是灭吧?

[ 本帖最后由 辛昕 于 2011-5-2 10:39 编辑 ]
辛昕
5楼-- · 2019-03-25 09:36
不能读取?
只能写不能读?
如此说来,那就只能用中断了。
辛昕
6楼-- · 2019-03-25 13:29
#include<reg52.h>
sfr SPSTAT = 0x84;

void main(void)
{

        SPSTAT = 0x18;
;

    P1 = SPSTAT;
    while(1);
}
chunyang老师,低六位未定义,的确可能不恒定,但是最高两位就该恒定了吧?
那么,为什么我这样写,还是显示全亮呢?

看来我还是要研究一下anqi90说的,我觉得也就只有这种解释比较接近真相,假如,不存在我怀疑的那个问题的话。

虽然我不知道你是否在板子上做了实验,但是,你是第一个回复的,所以.....100个芯币,小小心意,不成敬意,望收下

一周热门 更多>