最近學的真的很雜,沒辦法,畢竟要恰飯。keil和proteus從沒用過,本篇博客用於記錄兩個軟件的學習過程以及嵌入式編程學習過程。
本篇包括:
安裝過程
新手村任務
keil的使用
proteus的使用
一、安裝過程:
我之前的博客提到過keil怎麼安裝,並且附帶了地址,可以破解。
proteus也很簡單,直接下載然後破解即可
二、新手村任務
keil不方便的地方就在於他沒有代碼補全的功能。其他還好,支持C\C++編譯,自帶的內核也很多。
這裏準備了兩個新手項目入手,點亮led燈和跑馬燈。
1. 點亮led燈
首先先來一個最簡單的led點亮程序吧:
1. 新建項目,選擇at89c52,空白項目,新建一個c語言文件。
2. 配置編譯參數,魔術棒---output----creat hex file打鉤。
3. 輸入代碼:
#include <reg52.h> sbit led = P0^1; void main() { led = 0; }
led = 0 代表了低電平,低電平就亮了,這個原理也不知道。慢慢摸索。
完事以後編譯會生成hex文件。
打開proteus軟件,開始畫圖
在proteus軟件內,也是生成一個空的圖紙,選擇工具欄鼠標下面的devices---p(pick)先搜索at89c52然後畫進去,同理畫一個LED-YELLOW進去,然後在下面幾個圖標中找到power。
然後用線點連起來就完事了。
選擇芯片右鍵,編輯屬性,把
hex文件放進program file 裏面,然後確定,點擊左下角的開始,燈就亮了。
小程序挺有意思的,還是再弄一個跑馬燈的試一下吧,我這裏有一個跑馬燈的代碼,現在就差proteus的圖紙不會畫。
另外,我還需要理解哪些代碼代表什麼,爲什麼會有一個p^1這種東西。
2. 跑馬燈小程序
先開始做跑馬燈吧。
代碼如下
#include <reg52.h> sbit led1 = P1^0; sbit led2 = P1^1; void delay(unsigned int n) { unsigned char i; while(--n) for(i = 0; i<125;i++); } int main(void) { while(1) { led1=0; led2=1; delay(1000); led1=1; led2=0; delay(1000); } }
建立圖紙,然後80c52芯片,添加一對元器件
那個兩豎線的是電容,中間一個矩陣的是晶振其他都還好,r後畫完以後就跑通了,非常穩。
既然實現已經實現了,接下來重要的問題在於理解代碼。
我們先從點亮led燈開始理解代碼:
#include <reg52.h>
sbit led = P0^1;
void main()
{
led = 0;
}
這個代碼的疑問就在於那個:led = P0^1是什麼東西,爲什麼P0這個參數能直接出來賦值?
我們還是到reg52.h裏面一探究竟:
#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;
我節選一點reg52.h裏面的代碼片段,可以看到,裏面是吧P0初始賦值了的,用的是16進制。
我們知道16進制的東西大多數用於地址,那麼也說得通,這個reg52.h就是初始化我們的80c52芯片的一個程序。
先理解兩個概念:字節地址和位地址。
1B=8Bit,所以一個字節中會有8個二進制數。我們說的按字節尋址就是找到第X個字節的位置,而按位尋址就是不僅能找到在哪個自己,還能找到具體哪一個二進制數。這個在單片機的存儲單元裏面會經常接觸。
接下來這個sfr是一個神奇的東西,他不是廣義上的類型,是一種特殊功能寄存器。
首先這個單片機的所有地址是布好的,這個比如說0x90這個地址就是引腳P1的地址,當你輸入 sfr P1 = 0x90這個代碼,就意味着P1就是P1了,說白了就是代碼變量P1就是板子上畫的P1引腳了。
我們之後對代碼變量P1的操作都會直接映射到芯片P1引腳,等價於直接映射到那個地址。這三個量就是同一個東西,0x90地址、代碼P1變量、板子上的P1引腳三位一體。