/*************************************************************
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(计算长度)
(乘) * /(除) %(取模)
+(加) -(减)
<<(位左移) >>(位右移)
<(小于) <=(小于等于) >(大于) >=(大于等于)
==(等于) !=(不等于)
&(位与) ^(位异或) |(位或) &&(逻辑与) ||(逻辑或)
文章评论(0条评论)
登录后参与讨论