最近開(kāi)始學(xué)習(xí)STC12C5410AD單片機(jī)。首先,這仍是一個(gè)51架構(gòu)的單片機(jī),目前來(lái)看,普通功能在編程時(shí),可以直接套用“reg51.h”這類的頭文件。但筆者之所以要學(xué)習(xí)這個(gè)單片機(jī),最主要的原因就是它集成了AD轉(zhuǎn)換功能。如果是這樣的話,一些特殊的寄存器在“reg51.h”的頭文件中應(yīng)該是沒(méi)有聲明的,所以單純套用“reg51.h”的頭文件似乎就行不通了。所以還是要建立一個(gè)新的頭文件。
較新版的STC的程序下載軟件可以生成12C5410AD的頭文件。筆者的版本是“STC-ISPV6.57”。
頭文件的生成方法:
頭文件的生成方法
往keil4添加STC數(shù)據(jù)庫(kù)的方法:
往KEIL4中添加STC數(shù)據(jù)庫(kù)的方法
先說(shuō)說(shuō)STC12C5410AD的IO口。和89C51相比,這個(gè)家伙的IO口專業(yè)了許多。89C51的IO口只有雙向一種模式。這事就好也不好了。對(duì)初學(xué)者來(lái)說(shuō),寄存器這個(gè)東西自然是越少越好,而設(shè)置IO口狀態(tài)的話當(dāng)然也就要通過(guò)專門(mén)的寄存器來(lái)設(shè)定。所以說(shuō),89C51的IO口只有一種狀態(tài),對(duì)初學(xué)者是好事。但這就限制了一些功能的發(fā)揮。也就不得不提到為什么要區(qū)分IO口是IN還是OUT,抑或別的狀態(tài)。
STC12C5410AD的IO口狀態(tài)有4種,分別是弱上拉(雙向口)、強(qiáng)上拉(輸出時(shí)用)、高阻(輸入時(shí)用)以及漏極開(kāi)路(什么時(shí)候用合適待考)。筆者首先描述一個(gè)實(shí)驗(yàn)現(xiàn)象:給單片機(jī)的任意4個(gè)IO口(如P1.0~P1.3)分別設(shè)定為以上4種狀態(tài),并寫(xiě)入1111,再在IO口輸出端分別接上一個(gè)LED和一個(gè)限流電阻(其實(shí)可以不加,但保險(xiǎn)起見(jiàn))。通電后,發(fā)現(xiàn)弱上拉的IO口后級(jí)LED有微弱的亮光(IO口電壓實(shí)測(cè)2.8V),強(qiáng)上拉的IO口后級(jí)LED發(fā)光正常(IO口電壓實(shí)測(cè)5V),其余兩個(gè)則不亮。
圖1 不同類型IO口測(cè)試電路圖
上周到工廠參觀實(shí)習(xí),每天早出晚歸,基本沒(méi)更新,終于到周末啦。
說(shuō)說(shuō)程序的燒寫(xiě)吧。由于stc12c5410AD內(nèi)部有大約5M的時(shí)鐘,所以不用外接晶振也可以燒寫(xiě)。但其內(nèi)部時(shí)鐘穩(wěn)定性不好,如果要實(shí)現(xiàn)多機(jī)通信等功能,最好好是用晶振。其他的和89c51的燒寫(xiě)電路和方法是完全一致的。
上文說(shuō)過(guò)IO口分四種狀態(tài),這就要使用P*M0和P*M1(*代表0,、1、2、3四個(gè)寄存器,但這個(gè)芯片沒(méi)有P0口的輸出引腳,所以實(shí)際不會(huì)用到P0M0和P0M1)這些寄存器了。具體使用方法可以參照stc官網(wǎng)上的芯片手冊(cè)或數(shù)據(jù)表。這里,筆者只列出一個(gè)更明了的表格:
表1 P1M0和P1M1寄存器設(shè)定舉例
|
|
|
|
|
|
|
|
|
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 | | MO | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | | M1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 |
這里P1.0口設(shè)定為弱上拉,P1.1設(shè)定為強(qiáng)上拉(輸出),P1.2設(shè)定為高阻(輸入),P1.3到P1.7都是集電極開(kāi)路狀態(tài)。
其實(shí)看的就是M0M1的狀態(tài):
00代表弱上拉,01代表強(qiáng)上拉,10代表高阻,11代表集電極開(kāi)路。相應(yīng)的C程序?yàn)椋?br />
P1M0 = 0xfc;
P1M1 = 0xfa;
接下來(lái)說(shuō)說(shuō)關(guān)于stc12c5410ad的定時(shí)器的使用。其實(shí)和51單片機(jī)是一模一樣的,只是應(yīng)為內(nèi)部的時(shí)鐘是5M到6M的振蕩器,所以在計(jì)算定時(shí)器初值的時(shí)候需要注意一下。這里先貼一段測(cè)試通過(guò)的代碼,然后在說(shuō)說(shuō)怎么計(jì)算:
#include
sbit T1Rdrive=P2^6;
sbit T2Wdrive=P2^7;
unsigned int k=0; //定時(shí)器累加標(biāo)志
unsigned int l=0; //定時(shí)器累加標(biāo)志
void delay(); //1s
void delayless(); //1ms
void delay()
{
int i, j;
for (i=0; i<1000;i++)
for (j=0; j<500;j++);
}
void delayless()
{ int j;
for(j=0; j<500; j++);
}
void main()
{
P2M0=0X3f; //定義P2.6,P2.7為強(qiáng)上拉輸出口
P2M1=0Xff;
T1Rdrive=0;
TMOD=0x00; //使用定時(shí)器0,模式0(13位計(jì)數(shù)器)
AUXR=0x00;
TL0=0X18;
TH0=0X62;
EA=1; //開(kāi)啟中斷控制
ET0=1; //定時(shí)器0的中斷申請(qǐng)?jiān)试S位
TR0=1; //開(kāi)啟計(jì)數(shù)器
while(1)
{
T2Wdrive=~T2Wdrive;
delay();
}
}
void t0int() interrupt 1
{
TL0=0X18;
TH0=0X62;
if(++k==100)
{T1Rdrive=~T1Rdrive;
k=0;}
}
待續(xù)--
|