zoukankan      html  css  js  c++  java
  • 和菜鸟一起学单片机之入门级led流水灯

           单片机,一开始还不知道这个东西是干嘛的,直到前年的寒假,买来一块51的板子,开始了我的单片机生涯。一开始,还不知道这个东西和程序是怎么搞在一起的,写几行程序真的就这么容易就可以控制单片机了吗?傻傻地,按照给的资料,一点点的开始,先下了个led灯的程序,呀,这个神奇的事情就这么发生了,这个灯一个一个亮了,挺漂亮的。

           看着给的代码,就这么几行额,话说搞过ACM的,这个程序应该是超级简单的。一开始还是不是非常懂。所以就慢慢地开始去理解了,下面是自己写的各种流水灯了。代码都加了注释了,应该很好理解的。具体的电路图也在下面了。

     

    #include <reg51.h>              		//这个是51单片机的头文件了,主要是一些寄存器啊什么的,比如P0,P1等,
    
                                         		//都是8位的,
    
    void delay(unsigned int k);     		//这个就是自己定义的延时函数了,看着小灯亮和灭,其实就是靠这个函数来决
    
    					//定亮灭时间的长短的
    
     void main(void)                		//主函数,这个就不用说了,学过C的都知道的
    
    { 
    
    	unsigned char i, temp;      	//定义了变量i,和temp,主要是51的寄存器是8位的,即表示0-255之间
    
    					//的数,所以用unsigned char来定义。
    
    	while(1)                            //死循环中,不是一直都流水灯嘛?所以,这个函数一定要一直运行着,所以就
    
    				          //就是让他一直循环往复的运行着,不要停下来,就是不要退出main函数。
    
        	{
    
         		//8个流水灯从D8-D1逐个闪动
    
            		temp = 0x01;      		//0x01用二进制就是0000 0001,这样对吧?
    
            		for(i = 0; i < 8; i++)
    
            		{
    
                		P2 = ~temp;    	//temp取反就是 1111 1110,然后赋值给了P2,也就是而P2是接在led等上的,
    
    					//每一盏灯就是P2的一位,这样就表示P2的0位接的这盏灯是低电平,所以亮
    
    					//了(这个板子是低电平点亮灯的)
    
                		delay(500);   	//这里就是过了一段时间,就是让第一盏灯亮一段时间
    
                		temp <<= 1;  	//temp向左边移动了一位,也就是0000 0010了,然后取反之后再赋值给P2。P2
                                        		//就是P2=1111 1101,也就是第二盏灯亮了,然后,你就知道了这个慢慢地就是从
    
                                        		//第一盏灯到第八盏灯,一盏一盏点亮了,就是流水灯了。
    
            		} 
    
      		//8个流水灯从D1-D8逐个闪动
    
      		temp = 0x7f;      		//这里temp就是0111 1111了
    
      		for(i = 0; i < 8; i++) 
    
      		{
       			P2 = temp;     	//P2就是0111 1111,就是第8盏灯点亮了,然后下面就和上面第一盏灯到第八盏灯的
    
                               			//一样了,这里只是想反的,从第8盏到第一盏灯
    
       			delay(500);
    
       			temp >>= 1; 
    
       			temp |= 0x80; 
    
      		}
    
       	 	//8个流水灯依次从D8-D1全部点亮
    
      		temp = 0xff;           	//temp=1111 1111
    
      		for(i = 0; i < 8; i++)   
    
      		{
       			P2 = temp;        //P2一开始是1111 1111,所以全部熄灭的。
    
       			delay(500);                       
    
       			temp <<= 1;      //然后temp=1111 1110,然后第二盏灯就点亮了,接着temp会变成1111 1100,
    
                                                 	//就是第一盏灯和第二盏灯都是点亮的,接着就是慢慢地全部的灯都给他点亮
    
      		}
    
         		// 8个流水灯依次从D1-D8全部点亮
    
            		temp = 0x7f;               //这个刚好和上面的相反
    
            		for(i = 0; i < 8; i++) 
    
            		{
    
                		P2 = temp; 
    
                		delay(500);   
    
                		temp >>= 1;
    
    
            		}  
    
      		P2 = 0xff;                   
    
      		delay(1500);
    
      		//奇数点亮
    
      		P2 = 0x55;             //这个P2=0101 0101 ,就是0的那些灯是亮的,1的那些灯是灭的。
    
      		delay(1500);
    
     		 P2 = 0xff;
    
      		delay(1500);
    
      		//偶数点亮
    
      		P2 = 0xaa;   	//P2=1010 1010 ,和上面的一样
    
      		delay(1500);
    
      		P2 = 0xff;
    
      		delay(1500);
    
      		//全部点亮
    
      		P2 = 0x00;       //P2 = 0000 0000 ,所有的等都是点亮的。
    
      		delay(1500);
    
      		P2 = 0xff;
    
      		delay(1500);
    
      		//二进制加法,开始为0,从0加到15
    
      		P2 = 0xff;                   //一开始P2=1111 1111.所以都是灭的
    
      		for(i = 0; i < 15; i++)
    
      		{
    
       			P2--;      //P2--,就是P2=1111 1110,第一盏灯亮了,然后再减去1就是1111 1101.,这个就是2
    
                               		  //进制的加法的感觉了,具体实验效果很明显的
    
      	 		delay(1000);
    
      		}
    
      		delay(1000);
    
     
    
      		//二进制碱法, 开始为15,从15减到0
    
      		for(i = 0; i < 15; i++)
    
      		{
    
       			P2++;                       //这个和上面的那个类似
    
       			delay(1000);
    
      		}
    
      		delay(1000);
    
        	} 
    
    } 
    
    void delay(unsigned  int k)                 
    
    {
    
        	unsigned char j; 
    
        	for(; k; k--) 
    
        		for(j = 0; j < 255; j++);                     //看着?神奇吧,这不死瞎浪费时间吗?如果ACM里面有这个你会被
    
                                                                   		//队友给骂死的,这个让我算法的时间复杂度加大了多少啊。其实这
    
                                                                   		//里恰恰是妙处,什么都不做,就是让灯一直都是处于这种状态不变
    
                                                                   		//所以说单片机和实际程序的编程还是有区别的
    
    } 
    
    


            好了,讲到了这里,流水灯你应该懂了吧?主要板子没有了,所以效果也没放上来,不过相信喜欢单片机,想学的你肯定会买一块的,到处试验下就知道了,神奇的单片机世界,生活因你而美好。哈哈哈,从单片机入门,然后学习PICFPGAarm等,都会变得轻松一点。所以学好这个是基础。洗洗睡了,明天还有好多任务要完成呢,加油!

  • 相关阅读:
    Code::blocks 使用c++ long double类型出错
    数论四大定理
    线性基
    win7 下强制删除文件
    C++数组指针的引用
    学习方法
    MySQL的ON DUPLICATE KEY UPDATE用法
    MVCC
    RabbitMQ中的Connection 和 Channel
    myisam和innodb的比较
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300085.html
Copyright © 2011-2022 走看看