C51 bit和sbit的区别

bit和sbit都是C51扩展的变量类型。

bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。

sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。

 

sbit 要在最外面定义,就是说必须定义成外部变量.

sbit定义的是SFR(特殊功能寄存器)的bit

sbit更像是类型定义,不像是变量定义。

bit 可以在外部或内部定义。

bit 动态分配的,有编译器来指定内存地址。

sbit: 指示说明性说明
bit : 编译时分配空间

 

SFR 是特殊功能寄存器的总称,是单片计算机中的一组特殊的临时存储区域,用于动态存放计算机运行过程的一些状态信息、并依此做相应的控制。如楼上介绍的一样,MCS-51单片机就设有18个专用寄存器,P0-P3端口,定时/计数器T0、T1,TMOD、TCON、PCON、SCON 、PSW、IE、A、B、IP等等。SFR越多,编和控制功能越强、越灵活,但需要硬资源,所以系统设计时会根据需要来确定。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C51是基于Intel 8051系列单片机的一种微控制器。对于C51微控制器,由于其资源有限,需要使用一些特殊的优化技巧来实现FFT函数。下面是一个简单的C51 FFT函数的代码实现(假设输入数据长度为N): ```c #define N 16 #define LOG2_N 4 sbit FFT_CS = P1^0; sbit FFT_RST = P1^1; sbit FFT_SCK = P1^2; sbit FFT_SDI = P1^3; sbit FFT_SDO = P1^4; void FFT(unsigned char *data) { unsigned char i, j, k; unsigned char bit; unsigned char N2 = N / 2; unsigned char ND = N - 1; unsigned char rev; unsigned char tmp_real, tmp_imag; unsigned char wr, wi, tr, ti; // Bit-reverse the input data for (i = 0; i < N; i++) { j = 0; for (bit = 0; bit < LOG2_N; bit++) { if (i & (1 << bit)) { j |= (1 << (LOG2_N - 1 - bit)); } } if (j > i) { tmp_real = data[i * 2]; tmp_imag = data[i * 2 + 1]; data[i * 2] = data[j * 2]; data[i * 2 + 1] = data[j * 2 + 1]; data[j * 2] = tmp_real; data[j * 2 + 1] = tmp_imag; } } // Perform the FFT for (i = 0; i < LOG2_N; i++) { for (j = 0; j < (1 << i); j++) { k = j << (LOG2_N - i - 1); wr = cos_table[k]; wi = sin_table[k]; for (rev = 0; rev < N2; rev++) { tr = data[(rev + k + N2) * 2]; ti = data[(rev + k + N2) * 2 + 1]; tmp_real = (wr * tr - wi * ti) >> 7; tmp_imag = (wr * ti + wi * tr) >> 7; tr = data[(rev + k) * 2]; ti = data[(rev + k) * 2 + 1]; data[(rev + k) * 2] = tr + tmp_real; data[(rev + k) * 2 + 1] = ti + tmp_imag; data[(rev + k + N2) * 2] = tr - tmp_real; data[(rev + k + N2) * 2 + 1] = ti - tmp_imag; } } } } ``` 这里的FFT函数使用了一个用于位倒序的算法,并且使用了一个预先计算好的正弦和余弦表,以便在运行时直接查表计算。由于C51微控制器的计算能力有限,这里使用了一个简单的移位操作来代替除法操作,以提高计算效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值