相信很多人在學(xué)習(xí)MCU(單片機(jī))的時(shí)候,都是從最基本的8位MCU開始的。如今,盡管32位MCU甚至更多功能強(qiáng)大的MCU大有下探取代之勢(shì),但是在許多工程師的記憶里以及相當(dāng)一部分應(yīng)用領(lǐng)域,8位單片機(jī)依然是不可磨滅的一代經(jīng)典!本文將結(jié)合單片機(jī)的生產(chǎn)廠商,帶你深入了解主流8位單片機(jī)的功能結(jié)構(gòu),引腳說(shuō)明,模塊分析以及具體應(yīng)用等等。
飛思卡爾 MC9S08AC60
簡(jiǎn)介
MC9S08AC60系列MCU是低成本、高性能HCS08系列8位微處理器單元 (MCU)的成員。這個(gè)系列的單片機(jī)均由一對(duì)引腳兼容的8位和32位器件組成,是Flexis系列器件的第3個(gè)系列產(chǎn)品。Flexis系列控制器是飛思卡爾控制器聯(lián)合體的連接點(diǎn),使8位與32位兼容性成為現(xiàn)實(shí)。
模塊結(jié)構(gòu)圖
系統(tǒng)時(shí)鐘圖
引腳圖
通用引腳連接
重要引腳說(shuō)明
VDD 和VSS 是MCU的主電源引腳。該電壓源為所有I/O 緩沖電路以及內(nèi)部穩(wěn)壓器供電。內(nèi)部穩(wěn)壓器向CPU 和MCU的其它內(nèi)部電路提供穩(wěn)壓后的低電壓源。
VDDAD 和VSSAD 是MCU的模擬電源引腳。該電源為ADC 模塊供電。必須在離該模擬電源引腳盡可能近的地方連接一個(gè)0.1 μF 陶瓷旁路電容,來(lái)抑制高頻噪音。
振蕩器(XTAL, EXTAL)
復(fù)位后,MCU使用內(nèi)部生成的時(shí)鐘(自時(shí)鐘模式— fSelf_reset),相當(dāng)于8 MHz 晶體振蕩頻率。這個(gè)頻率的時(shí)鐘源在復(fù)位啟動(dòng)時(shí)使用,可以作為停止恢復(fù)的時(shí)鐘源,這樣可以避免較長(zhǎng)的晶體啟動(dòng)延遲。該MCU還包含一個(gè)可修整的內(nèi)部時(shí)鐘發(fā)生器(ICG) 模塊,可以用它來(lái)運(yùn)行MCU。
RESET 引腳
RESET 是一個(gè)專用的引腳,內(nèi)置一個(gè)上拉器件。它有輸入滯后,包含一個(gè)高電流輸出驅(qū)動(dòng),無(wú)輸出斜率控制。內(nèi)部加電復(fù)位和低壓復(fù)壓電路一般都不需要外部復(fù)位電路。 這個(gè)引腳通常連接到標(biāo)準(zhǔn)的6引腳后臺(tái)調(diào)試連接器,這樣開發(fā)系統(tǒng)可以直接復(fù)位MCU系統(tǒng)。
后臺(tái)/模式選擇(BKGD/MS)
在復(fù)位時(shí),BKGD/MS 引腳充當(dāng)模式選擇引腳。復(fù)位完成后,該引腳立即作為后臺(tái)引腳,可以用于后臺(tái)調(diào)試通信。當(dāng)作為后臺(tái)/模式模式選擇引腳時(shí), 該引腳包括一個(gè)內(nèi)部上拉器件,有輸入滯后,且無(wú)輸出斜率控制。當(dāng)引腳作為后臺(tái)引腳時(shí),它包括一個(gè)高電流輸出驅(qū)動(dòng)。當(dāng)該引腳作為模式選擇引腳時(shí),它只有輸入,因此不包含標(biāo)準(zhǔn)的輸出驅(qū)動(dòng)。
ADC 參考引腳(VREFH, VREFL)
VREFH和VREFL 引腳分別為ADC模塊的電壓參考高輸入和電壓參考低輸入。
外部中斷引腳 (IRQ)
IRQ 引腳是IRQ中斷的輸入源,也是BIH 和BIL指令的輸入。如果未使能IR功能,這個(gè)引腳仍配置為TPMCLK 。
通用I/O和外設(shè)端口
剩余的引腳被通用I/O和片上外設(shè)功能,如定時(shí)器和串行I/O系統(tǒng)共用。復(fù)位后,所有這些引腳立即配置為高阻抗通用輸入,且內(nèi)部上拉器件關(guān)閉。
重要模塊分析
存儲(chǔ)器
MC9S08AC60系列MCU中的片上存儲(chǔ)器包括RAM、非易失性數(shù)據(jù)存儲(chǔ)的Flash存儲(chǔ)器、I/O 和控制/ 狀態(tài)寄存器。這些寄存器可分為以下三類:
? 直接頁(yè)面寄存器
? 高位頁(yè)面寄存器
? 非易失性寄存器
復(fù)位、中斷和系統(tǒng)配置
復(fù)位和中斷特性包括:
? 多源復(fù)位,實(shí)現(xiàn)靈活的系統(tǒng)配置和可靠操作
? 加電檢測(cè)(POR)
? 低壓檢測(cè)(LVD),使能
? 外部RESET 引腳
? COP 看門狗使能,及兩個(gè)超時(shí)選擇
? 非法操作代碼
? 來(lái)自后臺(tái)調(diào)試主機(jī)的串行命令
? 復(fù)位狀態(tài)寄存器(SRS) ,指示最新復(fù)位的源
? 每個(gè)模塊的單獨(dú)中斷向量 (減少輪詢開銷)
并行輸入 / 輸出
通過(guò)端口數(shù)據(jù)寄存器讀/ 寫并行I/O。輸入輸出方向由端口數(shù)據(jù)方向寄存器控制。下面的結(jié)構(gòu)圖舉例了一個(gè)引腳的并行I/O端口功能。
中央處理單元 (S08CPUV2)
HCS08 CPU具有以下特性:
? 目標(biāo)代碼完全兼容M68HC05和M68HC08家族
? 所有寄存器和存儲(chǔ)器映射到一個(gè)獨(dú)立的64 KB的地址空間
? 16位堆棧指針 (64 K字節(jié)地址空間內(nèi)任意大小、任意地址的堆棧)
? 16位變址寄存器 (H:X)支持強(qiáng)大的索引地址模式
? 8位累加器 (A)
? 許多指令把X作為第二個(gè)通用8位寄存器
? 7種尋址模式:
? 固有尋址模式 — 操作數(shù)存于內(nèi)部寄存器
? 相對(duì)尋址模式 —8位有符號(hào)偏移量的分支地址
? 立即尋址模式 — 操作數(shù)位于下一個(gè)目標(biāo)代碼
? 直接尋址模式 — 操作數(shù)位于0x0000到0x00FF之間
? 擴(kuò)展尋址模式 — 操作數(shù)位于64K字節(jié)地址空間內(nèi)
? H:X相對(duì)變址尋址模式 — 提供包括自動(dòng)增量在內(nèi)的5種子模式
? SP相對(duì)變址尋址模式 — 大大提高C語(yǔ)言編譯的效率
? 提供四種尋址模式組合的寄存器-寄存器數(shù)據(jù)轉(zhuǎn)移指令
? 溢出、半進(jìn)位、負(fù)、零和進(jìn)位狀況碼支持根據(jù)帶符號(hào)、無(wú)符號(hào)、BCD碼操作的結(jié)果進(jìn)行條件轉(zhuǎn)移
? 高效率的位操作指令
? 快速8位乘8位和16位除8位指令
? STOP和WAIT指令調(diào)用低功耗運(yùn)行模式
模數(shù)轉(zhuǎn)換器(S08ADC10V1)
10位模數(shù)轉(zhuǎn)換器 (ADC)是新一代的逼近模數(shù)轉(zhuǎn)換器,在集成的微處理器片上系統(tǒng)中運(yùn)行。 這種ADC模塊設(shè)計(jì)支持最高28個(gè)獨(dú)立的模擬輸入 (AD0-AD27)。MC9S08AC60系列微處理器上只使用了其中18個(gè)(AD0-AD15、AD26和AD27)輸入。這些輸入通過(guò)ADCH位選擇。
ADC模塊特點(diǎn)包括:
? 線性逐次逼近算法,10位精度。
? 多達(dá)28個(gè)模擬輸入。
? 8位或10位右對(duì)齊格式輸出
? 單個(gè)或連續(xù)的轉(zhuǎn)換 (單個(gè)轉(zhuǎn)換后自動(dòng)返回到空閑)
? 設(shè)置采樣時(shí)間和轉(zhuǎn)換速度 (功率)
? 轉(zhuǎn)換完成標(biāo)志和中斷
? 輸入時(shí)鐘可以選擇高達(dá)四個(gè)時(shí)鐘源
? 在等待或stop3模式中操作為低噪音操作
? 異步時(shí)鐘源的低噪音操作
? 可選的異步硬件轉(zhuǎn)換觸發(fā)
? 自動(dòng)比較小于,大于或等于編程值
? 溫度傳感器
時(shí)鐘顯示程序
使用MC9S08AC的Timer做一個(gè)時(shí)鐘,并在LCD1602上顯示
lcd1602.h
#ifndef _NICROSYSTEM_FREESCALE_S08_DEVKIT_LCD1602_H_
#define _NICROSYSTEM_FREESCALE_S08_DEVKIT_LCD1602_H_
unsigned char lcd_status(void);
void lcd_init(void);
void lcd_write_char(unsigned char x,unsigned char y, unsigned char ch);
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s);
void lcd_write_data(unsigned char data);
void lcd_write_cmd(unsigned char cmd);
#endif
lcd1602.c
#include "lcd1602.h"
#include "derivative.h"
#define LCD_DATA PTED
#define LCD_DATA_DIR PTEDD
#define LCD_DATA_DS PTEDS
#define LCDRS PTAD_PTAD0
#define LCDRW PTAD_PTAD1
#define LCDE PTBD_PTBD0
#define LCDRS_DIR PTADD_PTADD0
#define LCDRW_DIR PTADD_PTADD1
#define LCDE_DIR PTBDD_PTBDD0
#define LCDE_DS PTBDS_PTBDS0
#define LCDRS_DS PTADS_PTADS0
#define LCDRW_DS PTADS_PTADS1
void lcd_clear(void);
void lcd_write_cmd(unsigned char cmd);
void init_lcd() {
LCD_DATA_DIR=0xff;
LCDRS_DIR=1;
LCDRW_DIR=1;
LCDE_DIR=1;
LCDRS_DS=1;
LCDRW_DS=1;
LCDE_DS=1;
LCD_DATA_DS=0xff;
LCD_DATA=0;
LCDE=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
lcd_clear();
lcd_write_cmd(0x38);//設(shè)置lcd功能:8位總線,雙行顯示,5X7點(diǎn)陣字符
lcd_write_cmd(0x0f);//顯示開關(guān)控制:顯示ON,光標(biāo)ON,閃爍ON
lcd_write_cmd(0x06);//光標(biāo)輸入方式增量移位
lcd_write_cmd(0x80);
}
unsigned char lcd_status() {
byte lcdstatus;
LCD_DATA_DIR=0x00;
LCDRS=0;
LCDRW=1;
LCDE=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LCDE=1;
lcdstatus=LCD_DATA;
LCD_DATA_DIR=0xff;
return lcdstatus;
}
void lcd_write_cmd(unsigned char cmd) {
byte status;
LCD_DATA=cmd;
LCDRS=0;
LCDRW=0;
LCDE=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{
status=lcd_status();
}
while(status&0x80);
LCDE=1;
}
void lcd_clear(void) {
lcd_write_cmd(0x01);
}
void lcd_write_data(unsigned char data) {
byte status;
LCD_DATA=data;
LCDRS=1;
LCDRW=0;
LCDE=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{
status=lcd_status();
}
while(status&0x80);
LCDE=1;
}
void lcd_write_char(unsigned char x,unsigned char y,unsigned char ch) {
if(y)
lcd_write_cmd(0xc0+x);
else
lcd_write_cmd(0x80+x);
lcd_write_data(ch);
}
void lcd_write_str(unsigned char x,unsigned char y,char*s) {
if(y)
lcd_write_cmd(0xc0+x);
else
lcd_write_cmd(0x80+x);
while(*s){
lcd_write_data(*s);
s++;
}
}
main.c
#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "mc9s08ac16.h"
#include "lcd1602.h"
const unsigned char table[10]={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’};
unsigned char hour=11,minute=20,second=0;
unsigned char con_result[9];
void init_system_clk(void)
{
ICGC1=0xf8;
ICGC2=0x89;
while(ICGS1_LOCK==0);
}
void convert() /*covert numeric data to char data,for instance,1 to ‘1’ */
{
unsigned char tens,unit;
tens=second/10;
unit=second%10;
con_result[7]=table[unit];
con_result[6]=table[tens];
tens=minute/10;
unit=minute%10;
con_result[4]=table[unit];
con_result[3]=table[tens];
tens=hour/10;
unit=hour%10;
con_result[1]=table[unit];
con_result[0]=table[tens];
con_result[8]=‘\0’;
con_result[2]=‘:’;
con_result[5]=‘:’;
}
interrupt VectorNumber_Vtpm1ovf void TMP1_OVF_ISR(void)
{
DisableInterrupts;
TPM1SC_TOF=0;
second++;
if(second>59)
{
minute++;
second=0;
}
if(minute>59)
{
hour++;
minute=0;
}
if(hour>23)
{
hour=0;
}
convert();
lcd_write_str(4,1,con_result);
lcd_write_cmd(0x0c);
EnableInterrupts;
}
void main(void)
{
EnableInterrupts; /* enable interrupts */
/* include your code here */
SOPT_COPE=0;
init_system_clk();
init_lcd();
lcd_write_str(2,0,"NicroSystem");
TPM1SC=0x4e;
TPM1MODH=0xf4;
TPM1MODL=0x24;
for(;;) {
//__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
典型應(yīng)用
室內(nèi)空調(diào)系統(tǒng)
現(xiàn)代空調(diào)系統(tǒng)使用越來(lái)越多的半導(dǎo)體來(lái)支持一系列高級(jí)功能,包括節(jié)能電機(jī)、交互式用戶界面和遙控器等。飛思卡爾可提供滿足這些領(lǐng)域特定需求的相應(yīng)解決方案, 例如,能夠提高能效并降低工作噪聲的高級(jí)電機(jī)控制解決方案,針對(duì)用戶界面的一系列控制解決方案,以及針對(duì)遙控的基于紅外線和射頻的解決方案。
無(wú)刷直流電機(jī)(BLDC)
無(wú)刷直流(BLDC)電機(jī)在風(fēng)扇、泵、HVAC風(fēng)機(jī)與壓縮機(jī)、計(jì)算機(jī)磁盤驅(qū)動(dòng)器與外設(shè)、家用電器、機(jī)器人、伺服系統(tǒng)、牽引控制、縫紉機(jī)和跑步機(jī)等應(yīng)用中廣 泛使用。BLDC電機(jī)是一種旋轉(zhuǎn)電動(dòng)機(jī)械,其定子為類似感應(yīng)電機(jī)的傳統(tǒng)三相定子,轉(zhuǎn)子使用永磁體。電機(jī)扭矩和速度可由微控制器(MCU)或數(shù)字信號(hào)控制器 (DSC)實(shí)現(xiàn)極高效控制。飛思卡爾支持霍爾傳感器(換向)和無(wú)傳感器控制功能。
汽車暖通空調(diào)(HVAC)
暖通空調(diào)(HVAC)系統(tǒng)利用各種傳感器輸入的數(shù)據(jù),控制不同類型的電機(jī),如用于擺葉的步進(jìn)電機(jī)和直流/無(wú)刷直流風(fēng)扇電機(jī)。
MC9S08AC60相關(guān)資料下載:
?
評(píng)論
查看更多