重点学习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位"的区别;
}
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 51单片机第4步_学习intrins.h库函数
发表评论 取消回复