兜兜的c51自学笔记-流水灯

本文介绍了51单片机控制LED灯的基本原理及其实现方法,包括点亮单个LED、多个LED以及实现流水灯效果的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时值2021暑假,兜某申请留校,开始51单片机学习之路。

正文开始之前,得感谢实验室学长的帮助

正文

c51对现在得我来说,就是一块可以被点亮得板子,从io口到寄存器,实际上我都是一知半解,那么我就从我的角度来讲一讲吧,在代码世界里0和1构成了全部,那么代码时如何干涉现实得呢,答案是电路,电路的开合构成了代码干涉现实的基础。

跑流水灯之前,首先得让灯亮起来,单片机上电之后,led模块由于它所具有的上拉电阻(我也不太能理解这个玩意)所表现得是高电平,而点亮他,只需要给它对应的Io(输入输出端)接上低电平即可也就是赋0(兜某使用的普中板子,led对应io是P2);所以不管是给P2(io总线)整体给0,还是P2下的0-7分线赋值0,都可。

例程1,点亮led模块第一个灯

#include<reg52.h>
 sbit  led=P2^0;
 void  main()
 {
 led=0;
 }

sbit位,简单来讲就是告诉编译器,这个P2的孩子0-7中的某一个,他不听话,你不要给他供电了,然后这个孩子觉得不满,表现出来就是亮了(随口一说)

例程2,点亮所有led灯

#include<reg52.h>
 sbit led1=P2^0;
 sbit led2=P2^1;
 sbit led3=P2^2;
 sbit led4=P2^3;
 sbit led5=P2^4;
 sbit led6=P2^5;
 sbit led7=P2^6;
 sbit led8=P2^7;

 void main()
 {
 led1=led2=led3=led4=led5=led6=led7=led8=0;
 }

笑死了,简单粗暴吧,哈哈哈。

 #include<reg52.h>
 #define uint  unsigned  int
 void  main()
 {	
 while(1)
 P2=0x00;
 
 
 }

也可以这样,这块有意思的i地方就是十六进制的问题了,因为普中板的P2总线下有八个led而前文说过要想让Led处于亮的状态只需要给它0,那么,对总线赋00000000就ok,由于十六进制转二进制0x00就是00000000,所以,给P2这个值即可。

十六进制赋总线数0xaa=10101010,0的位置亮1的位置灭(单片机内部都是以二进制存储的,只要是同一个数值的数就可,所以十六进制转十进制P2=170也能完成同样的效果)

流水灯实现的第二步

你可以通过十六进制自由的选择自己想让那个io口的led亮起之后,自然的就开始考虑,如何让led闪烁起来了,如何闪烁呢,你肯定想到了,给他不断地赋值0和1,它就闪起来了,你想的一点都没错,那么例程一来了

#include<reg52.h>
 
 sbit led=P2^0;
 
 void main()
 {
 while(1){
 led=0;

 led=1;
 
 }}
 

你观察一下,你的肉眼能区分到它的闪烁嘛?

答案是不行

为啥呢,因为闪的太快了,肉眼无法观察到,那么,接下来要做的就是对它进行延时,你给暗下去的那个过程延时,它自然就能观察到明显的明暗现象了。

#include<reg52.h>
 #define  uint  unsigned  int
 sbit led=P2^0;
 void  delay();
 void main()
 {
 while(1){
 led=0;
 delay();
 led=1;
 delay();
 }}
 void  delay()
 {
 uint i,j;
 for(i=500;i>0;i--)
 for(j=110;j>0;j--)
 ;
 }

延时的奥义就是给一个循环,给他进行无意义计算,拖慢进程,所以,那个分号别忘记写哦。

关于延时函数在此不予赘述,嗯,留一个可调用的函数就欧克,

void  delayms(unsigned  int xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;J>0;j--)
;
}
//i=xms极为延时约xms毫秒

如何使用延时对它进行流水灯的点亮呢

#include<reg52.h>
 #define  uint  unsigned  int
 #define  uchar  unsigned  char
 sbit led1=P2^0;
 sbit led2=P2^1;
 sbit led3=P2^2;
 sbit led4=P2^3;
 sbit led5=P2^4;
 sbit led6=P2^5;
 sbit led7=P2^6;
 sbit led8=P2^7;
 void  delayms(unsigned  int xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}
//i=xms极为延时约xms毫秒

 void main()
 {	  while(1){
 led1=led2=led3=led4=led5=led6=led7=led8=0;
delayms(500);
   led1=led2=led3=led4=led5=led6=led7=led8=1;
	  delayms(500);
	  
	  led1=0;delayms(500);		  led1=1;
	  led2=0;delayms(500);		  led2=1;
	  led3=0;delayms(500);		  led3=1;
	  led4=0;delayms(500);		  led4=1;
	  led5=0;delayms(500);		  led5=1;
	  led6=0;delayms(500);		  led6=1; 
	  led7=0;delayms(500);		  led7=1;
	  led8=0;delayms(500);		  led8=1;
	 
 }
 
  
 }

就像这样,是不是很繁琐,ok,下面说不繁琐的,先上代码

/流水灯  调用左右移函数在inteins.h文件下的_crol_(,)和_cror_(,)具体分辨以最后一位分辨l——left,r——right;
 #include<reg52.h>
 #include<intrins.h>
 #define  uint  unsigned  int
 #define  uchar  unsigned  char
  void  delayms(unsigned  int xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}
 uchar led;
void delay();

void main()
{
	led = 0xfe;
	P2 = led;
	while(1)
	{
		
		led  = _cror_(led,1);
		P2 = led;
		delayms(500);

	} 

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值