一、流水灯测试
运行效果:每隔0.6秒蜂鸣器响一声、同时LED灯由P1_0到P1_7轮着亮。
1、流水灯电路设计
LED灯共阳极,IO口输出低电平为点亮LED灯、IO口输出高电平则熄灭LED灯。由于单片机IO输出的电流不足以驱动LED灯,因此使用74HC573芯片驱动LED灯。
2、蜂鸣器电路设计
3、C语言移位实现
(1)左移:操作符”<<“。每执行依次左移指令,被操作的数将最高位移入单片机PSW寄存器的CY位,CY位中原来的数丢弃,最低位补0,其它位依次向左移动一位。
样例程序:
while(1)
{
a=a<<1;
}
(2)右移:操作符”>>“。每执行依次右移指令,被操作的数将最低位移入单片机PSW寄存器的CY位,CY位中原来的数丢弃,最高位补0,其它位依次向右移动一位。
while(1)
{
a=a>>1;
}
(3)循环左移:最高位移入最低位,其它位依次向左移一位。自带函数 _crol 实现
(4)循环右移:最低位移入最高位,其它位依次向右移位。自带函数 _cror 实现
流水灯实现使用C51自带的库函数_crol_()实现循环左移.
测试代码如下
//flow light and beep
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char m,n;
sbit beep=P2^3; //蜂鸣器
void delay10ms() //延时10毫妹胱映绦?
{
unsigned char a,b;
for(a=100;a>0;a--)
for(b=225;b>0;b--);
}
void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
n=0xfe; //设置初始值 11111110
while(1)
{
/*
//beep=0;
delay02s();
delay02s();
delay02s();
//beep=1;
m=_crol_(n,1);
n=m;
P1=m;
delay02s();
delay02s();
delay02s();
*/
//beep=0;
Delay_ms(500);
//beep=1;
m=_crol_(n,1);
n=m;
P1=m;
Delay_ms(500);
}
}
4、毫秒延时函数
第一个循环语句执行一次,则第二个循环语句执行110次。单片机的晶振是12MHz,它的时钟周期就是1/12us,它是单片机中最基本、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。
需要延时多少毫秒,xms值设置多少就行。这个时间是个大概时间,需要精确的时间需要使用专用的定时器中断
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}