C51单片机使用2-流水灯测试

一、流水灯测试

运行效果:每隔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--);
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big_潘大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值