国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于數(shù)組法的IAP15F261S2型單片機外設(shè)控制方法研究

2024-07-14 16:21:30黃慶武胡婷
機電信息 2024年13期
關(guān)鍵詞:數(shù)碼管賦值繼電器

黃慶武 胡婷

摘 要:單片機I/O口控制,一般采用地址分時復(fù)用技術(shù),LED燈、蜂鳴器、繼電器、數(shù)碼管等是基于單片機外設(shè)控制的電子系統(tǒng)的常見外設(shè),采用數(shù)組法,根據(jù)I/O口的特征,對應(yīng)建立一維數(shù)組或二維數(shù)組,分別對控制外設(shè)的地址和參數(shù)進(jìn)行賦值,較過去常用的逐位選擇取值法,編程代碼結(jié)構(gòu)優(yōu)化,實現(xiàn)相同控制功能指令,執(zhí)行指令速度更快,代碼可復(fù)用性強,實現(xiàn)功能思路簡單明了。

關(guān)鍵詞:數(shù)組法;鎖存器;賦值;LED;繼電器;數(shù)碼管

中圖分類號:TP202? ? 文獻(xiàn)標(biāo)志碼:A? ? 文章編號:1671-0797(2024)13-0006-04

DOI:10.19514/j.cnki.cn32-1628/tm.2024.13.002

0? ? 引言

單片機體積小、質(zhì)量輕,廣泛應(yīng)用于智能儀表、實時工控、通信設(shè)備、導(dǎo)航系統(tǒng)、家用電器等領(lǐng)域。從20世紀(jì)90年代開始,單片機技術(shù)逐漸發(fā)展成熟,無論是自動測量還是智能儀表的實踐,都能看到單片機技術(shù)的身影[1]。當(dāng)前工業(yè)發(fā)展進(jìn)程中,電子行業(yè)屬于新興產(chǎn)業(yè),人們將電子信息技術(shù)與單片機技術(shù)相融合,有效提高了單片機應(yīng)用效果。

IAP15F261S2型單片機是STC生產(chǎn)的單時鐘/機器周期(1T)的單片機,采用STC第八代加密技術(shù),是集高速、高可靠、低功耗、超強抗干擾等功能于一體的新一代8051單片機,指令代碼完全兼容傳統(tǒng)8051、ISP/IAP系列型號,在系統(tǒng)/應(yīng)用可編程,無須編程器,無須仿真器,內(nèi)部集成R/C時鐘,ISP編程時5~35 MHz寬范圍可設(shè)置,可徹底省去外部昂貴的晶振和外部復(fù)位電路,LQFP44是44引腳的常用封裝形式。

1? ? 常用IAP15F261S2型單片機外設(shè)控制電路組成及原理

以典型IAP15F261S2型單片機外設(shè)控制如國信長天V20CT107S控制板為例,介紹外設(shè)器件控制原理,該控制板主要用于全國大學(xué)生藍(lán)橋杯電子設(shè)計競賽,具有較好的單片機外設(shè)控制的通用性,控制板主要外設(shè)包含有74HC138譯碼器、74HC02或非門電路芯片、M74HC573MIR鎖存器、ULN2003耐高壓大電流驅(qū)動芯片、LED燈、繼電器、蜂鳴器、DS17SEG-4數(shù)碼管、1 kΩ大小阻值電阻。單片機的P0端口,通過程序控制外設(shè)LED燈、繼電器、蜂鳴器、數(shù)碼管的通斷,為能實現(xiàn)4種外設(shè)的同步控制,采用了以P2端口P25、P26、P27引腳為地址的分時復(fù)用技術(shù),74HC138譯碼器的A、B、C分別與之相連接,通過程序控制P25、P26、P27引腳地址變化,實現(xiàn)74HC138譯碼器Y0-Y7通路的低電平輸出,該部分電路原理圖如圖1所示。Y4、Y5、Y6、Y7引腳與或非門芯片74HC02的U24、U25、U26、U27連接,或非門芯片的輸出狀態(tài)由P2端口P25、P26、P27引腳狀態(tài)確定,或非門輸出狀態(tài)為高電平時,使能鎖存器M74HC573MIR,通過對P0端口的狀態(tài)的鎖存,達(dá)到分時復(fù)用的功能,該部分電路原理圖如圖2所示[2]。通過鎖存器的Q1至Q8輸出端,實現(xiàn)LED燈、繼電器、蜂鳴器、數(shù)碼管等外設(shè)的控制。

2? ? 傳統(tǒng)單片機外設(shè)控制思路及程序?qū)崿F(xiàn)方法

傳統(tǒng)單片機P0端口分時復(fù)用思路是根據(jù)控制目的需要,將P0端口賦值,使用選擇結(jié)構(gòu)程序,將P2端口賦值,使對應(yīng)的74HC138譯碼器通路導(dǎo)通,74HC138譯碼器輸出信號與74HC02或非門電路邏輯計算,計算結(jié)果使能M74HC573MIR鎖存器,隨后將P2端口賦零值,P0端口狀態(tài)得以保存。以數(shù)碼管第一位顯示為例,對端口定義部分代碼,參考如下[3]:

void shumaguanshow(unsigned char position,unsigned char value)

{

switch(position)

{

case 1: P0=0x01;P2=(P2&0x1f)|0xc0;P2=

P2&0x1f;

{

if(value==0) {P0=0xc0;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==1) {P0=0xf9;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==2) {P0=0xa4;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==3) {P0=0xb0;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==4) {P0=0x99;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==5) {P0=0x92;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==6) {P0=0x82;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==7) {P0=0xF8;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==8) {P0=0x80;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

if(value==9) {P0=0x90;P2=(P2&0x1f)|0xe0;P2=P2=P2&0x1f;break;}

}

}

}

上述代碼僅對第1位數(shù)碼管的0~9的10個狀態(tài)值進(jìn)行顯示,如要求顯示更多狀態(tài)值,則可按此規(guī)則編程,2至8位的數(shù)碼管的狀態(tài)顯示,通過復(fù)制上述代碼中的狀態(tài)值即可。此方法思路清晰,通過數(shù)碼管的1至8位的位置選擇,隨后對數(shù)碼管賦值,即可實現(xiàn)數(shù)碼管的按位顯示功能,如要實現(xiàn)連續(xù)顯示,可利用人眼的視覺差,使用延時函數(shù)或定時器進(jìn)行控制。如編寫一個數(shù)碼管完整顯示函數(shù)代碼,代碼長度將超過200行,該方法存在代碼結(jié)構(gòu)復(fù)雜、執(zhí)行時間長、重復(fù)率高等不足。關(guān)于LED通路及繼電器、蜂鳴器通路分析類似,此代碼編寫思路方法給編程者造成了困難。

有關(guān)LED燈通路控制的程序代碼,過去常用的編寫方式如下:

void ledshow(unsigned char position,unsigned char value)

{

switch(position)

{

case 1:

if(value==1){P0=0xfe;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

case 2:

if(value==1){P0=0xfd;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

case 3:

if(value==1){P0=0xfb;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

case 4:

if(value==1){P0=0xf7;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

case 5:

if(value==1){P0=0xef;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

case 6:

if(value==1){P0=0xdf;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

case 7:

if(value==1){P0=0xbf;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

case 8:

if(value==1){P0=0x7f;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

if(value==0){P0=0xff;P2=(P2&0x1f)|0x80;P2=P2&0x1f;break;}

}

}

同樣,該方法代碼結(jié)構(gòu)復(fù)雜,重復(fù)率高,有改進(jìn)及優(yōu)化的空間,依據(jù)此方法,編寫相關(guān)P0端口的繼電器及蜂鳴器通路分時復(fù)用控制代碼,在此不再描述。

3? ? 數(shù)組法控制單片機外設(shè)的思路方法及實現(xiàn)

為解決上述代碼問題,若采用數(shù)組法,分別將數(shù)碼管的位置選擇值和顯示狀態(tài)值定義為數(shù)組變量值,通過賦值語句直接對數(shù)組取值,可有效減少代碼量重復(fù)率,同時不再使用選擇結(jié)構(gòu)語句,代碼復(fù)雜程度降低,整體結(jié)構(gòu)簡單易懂。以數(shù)碼管為例,使用數(shù)組法的參考代碼如下:

unsigned char smg_position[]={0,1,2,4,8,16,32,64,

128};

unsigned char smg_value[]={0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};

void smg(unsigned int position,unsigned int value)

{

P0=smg_position[position];P2=(P2&0x1f)|0xc0;P2=P2&0x1f;

P0=smg_value[value];P2=(P2&0x1f)|0xe0;P2=P2&0x1f;

}

在上述代碼中,數(shù)組變量smg_position[]定義為數(shù)碼管位置選擇值,由于在數(shù)組定義中,數(shù)組變量地址從0開始,而數(shù)碼管位置值為1至8,為此在數(shù)組變量smg_position[]中,將smg_position[0]定義為0,數(shù)組變量smg_value[]中,首地址值為1,故保持不變。上述7行代碼即可實現(xiàn)原思路方法200行以上代碼的顯示功能[4]。

關(guān)于LED通路的數(shù)組法編程代碼,由于LED燈的狀態(tài)顯示,則需定義一個二維數(shù)組,二維數(shù)組的行值為LED燈的位置選擇位,二維數(shù)組的列值為LED燈的狀態(tài)顯示。數(shù)組地址定義為以0為首地址,故關(guān)狀態(tài)值(即0)在前,開狀態(tài)值(即1)在后,同樣在二維數(shù)組的第0行補一行{0,0}代碼,LED燈的顯示,使用數(shù)組法的參考代碼如下[5]:

unsigned char LED_position_value[][2]= {{0,0},{0xff,0xfe},{0xff,0xfd},{0xff,0xfb},{0xff,0xf7},{0xff,0xef},{0xff,0xdf},{0xff,0xbf},{0xff,0x7f}};

void ledshow(unsigned char position,unsigned char value)

{

P0=LED_position_value[position][value];P2=(P2&0x1f)|0x80;P2=P2&0x1f;

}

關(guān)于繼電器與蜂鳴器通路的數(shù)組法編程代碼,對于部分未使用P0端口值,又占有數(shù)組中的位置,不得將其刪除,而應(yīng)以代碼{0,0}代替,同理第0行補一行{0,0}代碼,繼電器及蜂鳴器電路功能實現(xiàn),使用數(shù)組法編程的參考代碼如下:

unsigned char JDFM_position_value[][2]=

{{0,0},{0,0},{0,0},{0,0},{0,0},{0,0x10},{0,0},{0,0x40},{0,0}};

void JDFMshow(unsigned char position,unsigned char value)

{

P0=JDFM_position_value[position][value];P2=(P2&0x1f)|0xa0;P2=P2&0x1f;

}

4? ? 實驗效果驗證

利用keil5軟件,完善主函數(shù)功能代碼,并生成.hex文件,使用STC_ISP代碼下載軟件,對控制板進(jìn)行程序燒寫。以數(shù)碼管顯示20240328、LED燈第1和第8盞燈點亮為例,主函數(shù)的代碼參考如下[6]:

void main()

{

while(1)

{

smg(1,2);Delay1000us();

smg(2,0);Delay1000us();

smg(3,2);Delay1000us();

smg(4,4);Delay1000us();

smg(5,0);Delay1000us();

smg(6,3);Delay1000us();

smg(7,2);Delay1000us();

smg(8,8);Delay1000us();

Ledshow(1,1);Delay1000us();

Ledshow(8,1);Delay1000us();

}

}

數(shù)碼管及LED燈的顯示效果如圖3所示,而繼電器和蜂鳴器(發(fā)聲)無視覺效果,在此不作顯示。

5? ? 結(jié)論

本文通過數(shù)組法,實現(xiàn)了IAP15F261S2型單片機P0端口的分時復(fù)用功能,代碼編寫思路清晰,結(jié)構(gòu)簡單,具有較好的實用性,為單片機端口的外設(shè)控制提供了一種新的方法。

[參考文獻(xiàn)]

[1] 宏晶STC官網(wǎng).STC15系列單片機用戶手冊[Z],2023.

[2] 閻石.數(shù)字電子技術(shù)基礎(chǔ)[M].6版.北京:高等教育出版社,2016.

[3] 王英明,張露露,蔣林,等.C語言程序設(shè)計[M].5版.北京:清華大學(xué)出版社,2022.

[4] 林立,張俊亮.單片機原理及應(yīng)用[M].2版.北京:電子工業(yè)出版社,2024.

[5] 徐廣振,劉小莉.單片機技術(shù)應(yīng)用項目化教程(C語言版)[M].2版.北京:電子工業(yè)出版社,2021.

[6] 皮大能,胡學(xué)芝.單片機控制系統(tǒng)抗干擾技術(shù)[J].機械制造與自動化,2005(2):117-119.

作者簡介:黃慶武(1981—),男,湖北黃石人,碩士研究生,助理講師,研究方向:電氣與電子技術(shù)。

胡婷(1996—),女,湖北武漢人,碩士研究生,助理講師,研究方向:計算機與人工智能技術(shù)。

猜你喜歡
數(shù)碼管賦值繼電器
關(guān)于1 1/2 … 1/n的一類初等對稱函數(shù)的2-adic賦值
L-代數(shù)上的賦值
便攜式繼電器測試臺的研制和應(yīng)用
Arduino編程
電腦報(2019年2期)2019-09-10 07:22:44
MC9S08FL16單片機數(shù)碼管靜態(tài)顯示分析
單片機控制的四位數(shù)碼管動態(tài)顯示編程
基于Qt的數(shù)碼管數(shù)字編碼系統(tǒng)的設(shè)計與實現(xiàn)
電氣工程及其自動化控制系統(tǒng)中繼電器的應(yīng)用
電子測試(2018年22期)2018-12-19 05:12:42
強賦值幺半群上的加權(quán)Mealy機與加權(quán)Moore機的關(guān)系*
繼電器在電氣工程及其自動化低壓電器中的作用
電子制作(2016年23期)2016-05-17 03:53:43
玛曲县| 富源县| 长春市| 宁化县| 钟祥市| 上犹县| 奎屯市| 安丘市| 鄂温| 孙吴县| 开封市| 方正县| 泰兴市| 柘城县| 台东县| 无锡市| 巴彦县| 密山市| 温州市| 即墨市| 万安县| 舒城县| 本溪市| 五寨县| 改则县| 白玉县| 临澧县| 木兰县| 凤翔县| 荆门市| 曲阳县| 兴宁市| 新闻| 天长市| 彭州市| 木里| 虹口区| 永丰县| 宜春市| 旌德县| 如东县|