1. 程式人生 > >微控制器I/O擴充套件

微控制器I/O擴充套件

       由於微控制器的I/O口和有限則免不了需要做一些外部的I/O擴充套件,下面對其進行一些總結。對I/O口擴充套件的方法有很多,現從74HC59574HC165兩種晶片來做一些說明。

74HC595是一個串入轉並出的晶片,資料通過一個I/O序列輸入後經過74HC595後將資料8位並行輸出。下圖是它的各引腳原理圖。


       74HC595的第14引腳接微控制器的P3.4引腳,用來做資料的序列輸入口,資料通過該引腳傳入到74HC595中;其第11引腳接微控制器的P3.6引腳,做序列時鐘線,在該引腳的一個上升沿上可以做資料的鎖存,將8位資料依次鎖存到74HC595中;其第12引腳接微控制器的

P3.5引腳,用來做資料的並行輸出控制,在引腳的上升沿時將8位資料一同並行輸出。參考程式碼如下:

<span style="font-size:18px;">#include <reg51.h> 
#include <intrins.h>
#define  NOP() _nop_()  /* 定義空指令 */

//SPI IO
sbit MOSIO =P3^4;  //序列資料線
sbit R_CLK =P3^5;  //資料並行輸出控制
sbit S_CLK =P3^6;  //序列時鐘線


void delay(unsigned int i);      //函式聲名
void HC595SendData(unsigned char SendVal);  //函式聲名
 
// 此表為 LED 的字模 
unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
 
main()
{  unsigned char  HC595SendVal;
   unsigned int LedNumVal;
   
  while(1)
  {	 
	 	LedNumVal++;
		HC595SendVal = LED7Code[LedNumVal%16];     //LED7;顯示0-F  LedNumVal%10 顯示0-9
	    HC595SendData(HC595SendVal); //呼叫595驅動函式	
  		delay(200);
	 
  }   
}	
/*******************延時函式************/
void delay(unsigned int i)
{
    unsigned int j;
    for(i; i > 0; i--)	 //CPU迴圈執行i*300次
        for(j = 300; j > 0; j--);
}


/*********************************************************************************************************
** 函式名稱: HC595SendData
** 功能描述: 向SPI匯流排傳送資料
*********************************************************************************************************/
void HC595SendData(unsigned char SendVal)
{  
  unsigned char i;
		
  for(i=0;i<8;i++) 
   {
	if((SendVal<<i)&0x80) MOSIO=1; //set dataline high  0X80  最高位與SendVal左移的最高位 進行邏輯運算
	else MOSIO=0;				   // 如果為真 MOSIO = 1  
 
	S_CLK=0;  
	NOP();	 //短暫延時產生一定寬度的脈衝訊號
	NOP();	 //短暫延時
	S_CLK=1;
		
   }

 
  R_CLK=0; //set dataline low
  NOP();  //短暫延時
  NOP();  //短暫延時
  R_CLK=1; 	//
	

}</span>

    74HC165是一個併入轉串出的晶片,它可以將採集的8位資料通過一個I/O介面序列的輸出,它的引腳原理圖如下;


    74HC165的第9引腳接微控制器的P1.7,通過該引腳將資料送入到微控制器中處理;其第2引腳和第15引腳通過一個或非門連線後連線74HC165,所以第2和第15引腳功能可以互換一起連線到微控制器的P3.6引腳做時鐘控制;它的第1引腳接微控制器的P1.6引腳,用來控制將8位資料鎖存到74HC165中。參考程式碼如下:

<span style="font-size:18px;"> #include <reg52.H>
 #include <intrins.h> 

 #define  NOP()   _nop_()   /* 定義空指令 */

//SPI 介面
sbit    CLK    = P3^6;	   //序列時鐘
sbit    IN_PL  = P1^6;    //把資料載入到鎖存器中
sbit    IN_Dat = P1^7;    //資料通過P1.7腳移進微控制器內處理

sbit    RELAY  = P1^4;
sbit    BEEP   = P1^5;

unsigned char bdata Key;
sbit    K0=Key^0;	 //位定義
sbit    K1=Key^1;	 
sbit    K2=Key^2;	 
sbit    K3=Key^3;	 
sbit    K4=Key^4;
sbit    K5=Key^5;
sbit    K6=Key^6;
sbit    K7=Key^7;

bit  M0 ,K0J;  //位定義
unsigned long ReHC74165(void);	 //函式聲名 
void beep();    

 /********************************************************
 *	主函式												 *
 *														 *
 ********************************************************/
 main()
  {	  

  while(1)
  { 
    <span style="white-space:pre">	</span> unsigned long  Input=ReHC74165();//呼叫165驅動程式
	 Key=Input&0xff;  //將資料傳給位變數
	 RELAY = 1;
     <span style="white-space:pre">	</span> P2 = 0xff;	  //清除

	  //實現脈衝輸入
    <span style="white-space:pre">	</span>if(K0&K0J)M0=~M0;      
	K0J=~K0;  
  
	if(M0) {RELAY = 0; P2 = 0x7f;	}//實現脈衝輸入
	if(K1) {beep();    P2 = 0xbf;   }//K1 為1時開啟蜂鳴器和2個燈
	if(K2) {beep();    P2 = 0xdf;   }
    <span style="white-space:pre">	</span>if(K3) {beep();    P2 = 0xef;   }
	if(K4) {beep();    P2 = 0xf7;   }
	if(K5) {beep();    P2 = 0xfb;   }
	if(K6) {beep();    P2 = 0xfd;   }
	if(K7) {beep();    P2 = 0xfe;   }
   }    
   
 }

 /**********************************************************
 *														   *
 *	蜂鳴器 (讓蜂鳴器發出動聽聲音)						   *
 ************************************************************/
void beep()
{
  unsigned char i , j;
  for (i=0;i<2;i++)
   {
  
   for (j = 0; j<255; j++) {_nop_();}
   BEEP=!BEEP;                 //BEEP取反
   } 
   BEEP=1;                     //關閉蜂鳴器
}
 
 /*************************此部分為74HC165的驅動程式使用SPI匯流排連線*************************************/


/*********************************************************************************************************
** 函式名稱:  74HC165
** 功能描述: 
** 管腳描述:請參考相關的晶片資料(學習光碟中以配)
*********************************************************************************************************/
unsigned long ReHC74165(void)
{  
  unsigned char i;
  unsigned int indata;
		
   IN_PL=0;
   NOP();    //短暫延時 產生一定寬度的脈衝
   IN_PL=1;	 //將外部訊號全部讀入鎖存器中
   NOP(); 
              
   indata=0;   //儲存資料的變數清0  
   for(i=0; i<8; i++)
    { 
	indata=indata<<1;	 //左移一位
      <span style="white-space:pre">	</span>if(IN_Dat==1)indata=indata+1;	//如果IN_Dat檢測到高電平 儲存資料的變數加1 
 	CLK=0;   //時鐘置0
      <span style="white-space:pre">	</span>NOP();
      <span style="white-space:pre">	</span>CLK=1;   //時鐘置1	  
    } 
   
   return(~indata);	 //將儲存資料的變數取反後返回
}</span>





相關推薦

微控制器I/O擴充套件

       由於微控制器的I/O口和有限則免不了需要做一些外部的I/O擴充套件,下面對其進行一些總結。對I/O口擴充套件的方法有很多,現從74HC595和74HC165兩種晶片來做一些說明。 74HC595是一個串入轉並出的晶片,資料通過一個I/O序列輸入後經過74HC5

微控制器I/O口推輓輸出與開漏輸出的區別(open-drain與push-pull)

推輓(push-pull):推輓輸出的器件是指輸出腳內部整合有一對互補的MOSFET,當Q1導通、Q2截止時輸出高電平;而當Q1截止導通、Q2導通時輸出低電平。一個導通另一個就截止。 集電極開路:輸出端相當於孤立三極體的集電極. 要得到高電平狀態需要上拉電阻才行. 適合於做電流型的驅動,其吸收電

微控制器I/O口管腳內部結構(鎖存器,輸出驅動器,三態緩衝器,多路開關)

學習ARM嵌入式的時候,發現自己對以前學過的數模器件的知識遺忘了不少,按照我的進度本來應該繼續學習ARM微處理器控制的課程,但想著後來勢必還會遇到相同的問題所以就準備中斷一下,殺回來把彙編和一些電路知識再總結一下,查漏補缺。如果有寫的不合理的地方,還請多多指教。

微控制器I/O口使用

I/O口總體介紹 51微控制器總共有P0、P1、P2、P3四個8位雙向輸入輸出埠,每個埠都有鎖存器、輸出驅動器和輸入緩衝器。 其中P0和P2通常用於對外部儲存器的訪問,在具有片外擴充套件儲存器的系統中,P2口作為高8位地址線,P0口分時作為低8位地址線和

微控制器I/O口推輓與開漏輸出詳解(力薦)

推輓輸出:可以輸出高,低電平,連線數字器件;推輓結構一般是指兩個三極體分別受兩互補訊號的控制,總是在一個三極體導通的時候另一個截止. 開漏輸出:輸出端相當於三極體的集電極. 要得到高電平狀態需要上拉電阻才行. 適合於做電流型的驅動,其吸收電流的能力相對強(一般20ma以

一種提高微控制器i/o口驅動能力的方法

一、簡述問題 當你用單片驅動發光二極體的時,你還感覺不到P0、P1口的區別。(10-20mA之間,其中P0驅動能力最強,但對於驅動直流電機依然很弱,其結果就是電機不轉)。那麼有什麼辦法提高驅動能力嗎?下面就來介紹本文的一種簡單方法。 二、實驗元件 NPN三極體:s8050

51微控制器I/O埠內部結構深入分析

        這篇文章比較難的(也可以說不難,只是很少有人關注底層實現),請各位鼓起勇氣看完,我盡力把我認為的難點和僻點細緻介紹,有疑問可以一起切磋一下,轉載請申明出處,尊重勞動,謝謝。         我們至少要接觸到一下幾個知識點,也就是說,看完這個,你對以下的知識點

微控制器I/O口控制實驗

實驗內容:利用P1口做輸出口,接八隻發光二極體,編寫程式是發光二極體迴圈點亮或者具有一定的花樣。1.第一個發光二極體以間隔200ms閃爍;2.8個發光二極體由上至下間隔,1s流動,其中每個管亮500ms,滅500ms,亮時蜂鳴器響,滅時關閉蜂鳴器,一直重複下去;3.8個發光二

8051微控制器I/O引腳工作原理(P2埠修改指明)

8051微控制器I/O引腳工作原理 一、P0埠的結構及工作原理 P0埠8位中的一位結構圖見下圖: 由上圖可見,P0埠由鎖存器、輸入緩衝器、切換開關、一個與非門、一個與門及場效電晶體驅動電路構成。再看圖的右邊,標號為P0.X引腳的圖示,也就是說P0.X引腳可以是P0.0到

彙編實驗(8086)——簡單I/O擴充套件

1.實驗程式碼 ;全亮 全滅  左流水燈 CS_IO EQU 0300H   ;片選 CODE SEGMENT ASSUME CS:CODE START:      MOV DX,CS_IO     &n

MC9SD64微控制器快速入門 I/O暫存器

I/O的使用 資料方向暫存器和資料暫存器的配置 I/O輸入輸出的使用: 資料方向暫存器與資料暫存器 暫存器的概念: 暫存器,是積體電路中非常重要的一種儲存單元,通常由觸發器組成。在積體電路設計中,暫存器可分為電路內部使用的暫存器和充當內外部介面的暫存器這兩類。內部暫存器不能被外部電路或軟體訪問,只是為內部電路

華大微控制器HC32L110 HC32F003 HC32F005特殊埠應用注意事項三(SWD除錯程式設計埠複用為 I/O功能)

本文旨在拋磚引玉,其餘具體使用歡迎加Q:3230875137或加群164973950交流。 GPIO是通用輸入輸出模組,MCU可將一個 IO設為模擬模式,作為 ADC輸入;設為數字輸 入輸出,或是外設埠,供特定外設使用。使用埠功能前,需要先把 GPIO模組時鐘控制 功能開啟

使用STC15W4K系列微控制器需要注意I/O口的一些問題

在STC15W4K系列微控制器中,與PWM2—PWM7相關的12個I/O口[P3.7/PWM2,P2.1/PWM3,P2.2/PWM4,P2.3/PWM5,P1.6/PWM6,P1.7/PWM7,P2.7/PWM2_2,P4.5/PWM3_2,P4.4/PWM4_2,P4.

(一):微控制器最小系統組成與I/O輸出控制

 微控制器是一門實踐性較強的技術,很多初學者在學習微控制器技術開發的時候往往一頭霧水,不知何從下手。為此,筆者結合自己使用微控制器多年的經驗,特意設計了微控制器開發所需的Study-c 整機和硬體套件,並結合套件精心編寫了微控制器從入門到精通系列教程。通過講述微控制器原理

80c51微控制器通用I/O

80C51微控制器並行輸入/輸出口        80C51微控制器含有4 個8位並行I/O口P0、P1、P2和P3。每個口有8個引腳,如圖2-1所示,共有32個I/O引腳,每一個並行I/O口都能用作輸入或輸出。各口的第 一、第二功能如下:        I/O口   引腳

8051微控制器I/O

80C51微控制器並行輸入/輸出口        80C51微控制器含有4 個8位並行I/O口P0、P1、P2和P3。每個口有8個引腳,如圖2-1所示,共有32個I/O引腳,每一個並行I/O口都能用作輸入或輸出。各口的第 一、第二功能如下:        I/O口   引

微控制器 通用I/O

8051微控制器的4個I/O口主要有P0、P1、P2、P3。 P0口下拉能力較強;P3口有較多的複用功能; P0、P1口當訪問外部儲存器時可做為DB和AB口,P2口一般做為通用IO口使用。P1,P2,P3具有內部上拉雙向輸出IO口,P0口無內部上拉電阻為開漏輸出,如果做為普

筆記:I/O流-字符集

表示 ava deb 建立 gin integer 示例 字節 標準化 Java 庫的 java.nio 包用 Charset 類統一了對字符集的轉換,支付姐建立了兩個字節Unicode碼元序列與使用本地字符編碼方式的字節序列之間的映

Java I/O流的總結

註意 size 標記接口 ble ansi 寫入 就會 另一個 span I/O的類結構圖 I/O的分類 根據處理的數據類型分為:字節流和字符流。 根據數據流向分為:輸入流和輸出流。 流又可分為節點流和處理流。 節點流 直接與數據源相連 處理流 與節點流一

筆記:I/O流-對象序列化

err extends 自己 point clas xtend his size cto Java 語言支持一種稱為對象序列化(Object Serialization)的非常通用的機制,可以將任何對象寫入到流中,並在之後將其讀回,首先需要支持對象