重点学习C51库中intrins.h库函数的使用,了解库函数循环右移和C语言的右移的区别,了解库函数循环左移和C语言的左移的区别。

#include <REG51.h>    //包含头文件REG51.h,使能51内部寄存器;

#include <intrins.h>  //包含头文件intrins.h,要放在stdio.h的头文件之前;

//使能函数: _nop_();  相当于汇编的NOP指令;

//使能函数: bit  _testbit_( bit bit_value ); 对bit_value进行测试,若bit_value=1,返回1,

//否则返回0;

//使能函数: unsigned char _cror_( unsigned char x, unsigned char n );

//将字节型变量x的值,向右循环移动n位,相当于汇编的RR A命令;

//使能函数: unsigned int  _iror_( unsigned int x,  unsigned char n );

//将双字节型变量x的值,向右循环移动n位,相当于汇编的RR A命令;

//使能函数: unsigned long _lror_( unsigned long x, unsigned char n );

//将4字节型变量x的值,向右循环移动n位,相当于汇编的RR A命令;

//使能函数: unsigned char _crol_( unsigned char x, unsigned char n );

//将字节型变量x的值,向左循环移动n位,相当于汇编的RL A命令;

//使能函数: unsigned int  _irol_( unsigned int x,  unsigned char n );

//将双字节型变量x的值,向左循环移动n位,相当于汇编的RL A命令;

//使能函数: unsigned long _lrol_( unsigned long x, unsigned char n );

//将4字节型变量x的值,向左循环移动n位,相当于汇编的RL A命令;

//以上的循环左移和循环右移,同C语言的左移和右移是不同的,使用时要小心;

#include <stdio.h>  //包含头文件stdio.h

       //_getkey();从串口读入一个字符;

   //putchar();向串口发送一个字节;

   //printf();向串口发送一串字节;

 bit bit_value1,bit_value2;

 unsigned char char_value;

 unsigned int  int_value;

 unsigned long long_value;

 //函数功能:比较"51库函数中的循环右移1位"和"C语言中的右移1位"的区别;

void compare_shift_right()

{ char_value=0xa5;

  char_value=_cror_( char_value,1 );

//将char_value循环右移1位,将原来的最低位至最高位,原来的次低位移至最低位;

  printf("char_value=%#bX\n",char_value);

//将字节型的值转换为无符号16进制ASCII码输出,"Char_Value=0XD2";

  char_value=0xa5;

  char_value=char_value>>1;

//将char_value的值右移1位,最高位补0,原来的最低位值丢掉不要;

  printf("char_value=%#bX\n",char_value);

//将字节型的值转换为无符号16进制ASCII码输出,"Char_Value=0X52";

}

 //函数功能:比较"51库函数中的循环左移1位"和"C语言中的左移1位"的区别;

void compare_shift_left()

{ char_value=0xa5;

  char_value=_crol_( char_value,1 );  

//将char_value循环左移1位,将原来的最高位至最低位,原来的最低位移至次低位;

  printf("char_value=%#bX\n",char_value);

//将字节型的值转换为无符号16进制ASCII码输出,"Char_Value=0X4B";

  char_value=0xa5;

  char_value=char_value<<1;

//将char_value的值左移1位,最低位补0,原来的最高位值丢掉不要;

  printf("char_value=%#bX\n",char_value);

//将字节型的值转换为无符号16进制ASCII码输出,"Char_Value=0X4A";

}

//函数功能:初始化串口,设置波特率为1200bps@16MHz,使能接收,使用8位UART;

void Serial_Port_Initialization()

{ SCON  = 0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI

                //SM1:SM0=01,选择方式1,SM2=0,表示非多机通讯,8-bit UART;

//REN=1,使能接收;

  TMOD |= 0x20; //定时器方式控制寄存器:GATE1,C/T1,M11,M10,GATE0,C/T0,M01,M00

               //GATE=0,TR置1便可以启动Timer;GATE=1,TR置1,且INT脚输入高电平,

//才可以启动Timer;

//M11:M10=10,选择方式2,8位自动重装载;

  TH1   = 221;  //TH1:  reload value for 1200 baud @ 16MHz

  TR1   = 1;    //启动Timer1;

  TI    = 1;    //发送UART的第一个字节,为下次发送做准备;

}

void main(void)

{

  Serial_Port_Initialization();

//初始化串口,设置波特率为1200bps@16MHz,使能接收,使用8位UART;

  for(;;)

     {  _nop_();  //产生一次空操作;

    bit_value2=0;  //将位变量bit_value2设置为0;

    bit_value1=1;  //将位变量bit_value1设置为1;

bit_value2=_testbit_(bit_value1);  //若bit_value1=1,_testbit_()返回1,则bit_value2=1;

    compare_shift_right();

//比较"51库函数中的循环右移1位"和"C语言中的右移1位"的区别;

compare_shift_left();  

//比较"51库函数中的循环左移1位"和"C语言中的左移1位"的区别;

 }

}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部