51单片机C语言学习 6

发布者:平稳心绪最新更新时间:2016-01-21 来源: eefocus关键字:51单片机  C语言学习 手机看文章 扫描二维码
随时随地手机看文章
第六课 变量

  上课所提到变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:
    [存储种类] 数据类型 [存储器类型] 变量名表
  在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。这些存储种类的具体含义和用法,将在第七课《变量的存储》中进一步进行学习。
  而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表6-1中是KEIL uVision2所能认别的存储器类型。注意的是在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二 AT89C51特殊功能寄存器列表

 

存储器类型

说 明

data

直接访问内部数据存储器(128字节),访问速度最快

bdata

可位寻址内部数据存储器(16字节),允许位与字节混合访问

idata

间接访问内部数据存储器(256字节),允许访问全部内部地址

pdata

分页访问外部数据存储器(256字节),用MOVX @Ri指令访问

xdata

外部数据存储器(64KB),用MOVX @DPTR指令访问

code

程序存储器(64KB),用MOVC @A+DPTR指令访问


表6-1 存储器类型

  如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。
  SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。
  COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用@R0/R1。
  LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。
  之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。
  sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:
    sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;
    sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;
  我们可以这样定义AT89C51的P1口
    sfr P1 = 0x90; //定义P1 I/O口,其地址90H
  sfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1口可以用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表。sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特殊功能寄存器,如8052的T2定时器,可以定义为:
    sfr16 T2 = 0xCC; //这里定义8052定时器2,地址为T2L=CCH,T2H=CDH
用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。
  sbit可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要用的如要访问P1口中的第2个引脚P1.1。我们可以照以下的方法去定义:
(1)sbit 位变量名=位地址
  sbit P1_1 = Ox91;
这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。
(2)Sbit 位变量名=特殊功能寄存器名^位位置
sft P1 = 0x90;
  sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置
当可寻址位位于特殊功能寄存器中时可采用这种方法
(3)sbit 位变量名=字节地址^位位置
  sbit P1_1 = 0x90 ^ 1;
  这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。
  在C51存储器类型中提供有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:
unsigned char bdata ib; //在可位录址区定义ucsigned char类型的变量ib
int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象
sbit ib7=ib^7 //用关键字sbit定义位变量来独立访问可寻址位对象的其中一位
sbit ab12=ab[1]^12;
  操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。
下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为RunLED2。程序如下:

sfr P1 = 0x90; //这里没有使用预定义文件,
sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器
sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用
sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚

void main(void)
{
unsigned int a;
unsigned char b;
do{
for (a=0;a<50000;a++)
P1_0 = 0; //点亮P1_0
for (a=0;a<50000;a++)
P1_7 = 0; //点亮P1_7
for (b=0;b<255;b++)
{
for (a=0;a<10000;a++)
P1 = b; //用b的值来做跑马灯的花样
}
P1 = 255; //熄灭P1上的LED
for (b=0;b<255;b++)
{
for (a=0;a<10000;a++) //P1_1闪烁
P1_1 = 0;
for (a=0;a<10000;a++)
P1_1 = 1;
}
}while(1);
}


关键字:51单片机  C语言学习 引用地址:51单片机C语言学习 6

上一篇:51单片机C语言学习 7
下一篇:51单片机C语言学习 5

推荐阅读最新更新时间:2024-03-16 14:44

C51单片机全自动洗衣机
源程序: #include reg51.h //定义头文件 #define uint unsigned int //定义字符uint #define uchar unsigned char //定义字符uchar #define TIME0H 0xff //定时器0计数器高位 #define TIME0L 0x9c //定时器0计数器低位 #define TIME1H 0x3c //定时器1计数器高位 #define TIME1L 0xb0
[单片机]
C<font color='red'>51单片机</font>全自动洗衣机
基于51单片机的号音自动播放器设计
1 引言 机关、院校日常作息需要计时和号音提示,笔者利用AT89C51型单片机和LM386型音频功率放大器构成了自动计时和号音播放器,成本低,效果好,值得推广。 2 AT89C51的主要特性和引脚功能 AT89C51是带4K字节闪烁可编程可擦除只读存储器(EPEROM)的低电压、高性能CMOS 8位微处理器(俗称单片机)。该单片机与工业标准的MCS-51型机的指令集和输出引脚兼容。AT89C51将多功能8位CPU和闪烁存储器组合在单个芯片中,为很多嵌入式控制提供了灵活性高且价格低廉的方案。 AT89C51的主要特性如下: 寿命达1000写/擦循环; 数据保留时间:10年; 全静态工作:0Hz-24MHz
[单片机]
基于<font color='red'>51单片机</font>的号音自动播放器设计
如何学习51单片机/心得/KEIL4/DXP
什么是单片机 学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。 有人觉得要先学汇编。不过我个人觉得,学习51单片机,还是从C语言入手,一来方便,二来容易上手,仁者见仁,智者见智吧。 关于学习51单片机的书籍,市场上有很多,大家可以择优选取。 那么,如何用程序控制单片机的呢? 我开始学单片机的时候也曾有过这样的困惑啊,ok,下面帮大家整理一下思路。 怎么在Keil里写程序?keil怎么安装破解? 用过VC6.0的同学都知道,VC6.0是一个编译环境。什么是编译环境?简单地说,就是你写代码的地方。 那么,同理,单片机的编译环境就是Ke
[单片机]
如何<font color='red'>学习</font><font color='red'>51单片机</font>/心得/KEIL4/DXP
原创作品LED流星雨灯(51单片机程序代码)产品分享!
最近公司生产了一款流星雨灯!现把它分享给大家! 一、图片分享: 二、PCB文件分享: 三、原理图分享: 四、 上面只做了5根灯管,如果需要增加灯管的话,只需稍微改动下 下面的程序即可.如果增长 连线把灯管摆成圆形或者方形效果也比较牛逼的. 此款流星灯直径只有1.5公分只可以做30公分、50公分、80公分、1000公分等 。 这个东东主要是做装饰用,技术支持: http://www.51hei.com/ 下面公开全部的源代码. 请大家多多指教.程序代码大家可以随意修改,但不可用于商业用途. /*流星雨程序代码 作者:胡琴 2011-12-12 单片机型号:STC11F04 IO
[单片机]
原创作品LED流星雨灯(<font color='red'>51单片机</font>程序代码)产品分享!
自制51单片机超大数码管时钟
市面上出售的数码管一般都很小,本人用led发光管自己制作了一种个头很非常大的数码管,挂在家里显示效果非常牛逼下面是实物图: 下面是电路图: 下面是c51程序源代码: #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define pos P0 //设置数码显示的位选 #define segs P1 //设置数码显示的段选 code unsigned char d = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0
[单片机]
自制<font color='red'>51单片机</font>超大数码管时钟
PCF8591与AT89C51单片机的接口程序
  以AT89C51为主器件.I2C总线上连接4个PCF8591芯片,芯片地址分别为(OOOb、OlOb、020b、400b),89C51的P3.6作为SCL信号.P3.7做为SDA信号,每个芯片的模拟输入采用单端方式输入,参考电压VREF选用4.8V。参考电路如下图所示。下面程序为I2c协议、读取4路A,D转换数据以及写入D/A变换数值的C语言代码。
[单片机]
PCF8591与AT89C<font color='red'>51单片机</font>的接口程序
51单片机扩展中断的方法
一、采用硬件请求和软件查询的方法: 这种方法是:把各个中断源通过硬件“或非(高有效,如CD4002)”(与,低有效)门引入到单片机外部中断源输入端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这样当外部中断时,通过“或非”(与)门引起单片机中断,在中断服务程序中再通过软件查询,进而转相应的中断服务程序。显然,这种方法的中断优先级取决于软件查询的次序。其硬件连接和软件编程如下: Void zhongduan (void) interrupt 0 using 3 //中断函数 { EX0=0;//关中断 If(P0_0=1) { *****}//中断查询 If(P0_1=1) { ****
[单片机]
<font color='red'>51单片机</font>扩展中断的方法
关于单片机引脚读写操作
使用时肯定会用到单片机的IO引脚。以51单片机P1口为例。内部结构如图所示 当单片机进行写操作时,引脚锁存器(D触发器)CLK端接收有效电平,然后内部总线上需要写的数据就会通过D触发器传输到Q'。当写1时Q'为0,使MOSFET截止,因此外部引脚电平为1.当写0时Q'为1,MOSFET饱和导通,此时引脚可以看成接地,所以引脚为0。 如果对单片机IO口进行读操作。由图可以看出读操作包括读寄存器和读引脚。以前知道有这两种区别,但是从来没仔细区分过。从图中可以看出读寄存器时读寄存器上的三态缓冲器打开,Q端的值直接传到了内部总线上,而下面的读引脚三台缓冲器是高阻态,读引脚时则相反。 汇编语言中对读寄存
[单片机]
关于单片机引脚读写操作
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved