打印

关于单片机c编程问题

[复制链接]
3662|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
奇兵|  楼主 | 2010-5-23 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
小燕子神飞| | 2010-5-23 11:55 | 只看该作者
可能 com_data 需要定义在位变量区才能引用它的某个位吧.

使用特权

评论回复
板凳
奇兵|  楼主 | 2010-5-23 12:07 | 只看该作者
com_data我定义完了“bdata uchar com_deta;”

使用特权

评论回复
地板
小燕子神飞| | 2010-5-23 12:34 | 只看该作者
"bit是在20h~2fh空间分配的,sbit其实是给特殊功能位取别名" 书上的话。其实我也不太懂,
也许把sbit换成bit就没错了。没安装KEIL,试不了。

使用特权

评论回复
5
一棵小草| | 2010-5-23 13:04 | 只看该作者
本帖最后由 一棵小草 于 2010-5-23 13:11 编辑

sfr     表示声明特殊功能寄存器,比如sfr    P0  =  0x80;表示P0端口的地址是0x80,这个sfr可以理解成特殊功能寄存取别名也好。

这个时候,我们sbit     P01   =   P0^1;表示  P0口的8位中的第二位。
当然,我们不能bit     P01   =  P0^1;因为sbit表示声明位地址,而bit是定义位变量。

bdata   为RAM中0x20~0x30的空间,这个空间可以位寻址,一般来说,定义位变量就定义在这里。
bdata   uchar  com_deta;真不明白,为什么在位寻址区定义字节变量?RAM中0x30~0x80(data   uchar ----)是字节可寻址区,为什么不定义到这里呢?
建议你多看看单片机内部空间原理,为什么区分这些空间定义呢,空间定义的不同,寻址方式也不同,速度快或指令时间多少等问题,书上解释很多。


根据你的问题,猜想你是想定义一个变量,然后再声明这个变量的某一位,是吗?
你的想法很好,很会思考。但是,其实是多此一举了。操作一个变量的某一位,你完全可以通过‘与’‘或’‘非’的方式来操作。所以你这个位声明完全没有必要。

出错的原因是,com_deta是一个变量,而不是一个地址,所以不能声明位地址。

使用特权

评论回复
6
奇兵|  楼主 | 2010-5-23 13:16 | 只看该作者
草哥我想编一个AT24C02驱动程序用到了位,那吧他定义为 data  uchar com_data呗!

使用特权

评论回复
7
奇兵|  楼主 | 2010-5-23 14:28 | 只看该作者
不行!

使用特权

评论回复
8
奇兵|  楼主 | 2010-5-23 15:20 | 只看该作者
#include<AT89X52>
    #define K1 P2^6
    #define B P2^7
    #define CSL P3^5
    #define SDA P3^4
    #define uchar unsigned char
    #define uint unsigned int
    data uchar com_deta;   //将bdata改成了data
    sbit h_bit=com_data^7;
    sbit l_bit=com_data^0;
    uchar code key[4]={0xfe,0xfd,0xfb,0xf7};  //键盘扫描控制信号
    uchar data a[13],b[13];       //定义存储密码的数组a,b,c
    uchar suzu=0;
    uint time=0,relieve=0;
    bit biaozi1=0,biaozi2=0,biaozi3=0;我的程序代码!

使用特权

评论回复
9
江陵龙少| | 2010-5-23 18:12 | 只看该作者
本帖最后由 江陵龙少 于 2010-5-23 18:19 编辑

“data uchar com_deta;   //将bdata改成了data
    sbit h_bit=com_data^7;
    sbit l_bit=com_data^0; ”
上面肯定是不对的,你原来的才是对的
#include<AT89X52> 少了点东西!这是关键

使用特权

评论回复
10
江陵龙少| | 2010-5-23 18:16 | 只看该作者
#define K1 P2^6
    #define B P2^7
    #define CSL P3^5
    #define SDA P3^4
上面这种方式从未见过
正确的是:sbit K1=P2^6

使用特权

评论回复
11
一棵小草| | 2010-5-23 19:55 | 只看该作者
狂晕---------难道是我表达得不清楚吗?不会啊,我再次认真的看看我上次的回答。再次的认为我没说错啊,难道是LZ理解能力问题?

我明明说了   出错的原因是,com_deta是一个变量,而不是一个地址,所以不能声明位地址。

尽管你改成了data  com_deta;但是它还是一个变量啊!!!sbit是用于声明特殊功能寄存器地址的位,而不是变量。


而且我也说了   操作一个变量的某一位,你完全可以通过‘与’‘或’‘非’的方式来操作。   你既然定义了com_deta变量,就不能sbit它的位!!!如果你想操作它的位,比如com_data^7;你想要com_deta^7 = 0 ;可以com_deta  &  0x7f;想要com_deta^7 =1;可以com_deta | 0x80。为什么一定要sbit h_bit=com_data^7;???而且这种方法也错的。

再看看
#include<AT89X52>
    #define K1 P2^6
    #define B P2^7
    #define CSL P3^5
    #define SDA P3^4
唉---------建议你认真看书吧

使用特权

评论回复
12
江陵龙少| | 2010-5-23 20:29 | 只看该作者
本帖最后由 江陵龙少 于 2010-5-23 20:32 编辑

楼上的说法不敢苟同:
unsigned char bdata com_data;
sbit k1=com_data^0;
这是完全可以的!

另外楼主,还需要仔细检查一下程序

“data uchar com_deta;   //将bdata改成了data
    sbit h_bit=com_data^7;

使用特权

评论回复
13
sy21icbbs| | 2010-5-24 09:26 | 只看该作者
unsigned char bdata com_data;
sbit k1=com_data^0;

这个是可以的,不过要在函数外定义为全局变量,不能在将其在函数内定义为局部变量.

使用特权

评论回复
14
奇兵|  楼主 | 2010-5-25 12:40 | 只看该作者
我查书了,有些人是unsigned char bdata com_data;
sbit k1=com_data^0;定义的,bdata是可按位寻址的储存区,应该没问题!

使用特权

评论回复
15
奇兵|  楼主 | 2010-5-25 14:53 | 只看该作者
经过一番的修改现在KEIL提示C(132): warning C206: '_nop_': missing function-prototype
C(132): error C264: intrinsic '_nop_': declaration/activation error是什么情况?提示是 SDA=1;_nop_();_nop_();_nop_();_nop_();行我用bdata定义的com_data;

使用特权

评论回复
16
奇兵|  楼主 | 2010-5-30 08:53 | 只看该作者
缺少一个头包含文件!

使用特权

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

本版积分规则

102

主题

1254

帖子

4

粉丝