原创 从新学习C51

2011-10-4 20:29 1461 3 3 分类: MCU/ 嵌入式

/*************************************************************
continue语句的使用
*********************************************************/
#include<reg51.h>
#include<stdio.h>

S_init()
{
  SCON=0x50; //串口以方式1工作
  TMOD=0x20; //定时器T1以方式2工作
  TH1=0xf4;
  TR1=1;
  TI=1;
}

void main()
{
  unsigned char i,j;
  S_init();
  for(i=0;i<200;i++)
  {
    if(i%3==0) continue;
    printf("%d",i);
    if((++j%10==0) printf("\n");
  }
  while(1);
}

C51数据类型:bit  char  int  long  float  *  void double  struct   union  enum

bit类型的变量赋值为非零的时候他的值就是1;对char变量赋值超过8位将自动截断,取8位赋值给char变量;对变量赋值以0开头就是以八进制赋值;

当对char变量a赋值为128的时候,他在内存中的表示为这样:1000 0000,这时候最高位已经表示符号位,说明已经是负值,那到底是负多少呢,用低七位取反加1结果是多少就是负多少。这样这里低七位取反加1的值是1000 0000,说明这个值就是-128!!同样,给变量a赋值为129的时候,a在内存的表示是这样:1000 0001,最高位为1表示负值,对低七位取反加1之后是111 1111,则说明a的实际值为-127

当对unsigned char类型的变量b赋值,若赋值为256,结果如何?256的二进制表示是这样:1 0000 0000,而unsigned char型变量只有8位,这里同样产生自动截断,截取低8位,那么这里b的值实际就是0

Void用来表示函数没有返回值或者数据类型不确定;

Float型和double型变量的最高位表示符号位,负值不取反加1

结构体是由基础数据类型构成,并用一个标识符来命名的各种变量的组合,结构中可以使用不同的数据类型。以下为简单使用:

struct stru_a

{

char  a;

int  b;

long  c;

};

struct stru_a *pstru;

char temp_a;

int temp_b;

long temp_c;

 

void main( )

{

struct stru_a x;

x.a=100;

x.b=-1;

x.c=6000;

pstru=&x;

temp_a=pstru->a;

temp_b=pstru->b;

temp_c=pstru->c;

}

型的强制转换实例:

unsigned long a;

unsigned char b;

unsigned char array[4]={0x11,0x22,0x33,0x44};

 

struct stru

{

int m;

int n;

};

int c;

int d;

struct stru *pstru;

void *p;

void main()

{

   a=0x12345678;

   b=(unsingned char *)(&a)[1] // b=0x34;

   a=*((unsigned long *)array);  //a=0x11223344;

   pstru=(struct stru *)array;

   c=pstru->m;      //c=0x1122;

   d=pstru->n;      //d=0x3344;

   p=array;

   b=((unsigned char *)p)[0];  //b=0x11;

}

 

(unsigned char *)(&a)[1]*(((unsigned char *)(&a))+1)是等效的

51单片机存储区分配如下:

存储区

地址范围

功能说明

 

 

 

内部RAM

256Byte

00H-1FH

内部使用DATA区,四个工作寄存器组(4*8=32Byte),用于内部参数传递

20H-2FH1

BDATA区,DATA 区的16 个字节的可位寻址区

30H-7FH2

用户可用非位寻址DATA区,可在一个周期内直接寻址

80H-FFH

IDATA区,用户可用的内部RAM 区的高128 个字节,必须采用间接寻址

80H-FFH3

可以进行位寻址的特殊功能寄存器(SFR

外部扩展RAM

(最大64KByte

00H-FFH

PDATA区,外部存储区的256 个字节通过P0 口的地址对其寻址,需要两个指令周期

00H-FFFFH4

XDATA区(外部存储区),使用DPTR 寻址

ROM(最大64KByte)

00H-FFFFH

CODE区(程序存储区),使用DPTR 寻址

 

C51的分隔符:( ) [ ] { }  ,  :  ; 一共六个。

C51的运算符分为三类:算数运算符、关系运算符与逻辑运算符、位运算符

 

 

算数运算符:+  -  *  /  %  ++  --

逻辑运算符:&&  || 

关系运算符:>  >=  <  <=  ==  !=

位运算符:&  |  ^  ~  <<  >>

特殊运算符: ? :  &   *   sizeof

以下为简单应用:

 

unsigned char  a, c;

bit  b;

float  f=2.34;

signed char d;

struct stru

{

char a;

int b;

long c;

};

void main( )

{

   c=1;

   a=c++;   //a=1;

   c=1;

   a=++c;   //a=2;

   a=0x55&0x77;   //a=0x55;

   a=a&0xfe;    //a=0x54;a的最低位清零

   b=a&0x04;   //a的第三个位进行检测是否为1

   a=0x55|0x77;   //a=0x77;

   a=a|0x80;   //a=0xf7, a的最高位置1

   a=0x55^0x77;   //a=0x22,对应位相同为0不同为1

   ((unsigned char *)&f)[0]^=0x80;   //f的最高位进行取反,也就是变成其相反数

   a=0xfe;

   a=~a;     //a=0x01; 相应的位翻转

   a=6*15;   //可以用移位来操作:a=6*(8+4+2+1)

   d=-2;     // 1111 1110;

   d=d>>1;   // 1111 1111

   a=-2;     // 1111 1110

   a=a>>1;   // 0111 1111

 

   a= (3>4)? 5:7;

   // a= (3>4)? fun1( ):fun2( );

   a=sizeof(unsigned char);  //a=1;

   a=sizeof(unsigned long);  //a=4;

   a=sizeof(struct stru);   //a=7;

}

 

运算的优先级别如下:

( )(小括号)  [ ](数组下标)  .(结构成员)  –>(指针型结构成员)

(逻辑非)  ! (位取反)   -(负号)  ++  --  &(取变量地址)

指针* (指针所指内容)  type(函数说明)  sizeof(计算长度)

() *  /()   %(取模)

+()  -()

<<(位左移)   >>(位右移)

<(小于)  <=(小于等于)   >(大于)  >=(大于等于)

==(等于)  !=(不等于)

&(位与)  ^(位异或)  |(位或)  &&(逻辑与)  ||(逻辑或

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条