一、代码编写
(1) 使用移位运算符“>>”、“<<”,把送P1口显示控制数据进行移位,从而实现发光二极管依次点亮;
#include <reg51.h>
#define uchar unsigned char
void delay( )
{
uchar i,j;
for(i=0; i<255; i++)
for(j=0; j<255; j++);
}
void main( ) //主函数
{
uchar i,temp;
while (1)
{
temp=0x01; //左移初值赋给temp
for(i=0; i<8; i++)
{
P1=~temp; // temp中的数据取反后送P1口
delay( ); // 延时
temp=temp<<1; // temp 中数据左移一位
}
temp=0x80; // 赋右移初值给temp
for(i=0; i<8; i++)
{
P1=~temp; // temp中的数据取反后送P1口
delay( ); // 延时
temp=temp>>1; // temp 中数据右移一位
}
}
}
(2)使用C51提供的库函数,即循环左移n位函数和循环右移n位函数,控制发光二极管点亮;
#include <reg51.h>
#include <intrins.h> //包含循环左、右移位函数的头文件
#define uchar unsigned char
void delay( )
{
uchar i,j;
for(i=0; i<255; i++)
for(j=0; j<255; j++);
}
void main( ) // 主函数
{
uchar i,temp;
while (1)
{
temp=0xfe; // 初值为11111110
for(i=0; i<7; i++)
{
P1=temp; // temp中的点亮数据送P1口,控制点亮显示
delay( ); // 延时
temp=_crol_( temp,1) ; // temp 数据循环左移1位
}
for(i=0; i<7; i++)
{
P1=temp; // temp中的数据送P1口输出
delay( ); // 延时
temp=_cror_( temp,1) ; //temp中数据循环右移1位
}
}
}
二、硬件仿真
(1)原理图
(2)仿真结果
注意使用移位运算符“>>”、“<<”与使用循环左移函数“_crol_”和循环右移函数“_cror_” 区别。左移移位运算“<<”是将高位丢弃,低位补0 ;右移移位运算、“>>”是将低位丢弃,高位补0。而循环左移函数“_crol_” 是将移出的高位再补到低位,即循环移位;同理循环右移函数“_cror_” 是将移出的低位再补到高位。
三、思考题
1、如何改变流水灯的流动速度?
答:在本次实验中,可以通过更改延时程序delay里的i,j的值来改变流水灯的流动速度。
2、AT89S52单片机任何一个端口要想获得较大的驱动能力,要采用什么电平输出?
答:为了获得较大的驱动能力,通常会选择推挽输出模式。在推挽输出模式下,端口的高电平和低电平都可以通过外部上拉电阻和下拉电阻来实现,这样可以提供更强的驱动能力,适合连接到需要较高电流的外部设备。