📄 c51变量.htm
字号:
}
if (action[0] == "acti")
{
window.location.href="/league/activity/acti_mana_index.php?t_id=" + action[1];
}
}
}
function copyurl(url)
{
try{
clipboardData.setData('Text',url);
showAlert('已经把该社团网址复制到系统剪贴板,您可以使用(Ctrl+V或鼠标右键)粘贴功能,通过其他软件记录或发送给您的朋友。')
}
catch(e){}
}
function add_favorite(uid, url, name)
{
window.open("/personal/favorite/add.php?member_id="+uid+"&url="+url+"&name="+name,'_blank','width=400,height=220,toolbar=0,locationbar=0,menubar=0,statbar=0');
return false;
}
// 提示登录
function alertlert_login()
{
showAlert('对不起,您目前没有权限,请先登录!');
document.login_form1.account.focus();
}
//申请加入社团
function con_join(con_gid)
{
showConfirm("您确认加入本社团吗?","window.location.href='/league/apply.php?g_id="+con_gid+"';","");
}
//退出本社团
function con_quiet(con_gid,con_uid)
{
showConfirm("您确认退出本社团吗?","window.location.href='/league/member/quiet_member.php?g_id="+con_gid+"&q_uid="+con_uid+"';","");
}
</SCRIPT>
<!-- 回复框 -->
<DIV id=background style="DISPLAY: none"></DIV>
<DIV id=postbox
style="DISPLAY: none; Z-INDEX: 50; LEFT: 769px; WIDTH: 600px; POSITION: absolute; TOP: 271px">
<FORM name=reply_comment action=/league/comment/index.php?gid=514465 method=post
target=hidden_frame><INPUT id=act type=hidden value=add name=act> <INPUT id=r_id
type=hidden name=r_id> <INPUT id=t_id type=hidden name=t_id> <INPUT id=f_uid
type=hidden name=f_uid>
<TABLE cellSpacing=0 cellPadding=0 width="70%" border=0>
<TBODY>
<TR>
<TD height=13> </TD></TR>
<TR>
<TD class=box_common height=26> <SPAN
class=font_common_title>回复评论</SPAN></TD></TR></TBODY></TABLE>
<TABLE class=box_common01 cellSpacing=0 cellPadding=0 width="70%">
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=8 cellPadding=0 width="100%" bgColor=#ffffff
border=0><TBODY>
<TR>
<TD class=font_common vAlign=top align=right height=63>内容:</TD>
<TD class=font_common vAlign=top><TEXTAREA class=input_box01 id=input_area name=input_area rows=6 cols=48></TEXTAREA></TD></TR>
<TR>
<TD class=font_common vAlign=top align=right width="15%">原文:</TD>
<TD class=font_common style="LINE-HEIGHT: 18px" vAlign=top
width="85%"><SPAN class=gray id=past_type></SPAN></TD></TR>
<TR>
<TD class=font_common vAlign=top align=middle colSpan=2><INPUT class=btn01 onclick=javascript:hidden_reply();submit_post(document.reply_comment); type=button value=发表 name=queding>
<INPUT class=btn01 onclick=hidden_reply(); type=reset value=取消>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></FORM></DIV><!-- 回复框 -->
<DIV id=mainBox>
<DIV id=mainBoxBg>
<TABLE class=module_title cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=corner_left></TD>
<TD class=corner_center><A
href="http://www.5jia1.com/league/?gid=514465">首页</A> > <A
href="http://www.5jia1.com/league/blog/blog_index.php?gid=514465">社团文集</A> > <A
href="http://www.5jia1.com/league/blog/show_comm.php?bid=361243">第五课
C51变量</A></TD>
<TD class=corner_right></TD></TR></TBODY></TABLE>
<DIV class=module_content>
<DIV class=module_content_line>
<DIV class=bg>
<TABLE cellSpacing=10 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=middle>
<TABLE class=box_common cellSpacing=1 cellPadding=5 width="100%"
border=0><TBODY>
<TR class=box_common_title>
<TD colSpan=2>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="35%"><B>第五课 C51变量</B></TD>
<TD align=right width="65%">作者: <A
href="http://www.5jia1.com/personal/?member_id=505887"
target=_blank>张文俊</A> 2007-08-14
15:33:25 </TD></TR></TBODY></TABLE></TD></TR>
<TR class=box_content>
<TD vAlign=top align=middle width="10%"><A
href="http://www.5jia1.com/personal/?member_id=505887"
target=_blank><IMG class=box01 height=98
src="5.files/s_0_personal_photo_505887.jpg" width=98 vspace=5
border=0></A><BR><IMG height=14 src="5.files/icon_boy.gif" width=14
border=0> <A
href="http://www.5jia1.com/personal/?member_id=505887"
target=_blank>张文俊</A> </TD>
<TD>
<TABLE class="font_content autowrap" cellSpacing=12 cellPadding=0
width="100%" border=0>
<TBODY>
<TR>
<TD class=line_h20 style="WIDTH: 790px">
<DIV style="OVERFLOW-X: auto; WIDTH: 100%">
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TH vAlign=center align=middle height=32>
<H1>第五课 C51变量</H1></TH></TR>
<TR>
<TD align=middle bgColor=#f7f7f7
height=25>作者:佚名 来源:本站原创 点击数:
238 更新时间:2007年07月18日 </TD></TR></TBODY></TABLE>
<DIV
align=left> 上课所提到变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:<BR> [存储种类] 数据类型 [存储器类型] 变量名表<BR> 在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。这些存储种类的具体含义和使用方法,将在第七课《变量的存储》中进一步进行学习。<BR> 而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在单片机c语言硬件系统中所使用的存储区域,并在编译时准确的定位。表6-1中是KEIL
uVision2所能认别的存储器类型。注意的是在AT89c51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二 AT89c51特殊功能寄存器列表
</DIV>
<P>
<TABLE cellSpacing=2 cellPadding=2 width=759 border=1>
<TBODY>
<TR>
<TD width=749>
<P>表6-1 存储器类型 </P></TD></TR>
<TR>
<TD width=749>
<TABLE align=center border=1>
<TBODY>
<TR>
<TD width=163>
<P>存储器类型 </P></TD>
<TD width=405>
<P>说 明 </P></TD></TR>
<TR>
<TD width=163>
<P>data </P></TD>
<TD width=405>
<P>直接访问内部数据存储器(128字节),访问速度最快 </P></TD></TR>
<TR>
<TD width=163>
<P>bdata </P></TD>
<TD width=405>
<P>可位寻址内部数据存储器(16字节),允许位与字节混合访问 </P></TD></TR>
<TR>
<TD width=163>
<P>idata </P></TD>
<TD width=405>
<P>间接访问内部数据存储器(256字节),允许访问全部内部地址 </P></TD></TR>
<TR>
<TD width=163>
<P>pdata </P></TD>
<TD width=405>
<P>分页访问外部数据存储器(256字节),用MOVX @Ri指令访问 </P></TD></TR>
<TR>
<TD width=163>
<P>xdata </P></TD>
<TD width=405>
<P>外部数据存储器(64KB),用MOVX @DPTR指令访问 </P></TD></TR>
<TR>
<TD width=163>
<P>code </P></TD>
<TD width=405>
<P>程序存储器(64KB),用MOVC @A+DPTR指令访问
</P></TD></TR></TBODY></TABLE>
<DIV align=center> </DIV></TD></TR></TBODY></TABLE></P>
<P><BR> 如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都能声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区能显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。</P>
<P>. 数据存储模式<BR>存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:<BR>1. 1.
Small模式<BR>所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。<BR>2. 2.
Compact模式<BR>所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。<BR>3.
3.
large模式<BR>所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。<BR>提示:存储模式在单片机c语言编译器选项中选择。</P>
<P> 之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。<BR> sfr和sfr16能直接对51<A
href="http://www.5jia1.com/admin5st/l"
target=_blank>单片机</A>的特殊寄存器进行定义,定义方法如下:<BR> sfr 特殊功能寄存器名=
特殊功能寄存器地址常数;<BR> sfr16 特殊功能寄存器名=
特殊功能寄存器地址常数;<BR> 我们能这样定义AT89c51的P1口<BR> sfr P1 = 0x90;
//定义P1
I/O口,其地址90H<BR> sfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1口能用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表。sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特殊功能寄存器,如8052的T2定时器,能定义为:<BR> sfr16
T2 = 0xCC;
//这里定义8052定时器2,地址为T2L=CCH,T2H=CDH<BR>用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。<BR> sbit可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要用的如要访问P1口中的第2个引脚P1.1。我们能照以下的方法去定义:<BR>(1)sbit
位变量名=位地址<BR> sbit P1_1 =
Ox91;<BR>这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。<BR>(2)Sbit
位变量名=特殊功能寄存器名^位位置<BR>sft P1 = 0x90;<BR> sbit P1_1 = P1 ^ 1;
//先定义一个特殊功能寄存器名再指定位变量名所在的位置<BR>当可寻址位位于特殊功能寄存器中时可采用这种方法<BR>(3)sbit
位变量名=字节地址^位位置<BR> sbit P1_1 = 0x90 ^
1;<BR> 这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。<BR> 在单片机c语言存储器类型中供给有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于<A
href="http://www.5jia1.com/admin5st/l"
target=_blank>单片机</A>的可位寻址区中,能将要求可位录址的数据定义为bdata,如:<BR>unsigned
char bdata ib; //在可位录址区定义ucsigned char类型的变量ib<BR>int bdata
ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象<BR>sbit ib7=ib^7
//用关键字sbit定义位变量来独立访问可寻址位对象的其中一位<BR>sbit
ab12=ab[1]^12;<BR> 操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。<BR>下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为RunLED2。程序如下:
</P>
<P>sfr P1 = 0x90; //这里没有使用预定义文件,<BR>sbit P1_0 = P1 ^ 0;
//而是自己定义特殊寄存器<BR>sbit P1_7 = 0x90 ^ 7;
//之前我们使用的预定义文件其实就是这个作用<BR>sbit P1_1 = 0x91;
//这里分别定义P1端口和P10,P11,P17引脚</P>
<P>void main(void)<BR>{<BR>unsigned int a;<BR>unsigned char
b;<BR>do{<BR>for (a=0;a<50000;a++)<BR>P1_0 = 0;
//点亮P1_0<BR>for (a=0;a<50000;a++)<BR>P1_7 = 0;
//点亮P1_7<BR>for (b=0;b<255;b++)<BR>{<BR>for
(a=0;a<10000;a++)<BR>P1 = b; //用b的值来做跑马灯的花样<BR>}<BR>P1 =
255; //熄灭P1上的LED<BR>for (b=0;b<255;b++)<BR>{<BR>for
(a=0;a<10000;a++) //P1_1闪烁<BR>P1_1 = 0;<BR>for
(a=0;a<10000;a++)<BR>P1_1 = 1;<BR>}<BR>}while(1);<BR>}</P>
<P> </P>
<P>. Keil c51指针变量<BR>单片机c语言支持一般指针(Generic
Pointer)和存储器指针(Memory_Specific Pointer).<BR>1. 1.
一般指针<BR>一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如:<BR>long *
state;为一个指向long型整数的指针,而state本身则依存储模式存放。<BR>char * xdata
ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。<BR>一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。<BR>2.
2. 存储器指针<BR>基于存储器的指针说明时即指定了存贮类型,例如:<BR>char data *
str;str指向data区中char型数据<BR>int xdata * pow;
pow指向外部RAM的int型整数。<BR>这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。<BR>3.
3. 指针转换<BR>即指针在上两种类型之间转化:<BR>l
当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。<BR>l
如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。<BR>l
能强行改变指针类型。</P>
<P><STRONG> 变量的存储类别</STRONG></P>
<P>一、static(静态局部)变量。<BR>1、静态局部变量在程序整个运行期间都不会释放内存。<BR>2、对于静态局部变量,是在编译的时候赋初值的,即只赋值一次。如果在程序运行时已经有初值,则以后每次调用的时候不再重新赋值。<BR>3、如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。<BR>4、虽然静态变量在函数调用结束后仍然存在,但是其他函数不能引用。<BR> <BR>
二、用extern声明外部变量。<BR>用extern声明外部变量,是为了扩展外部变量的作用范围。比如一个程序能由多个源程序文件组成。如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。<BR>
正确的做法是在一个文件中定义外部变量,而在另外一个文件中使用extern对该变量作外部变量声明。<BR>
一个文件中: int abc;<BR> 另外一个文件中:
extern
abc;<BR> <BR>例子:<BR>用extern将外部变量的作用域扩展到其他文件:<BR>文件1:<BR>//用extern将外部变量的作用域扩展到其他文件中<BR>#include<BR>#include<BR>#include<BR>unsigned
int array[10];<BR>void fillarray();<BR>void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -