一.前序:
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的一段代碼.....