freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

單片機第14章c語言程序設(shè)計(參考版)

2025-01-19 17:56本頁面
  

【正文】 具體說明如下: ( 1)函數(shù) SelectChannel( )用來 進行通道的選擇,主程序?qū)⒌刂泛蛿?shù)據(jù)以參數(shù)的方式傳遞給 SelectChannel。ADC0809開始轉(zhuǎn)換后 EOC( End Of Converge)腳為低電平,當 A/D轉(zhuǎn)換結(jié)束時 EOC腳變?yōu)楦唠娖?,?jīng)取非后作為中斷請求信號觸發(fā)單片機中斷,在中斷服務(wù)程序中讀取A/D轉(zhuǎn)換的結(jié)果。 【 例 149】 單片機 與 ADC0809的中斷方式通信的接口 電路如 圖 144所示。 當 cDigital的值為 255時再加 1就發(fā)生溢出并為 0,所以在程序中不用再判斷 cDigital是否為 255。這一優(yōu)點的意義在本章 細說明。 代碼段一: define DAC0832Addr 0xfffe define uchar unsigned char *((uchar xdata*)DAC0832Addr)=c0832data; 代碼段二: unsigned char *p; p=0xfffe; *p= c0832data; 112 顯然 前者比后者 有兩個優(yōu)點 : 首先,代碼段一的意義明確,可讀性和可移植性更強。 111 最后, *((uchar xdata*)DAC0832Addr)=c0832data意義顯然為:將 c0832data的值寫入 DAC0832的數(shù)據(jù)端口。 這種方法(例 147程序中陰影標注一行)是較為經(jīng)典和精簡的代碼風格,初學者可以用如下拆分、等價的方式理解這句代碼: 首先, 由于宏替換, (uchar xdata*)DAC0832Addr相當于 (uchar xdata*) 0xfffe,即將 0xfffe強制轉(zhuǎn)換為指向外部數(shù)據(jù)空間的 unsigned char類型的指針,指針內(nèi)容為0xfffe,即指向了 DAC0832數(shù)據(jù)端口。使用該地址進行 DAC0832寫訪問時要先進行類型轉(zhuǎn)換。參考程序如下: include define DAC0832Addr 0xfffe /* 0832端口地址 */ define uchar unsigned char/*定義 uchar代表單字節(jié)無符號數(shù) */ define uint unsigned int /*定義 uint無符號字 sbit P26=0xA6; /* */ 107 sbit P27=0xA7; /* */ void TransformData(uchar c0832data); /*轉(zhuǎn)換數(shù)據(jù) */ void Delay( ) ; /*執(zhí)行延時函數(shù) */ main( ) /*主函數(shù) */ { uchar cDigital=0; /*待轉(zhuǎn)換的單字節(jié)無符號數(shù)字量初值為 0*/ Delay( ); /*調(diào)用延時程序 */ while(1) /*主體函數(shù)輪詢 */ { TransformData(cDigital); /*調(diào)用數(shù)模轉(zhuǎn)換函數(shù) */ cDigital++; /*輸出鋸齒波轉(zhuǎn)換的數(shù)字量不斷加 1*/ 108 Delay( ); /*調(diào)用延時函數(shù),無參數(shù)傳遞 */ } } void TransformData(uchar c0832data) { *((uchar xdata*)DAC0832Addr)=c0832data; /*向 DAC0832輸出待轉(zhuǎn)換數(shù)字量 c0832data*/ } void Delay() /*延時程序 */ { uint i; for(i=0; i200; i++); } 109 本例說明如下: ( 1)大部分簡單、低速的外圍設(shè)備( 例如 2MHz采樣率 AD、 DA、 RS23 RS422/485串口等,而非 DDR2 SDRAM、千兆以太網(wǎng)口等)都是 基于存儲器映射的字符設(shè)備 ,對于它們的操作與對于外部存儲器的讀、寫訪問是一樣。 } 106 DAC0832應(yīng)用程序的編寫 AT89S51與 DAC0832單緩沖方式接口電路如 圖 113所示。 default: break。 105 case KV_I_harmon: /* “電流諧波顯示”鍵 */ { /*調(diào)用 hammon_print子函數(shù) 。 case KV_U_harmon: /*“電壓諧波顯示”鍵 */ { /*調(diào)用 hammon_print子函數(shù) 。 case KV_wave: /*“波形顯示”鍵 */ { 104 /*調(diào)用 wave_print(void)子函數(shù) */ } break。 */ } 103 break。 //TODO: /*調(diào)整延時以確定按鍵釋放 */ return keyValue。 /*key not released*/ 102 break。 /*仍然被按下 */ /*判斷是否真的釋放 */ DelayMs(5)。 /*等待按鍵釋放 */ do { KEY_PORT = 0x0F。 /*補充 P1口鍵位行號 */ KEY_PORT= 0xF0。 keyValue = ~(KEY_PORT | 0xF0)。 /*延時去抖 */ 101 DelayMs(5)。 /*檢測是否有鍵按下 */ KEY_PORT = 0x0F。 typedef unsigned long ulong。 100 /*宏定義幾種數(shù)據(jù)類型 */ typedef unsigned char uchar。得到鍵位值后, 進入鍵位服務(wù)程序 。 先獲取鍵位列號: 按照之前的驅(qū)動方式對 P1口驅(qū)動高半字節(jié)為全 0,低半字節(jié)全 1,讀回 P1口的低半字節(jié)值。 首先查詢判斷是否有鍵按下: 驅(qū)動 P1口高半字節(jié)為全 0,低半字節(jié)為全 1,當讀回 P1口低半字節(jié)存在某位為 0時,表明有鍵按下。獨立式4 4鍵盤的接口電路如 下頁 圖 (見第 10章的圖 1010) 。 單片機外接行列式鍵盤, 用于控制單片機向 FPGA(現(xiàn)場可編程門陣列)發(fā)出指令啟動 AD對信號采樣分析,并控制單片機向 LCD傳輸數(shù)據(jù)以顯示波形和參數(shù)。 例如, 3號鍵按下,則 在 PC機顯示屏上顯示“ key No. 3 down”。獨立式鍵盤的接口電路如 圖 143所示 。參考程序如下。當 STB=1時, A和 B輸入端關(guān)閉,但允許 8位并行數(shù)據(jù)輸出。圖中 CLK端為同步脈沖輸入端。方式 0的典型應(yīng)用是外擴串行輸入并行輸出的同步移位寄存器74LS164,實現(xiàn)并行 I/O的擴展。 81 ( 4)啟動和停止定時器 T0 將定時器控制寄存器 TCON中的 TR0=1,則啟動定時器 T0; TR0=0,則停止定時器 T0定時。s),設(shè)定時器 T0的 計數(shù)初值為 X,假設(shè)晶振的頻率為 ,則 定時時間 為:定時時間 =(216?X)?12/晶振頻率 則 5000=(216 ?X)?12/ 得: X=60928,轉(zhuǎn)換成 十六 進制后為: 0xee00,其中0xee裝入 TH0, 0x00裝入 TL0。所以, TMOD寄存器 應(yīng)初始化為 0x01。 ( 1)設(shè)置 TMOD寄存器 定時器 T0工作在方式 1,應(yīng)使 TMOD寄存器的 MM0=01;定時器模式,應(yīng)設(shè)置 C/ =0;對 T0的運行控制僅由 TR0來控制,應(yīng)使 GATE0=0。 參考程序 : 0INT75 圖 141 控制 8只 LED交替閃爍的電路 76 include void Delay(unsigned int i) /* 定義延時函數(shù) Delay( ), i是形式參數(shù),不能賦初值 */ { unsigned int j; for(; i 0; i ) for(j=0; j333; j++) /*晶振為 12MHz, j的范圍見例 141*/ {; } /*空函數(shù) */ } 77 void main( ) /*主函數(shù) */ { EA=1; /*總中斷允許 */ EX0=1; /*外部中斷 0中斷允許 */ IT0=1; /*選擇外部中斷 0為跳沿觸發(fā)方式 */ While(1) /*循環(huán) */ { P1=0; } /* P1口的 8只 LED全亮 */ } 78 void int0( ) interrupt 0 using 0 /*外中斷 0的中斷服務(wù)函數(shù) */ { EX0=0; /*禁止外部中斷 0中斷 */ P1=0x0f; /*低 4位 LED滅,高 4位 LED亮 */ Delay(800) ; /*延時 800ms*/ P1=0xf0; /*高 4位 LED滅,低 4位 LED亮 */ Delay(800); /*延時 800ms */ EX0=1; /*中斷返回前,打開外部中斷 0中斷 */ } 79 定時器程序的編寫 【 例 144】 在 AT89S51的 P1口上接有 8只 LED。在程序剛啟動時,P1口上的 8只 LED亮。接口電路如 圖 141所示。在外部中斷 0輸入腳 ( ) 引腳接上拉電阻并接有一只 按鈕開關(guān) K1。 74 【 例 143】 在單片機系統(tǒng)的 P1口上接有 8只 LED, LED的陽極接 +5V,陰極接 P1口的引腳。由 中斷初始化程序 和 中斷服務(wù)程序 兩部分組成。 73 C51的程序設(shè)計舉例 本節(jié)重點介紹對 AT89S51片內(nèi)各種功能部件及硬件接口的 C51例程 ,讀者應(yīng)仔細閱讀并理解這些例程。如果在沒有實際的中斷請求的情況下,直接調(diào)用中斷函數(shù),也就不會執(zhí)行RETI指令,其操作結(jié)果有可能產(chǎn)生一個致命的錯誤。因為中斷函數(shù)的返回是由 指令 RETI完成的。 ( 2)中斷函數(shù)不能進行參數(shù)傳遞, 如果中斷函數(shù)中包含任何參數(shù)聲明都將導致編譯出錯。 71 例如 , 外中斷 1( ) 的中斷服務(wù)函數(shù)書寫如下: void int1( ) interrupt 2 using 0/*中斷號 n=2,選擇 0區(qū)工作寄存器區(qū) */ 編寫 AT89S51中斷程序時,應(yīng)遵循以下規(guī)則 : ( 1)中斷函數(shù)沒有返回值 , 如果定義了一個返回值,將會得到不正確的結(jié)果。 使用 關(guān)鍵字 using在函數(shù)中確定一個工作寄存器區(qū)時必須小心,要保證工作寄存器區(qū)切換都只在 指定的控制區(qū)域中發(fā)生 ,否則將產(chǎn)生不正確的函數(shù)結(jié)果。在定義一個函數(shù)時, using是一個選項,如果不選用該項, 則由編譯器選擇一個寄存器區(qū)作為絕對寄存器區(qū)訪問。 69 表 143 AT89S51中斷號和中斷向量 AT89S51在內(nèi)部 RAM中有 4個工作寄存器區(qū) ,每個寄存器區(qū)包含 8個工作寄存器( R0R7)。 中斷服務(wù)函數(shù)的一般形式為: 函數(shù)類型 函數(shù)名(形式參數(shù)表) [interrupt n] [using n] 關(guān)鍵字 interrupt后面的 n是 中斷號 ,對于 AT89S51,取值為 0~4,編譯器 從 8 n+3處產(chǎn)生中斷向量 。 C51中斷服務(wù)函數(shù)的定義 由于 標準 C沒有處理 單片機中斷 的定義,為直接編寫中斷服務(wù)程序, C51編譯器對函數(shù)的定義進行了擴展, 增加了一個 擴展關(guān)鍵字 interrupt,使用該關(guān)鍵字可以將一個函數(shù)定義成中斷服務(wù)函數(shù)。 例如: includ ; /* 不可缺少 */ define PORTB XBYTE[0xffc2] ; /* 定義外部 I/O口 PORTB的地址為 xdata區(qū)的 0xffc2*/ 67 也可把 片外 I/O口 的定義放在 一個頭文件中 , 然后在程序中 通過 include語句 調(diào)用 ??筛鶕?jù)需要來選擇為 pdata類型或xdata類型。 66 注意: AT89S51片內(nèi)的 4個并行 I/O口( P0~P3),都是 SFR, 故對 P0~P3采用 定義 SFR的方法 。 利用絕對地址的頭文件。這樣的無限循環(huán)在面向通用計算機的軟件設(shè)計中是不被允許的,然而嵌入式系統(tǒng)軟件設(shè)計中,則由于其硬件構(gòu)成和使用需求,常常采用這種無限循環(huán)。 63 【 例 142】 求 1到 100之間整數(shù)的和。 三種循環(huán)中,經(jīng)常使用的是 for語句 。 ( 2) while循環(huán) 格式為: while(循環(huán)體執(zhí)行條件),花括號 {}中為循環(huán)體內(nèi)容。i10。i10。 這里有一個值得注意的現(xiàn)象,能夠反映出 C51在編譯中對于執(zhí)行時間和占用的存儲單元的權(quán)衡。 59 2. 循環(huán)結(jié)構(gòu)程序 循環(huán)語句有以下 三種 。 如果看一下上述結(jié)構(gòu)的程序?qū)?yīng)的匯編語言源程序 可看到,每一條 break語句對應(yīng)了匯編語言中的一條 SJMP指令,而沒有
點擊復制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1