C中code定义的数据要存储在ROM程序存储区基于8051单片机C语言编程实例100例都用CODE定义数组。因为51单片机RAM128字节汇编语言标号代表指令所在ROM地址标号+DB定义数据在ROM

本文详细解释了51单片机C语言中code关键字的作用,它用于指示编译器将变量存储在ROM中,确保数据的不可更改性。此外,还对比了code与data的区别,并通过实例代码展示了其实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C中code关键字

佚名 2019-05-24 16:47:16  1672  收藏 2

分类专栏: C语言基础知识

 

单片机C语言code是什么作用? 
code的作用是告诉单片机,我定义的数据要存储在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVC(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(存储器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM(存储器)的意思。 
程序可以简单的分为code(程序)区,和data (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code区也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是运行速度要慢很多,主要读flash比读ram要费时间),因此一般的做法是要将程序放到flash里面,然后load到 ram里面运行的;DATA区就没有什么选择了,肯定要放在RAM里面,放到rom里面改动不了。

汇编语言标号代表指令所在的ROM地址,标号+DB定义数据在ROM,

特别强调:根据上图和其他汇编源程序发现51单片机DB就是直接定义程序存储器中的地址中的数据,有无标号都是定义ROM中数据。没有定义在RAM或者其他存储器中数据的功能。不知道其他单片机或者存储器如何用DB定义

特别强调:根据上图和其他汇编源程序发现51单片机DB就是直接定义程序存储器中的地址中的数据,有无标号都是定义ROM中数据。没有定义在RAM或者其他存储器中数据的功能。不知道其他单片机或者存储器如何用DB定义

 

附: 
c51中的存储类型 
code :程序存储区(64KB), 
data :可直接寻址的内部数据存储区(128B) 
idata:不可直接寻址的内部数据存储区(256B) 
bdata:可位寻址内部数据存储区(16B) 
xdata:外部数据存储区(64KB) 
pdata:分页的外部数据存储区

https://blog.csdn.net/qq_18671205/article/details/90519230

23  播放音乐

 

/*    名称:播放音乐                 

       说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现

*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit BEEP=P3^7;

//生日快乐歌的音符频率表,不同频率由不同的延时来决定

uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,

                                          212,212,106,126,159,169,190,119,119,126,159,142,159,0};

//生日快乐歌节拍表,节拍决定每个音符的演奏长短

uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,

9,3,12,12,12,12,12,9,3,12,12,12,24,0};

//延时

void DelayMS(uint x)

{

       uchar t;

       while(x--) for(t=0;t<120;t++);

}

//播放函数

void PlayMusic()

{

       uint i=0,j,k;

       while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)

       {     //播放各个音符,SONG_LONG为拍子长度

              for(j=0;j<SONG_LONG[i]*20;j++)

              {

                     BEEP=~BEEP;

                     //SONG_TONE延时表决定了每个音符的频率

                     for(k=0;k<SONG_TONE[i]/3;k++);

              }

              DelayMS(10);

              i++;       

       }

}

void main()

{

       BEEP=0;

       while(1)

       {

              PlayMusic();   //播放生日快乐

              DelayMS(500);      //播放完后暂停一段时间

       }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值