【單片機學習】02點亮LED燈/閃爍燈/跑馬燈

一.前序:

1.需要安裝CH340驅動,沒有驅動,單片機通過usb連接電腦就不會識別到;

2.安裝KEILC51軟件,我理解該軟件:一針對個C51芯片的集成開發環境。寫C代碼,生成該芯片類型的可執行文件,當然也可以調試等。

3.安裝程序燒入程序,將上一步生成的.hex軟件,燒入單片機中。

4.打開單片機開關,通電,運行我們寫的程序。

 

二.第一個燈代碼:

#include "reg52.h"


sbit led=P2^0;

void main()
{

  led=0;
  while(1)
  {

  }
}

將這個程序編譯(KEIL中叫做build)後生成後綴爲.hex的文件,將該文件燒錄到單片機中,就可以通電運行了。

分析代碼:

//首先打開頭文件:reg52.h   看裏面寫了什麼
/*--------------------------------------------------------------------------
REG52.H

Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __REG52_H__
#define __REG52_H__

/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;

/*此處省略後面內容,只看上面*/
#endif

C51語言中兩個關鍵字:

sfr :用來訪問特殊功能寄存器。什麼是特殊功能寄存器:特殊功能寄存器在片內RAM中對應一個字節單元或者兩個字節單元,通過訪問該寄存器,可以控制單片機的定時器,計數器,串口,IO部件等等。

sbit:用來定義位變量. 寫法:  sbit 位變量名=位地址;   

       位地址有兩種:直接位地址  /  特殊功能寄存器帶位號 或 可位尋址變量帶位號(定義時用 ^ 相隔開).

      如上代碼:sbit led=P2^0; //爲變量名位led,地址位P2寄存器的第0位.

 

GPIO:通用輸入輸出端口。51單片機的CPIO引腳與外部設備連接起來就可以實現與外部通訊/控制等功能。

 

1.STC89C516芯片:

引腳:共40個,不同的引腳對應不同功能。其中Px.x就是GPIO引腳,一共4組,每一組8個.

 

三.跑馬燈and閃爍燈

#include "reg52.h"


void delay()
{
	int i=500;
	for(i;i>0;i--)
	{	
		int j=100;
		 for(j;j>0;j--);
	}
} 
/* 竟然不能重載....*/
/*
void delay(unsigned int i)
{
	while(i--);
}
*/
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
sbit led6=P2^6;
sbit led7=P2^7;

void Watering() //跑馬燈 依次亮	0~7
{
	led0=0;delay();
	led1=0;delay();
	led2=0;delay();
	led3=0;delay();
	led4=0;delay();
	led5=0;delay();
	led6=0;delay();
	led7=0;delay();	
}

void UpAll() //亮所有燈
{
	led0=0;
	led1=0;
	led2=0;
	led3=0;
	led4=0;
	led5=0;
	led6=0;
	led7=0;	
}
void ClearAll()	 //滅所有燈
{
	led0 = 1;
	led1 = 1;
	led2 = 1;
	led3 = 1;
	led4 = 1;
	led5 = 1;
	led6 = 1;
	led7 = 1;
}

void ReverseLed()
{
	led0 = ~led0;
	led1 = ~led1;
	led2 = ~led2;
	led3 = ~led3;
	led4 = ~led4;
	led5 = ~led5;
	led6 = ~led6;
	led7 = ~led7;
}
void main()
{	unsigned int times=5;
	while(times--)
	{
		UpAll();
		delay();
		ClearAll();	
		delay();
	}

	times=5;
	while(times--)
	{
		Watering();
		delay();
		ReverseLed();

	}

	while(1)
	{
		UpAll();
	}
}

很low的一段代碼.....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章