LED即發(fā)光二極管,具有單向導電性。電路圖如下,LED與1K電阻串聯(lián)在5V與0V之間,即可點亮LED,電阻起限流作用?,F(xiàn)在我們來學習用單片機的IO(輸入輸出)引腳來點亮LED,用PC1引腳代替VCC,PC1輸出高電平點亮LED,輸出低電平熄滅LED。
IO即INPUT/OUTPUT,引腳作為輸入模式時,可以采集外界高低電平值;作為輸出模式時,引腳可以輸出高低電平。
一、庫函數(shù)DAHUME MINI2017.11.2.rar:http://pan.baidu.com/s/1hsvjq1A
解壓DAHUME MINI2017.11.2.rar(2017.11.2指最后修改時間,不定期更新)到當前文件夾。以后編寫程序都用這個工程作為模板。編寫一個新的工程,先解壓此工程,暫不使用實驗2中創(chuàng)建工程的方法。
1、打開DAHUME MINI.stw文件;
2、在STVD左側Workspace窗口Source Files目錄下找到main.c,雙擊打開,可以看到如下代碼;
#include "main.h"
void setup(void)
{
delay(10);
CLOCK(_16MHz);
pinMode(PC1, OUTPUT);
//_asm("rim");//rim為打開總中斷,sim為關閉總中斷
}
main()
{
setup();
while (1)
{
digitalWrite(PC1, HIGH);
delay(500);
digitalWrite(PC1, LOW);
delay(500);
}
}
代碼第一行,main.c包含了main.h頭文件,這個頭文件又包含了很多其他頭文件??梢园咽髽艘苿拥絤ain.h處右擊選擇Open Document “main.h”選項,也可以在Include Files目錄下找到main.h,雙擊打開,來查看總頭文件里包含了哪些子頭文件。這樣,我們就可以在main.c里調用包含頭文件里聲明過的所有的函數(shù)與變量。
函數(shù)與變量在***.c里定義,在源文件對應的***.h里聲明,其它源文件包含了***.h之后,就可以調用***.h里聲明過的函數(shù)與變量。
第二段代碼是定義一個函數(shù)。
void setup(void)
{
******
}
第一個void是函數(shù)的類型,調用函數(shù)是無返回值。void空格后的英文是函數(shù)名字,不能與變量名、參數(shù)名和其它函數(shù)名重復。后面括號里的void是調用函數(shù)時,使用的參數(shù)類型,void表示無類型,調用函數(shù)時不使用參數(shù)。其它類型如下表。
變量類型
數(shù)值范圍
_Bool
0、1
布爾變量
char、unsigned char
0~255(0~2^8-1)
無符號8位(byte)
signed char
-128~127
有符號8位
unsigned int
0~65535
無符號16位(word)
int、signed int
-32768~32767
有符號16位
unsigned long
0~16777215
無符號32位
long、signed long
-8388608~8388607
有符號32位
例如
void delay(unsigned int time_ms)
{
******
}
調用這個函數(shù)時,參數(shù)是無符號16位數(shù)值或者變量。以上變量類型是C語言關鍵字,也可作為函數(shù)類型和定義變量,例如
char abc(void)
{
char i;
return i;
}
這是一個返回char類型數(shù)值的函數(shù),函數(shù)內部定義了一個char類型的局部變量,之后返回了這個變量。調用abc函數(shù)時,會返回i的數(shù)值。
下面我們來看setup函數(shù)內部。第一行是
delay(10);
這是調用了延時函數(shù),作用是使單片機當前狀態(tài)保持10ms。在這里加延時是給所有設備上電或者復位后準備就行。
調用函數(shù)最后需要加分號。程序中大括號、中括號、小括號要成對出現(xiàn)。
CLOCK(_16MHz);
這個函數(shù)用來設置單片機的主頻率,主頻是16MHz,這個頻率的概念與用處將在后面實驗作詳細講解。
pinMode(PC1, OUTPUT);
void pinMode(char pin, char mode);是引腳工作模式設置函數(shù)。第一個參數(shù)是引腳名,STM8S105K4單片機除了PA1、PA2,其他IO引腳都可在此作為參數(shù)。PA1、PA2接上了晶振,用來給單片機提供時鐘源,去掉晶振后還可以做IO引腳使用。第二個參數(shù)是引腳的工作模式。可設置的工作模式如下表
參數(shù)
工作模式
INPUT
輸入模式
INPUT_IT
外部中斷輸入模式
OUTPUT
輸出模式
下面是一行//開頭的代碼,雙斜杠的作用是注釋本行的內容,在編譯器編譯程序時,不編譯此行內容,內容中可以出現(xiàn)中文。
注釋多行內容的方法如下
現(xiàn)在來看主函數(shù)main()。單片機上電和復位后運行主函數(shù)。
首先調用了setup();函數(shù),接下來是while函數(shù)。while是C語言關鍵字,while是循環(huán)語句。小括號里為執(zhí)行條件,條件為真(成立)或者不等于0時,循環(huán)執(zhí)行后面大括號里的代碼;條件為假(不成立)或者等于0時,不執(zhí)行后面大括號里的代碼或者執(zhí)行最后一遍循環(huán)后跳出循環(huán)。所以while (1)是一個無限循環(huán)或者叫死循環(huán)。
digitalWrite(PC1, HIGH);
void digitalWrite(char pin, _Bool value);函數(shù)設置輸出模式的引腳輸出電平值,電平參數(shù)value為HIGH輸出高電平,為LOW輸出低電平。
編寫完程序,點擊Build編譯程序,若下方Build窗口出現(xiàn)紅字(錯誤)如下圖,找到#error并雙擊,會跳轉到錯誤代碼處。
編譯無錯誤,將下載器與單片機下載接口正確連接,點擊Debug仿真程序。菜單欄第三行有如下幾個按鈕,第一個是Run(開始運行程序),第四個是Continue(繼續(xù)運行程序),第五個是Stop Program(停止運行程序)。點擊Run按鈕,可以看到程序運行效果。
開發(fā)板上PC1引腳的排針與LED1陽極的排針通過跳線帽連接。本例程所實現(xiàn)效果是PC1所接的LED1循環(huán)亮0.5秒滅0.5秒。
退出仿真,程序自動運行。若無法運行,硬件(按鍵)復位也無效,請將單片機重新上電。
二、寄存器pinMode(PC1, OUTPUT);
用寄存器寫即
PC_DDR_1 = 1;
PC_CR1_1 = 1;
或者
PC_DDR = PC_DDR | 0b00000010;
PC_CR1 = PC_CR1 | 0b00000010;
或者
PC_DDR |= 0b00000010;
PC_CR1 |= 0b00000010;
PC即Port C,C端口,PC1至PC7合稱C端口,STM8S105K4有A、B、C、D、E、F端口,每個端口有不同個數(shù)的引腳,總共25個IO引腳。DDR即data direction register,數(shù)據(jù)方向寄存器,用于設置IO引腳輸入輸出模式。CR1即control register 1,控制寄存器1。IO引腳作為輸出模式,配置模式如下。本實驗PC1引腳作為推挽輸出模式。
IO口配置表
配置模式
DDR位
CR1位
CR2位
配置模式
P-Buffer
輸出
1
0
0
開漏輸出
OFF
1
1
0
推挽輸出
ON
1
X
1
輸出(最快速度10MHZ)
CR1位決定
X
X
X
真正的開漏輸出(特定引腳)
未采用
0b是二進制數(shù)前綴,0x是十六進制數(shù)前綴。以上寄存器用二進制表示,有8位,最左為最高位(第7位),最右為最低位(第0位)。以PC_DDR寄存器為例,寄存器第x位決定PCx引腳的輸入輸出工作模式。
=用于賦值,將等號右邊的值賦值給等號左邊。
|用于二進制按位或運算。&用于二進制按位與運算。按位運算無需進位。
運算表達式
運算結果
運算表達式
運算結果
0 | 0
0
0 & 0
0
0 | 1
1
0 & 1
0
1 | 0
1
1 & 0
0
1 | 1
1
1 & 1
1
digitalWrite(PC1, LOW);
digitalWrite(PC1, HIGH);
用寄存器寫即
PC_ODR_1 = 0;
PC_ODR_1 = 1;
或者
PC_ODR = PC_ODR & 0b11111101;
PC_ODR = PC_ODR | 0b00000010;
或者
PC_ODR &= 0b11111101;
PC_ODR |= 0b00000010;
ODR即output data register,輸出數(shù)據(jù)寄存器,用于設置輸出引腳輸出電平值。
三、練習1、循環(huán)以下步驟:
1)LED1、LED2亮1秒;
2)LED2、LED3亮1秒;
3)LED1、LED2、LED3亮1秒;
4)三個燈全滅2秒。
提示:使用IO引腳先設置工作模式;