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

正文內容

單片機第14章c語言程序設計(完整版)

2025-02-21 17:56上一頁面

下一頁面
  

【正文】 R7, 333, HERE /*2個機器周期 */ 39 其中 {。雖然這里的“文件包含”只有一行,但 C編譯器在處理的時候卻要處理幾十行或幾百行。程序設計者就是 編寫一系列的函數模塊 ,并在需要的時候調用這個函數,實現程序所要求的功能。 需指出,擴展片外存儲器,原理上雖很簡單,但在實際開發(fā)中,很多時候,會帶來不必要的麻煩,如可能降低系統(tǒng)穩(wěn)定性、增加成本、拉長開發(fā)和調試周期等, 推薦充分利用片內存儲空間。只有對 C51中的各種數據類型以及存儲類型非常熟練的掌握,才能運用自如。 ( 1)片內數據存儲器 片內 RAM可分為 3個區(qū)域 : data: 片內直接尋址區(qū) ,位于片內 RAM的低 128字節(jié)。 注意,不要把 bit與 sbit混淆。 例如: sfr P1=0x90這一語句定義 P1口在片內的寄存器,在后面語句中可用 “ P1=0xff” (使 P1的所有引腳輸出 20 為高電平 )之類的語句來操作特殊功能寄存器。針對AT89S51單片機的硬件特點, C51在標準 C的基礎上, 擴展了 4種數據類型 (見 表中最后 4行 )。例如庫函數 printf和 scanf,在標準 C中,這兩個函數通常用于屏幕打印和接收字符,而在 Keil C51中,它們主要用于串行口數據的收發(fā)。 14 ( 3)數據存儲類型的不同 。 C51與標準 C的主要區(qū)別 不同的嵌入式處理器的 C編譯系統(tǒng) 與標準 C的不同之處 ,主要是它們所針對的嵌入式處理器的硬件系統(tǒng)不同。Vision3,可 簡寫為 181。它支持眾多的 MCS51架構的芯片,同時集編輯、編譯、仿真等功能于一體,具有強大的軟件調試功能,是眾多的單片機應用開發(fā)軟件中最優(yōu)秀的軟件之一。用 C51開發(fā)出來的程序模塊可以不經修改,直接被其他項目所用,這使得開發(fā)者能夠很好地利用已有的大量的標準 C程序資源與豐富的庫函數,減少重復勞動。Vision3以及 C51與匯編語言的 混合編程 作以介紹。1 第 14章 單片機 C語言 程序設計基礎 2 第 14章 目錄 編程語言 Keil C51簡介 Keil C51簡介 Keil C51的開發(fā)環(huán)境 C51與標準 C的主要區(qū)別 C51語言程序設計基礎 C51語言中的數據 C51的位變量定義 一個簡單的 C51程序 C51的運算符 C51的分支與循環(huán)程序結構 3 AT89S51不同存儲區(qū)的 C51定義 C51中斷服務函數的定義 C51的程序設計舉例 中斷程序的編寫 定時器程序的編寫 串行口方式 0應用程序的編寫 獨立式鍵盤查詢方式 行列式鍵盤查詢方式 DAC0832應用程序的編寫 4 ADC0809應用程序的編寫 C51的集成開發(fā)環(huán)境 Keil 181。 6 編程語言 Keil C51簡介 目前 51系列單片機編程的 C語言都采用 Keil C51(簡稱C51), Keil C51是在標準 C語言基礎上發(fā)展起來的 。 8 ( 3)可移植性好。 10 Keil公司目前已推出 C51編譯器 ,為51單片機軟件開發(fā)提供了全新的 C語言環(huán)境,同時保留了匯編代碼高效、快速的特點。Vision3,指的是用于51單片機的 C51程序編寫、調試的 集成開發(fā)環(huán)境 。Keil C51的基本語法與標準 C相同,但對標準 C進行了擴展。 C語言最初是為通用計算機設計的,在通用計算機中只有一個程序和數據統(tǒng)一尋址的內存空間, 而 51系列單片機 有片內、外程序存儲器,還有片內、外數據存儲器。 ( 6)程序結構的差異 。 注意: 擴展的 4種數據類型,不能使用指針對它們存取。 ( 3)特殊功能寄存器 sfr16 “ sfr16”數據類型 占用兩個內存單元。 bit用來定義普通的位變量,值只能是二進制的 0或 1。 bdata: 片內位尋址區(qū) ,位于片內 RAM位尋址區(qū)20H~2FH。 26 定義 變量類型 應考慮如下問題: 程序運行時該變量可能的取值范圍,是否有負值,絕對值有多大,以及相應需要的存儲空間大小。 另外,通常的單片機應用都是面對小型的控制,代碼比較短,對于程序存儲區(qū)的大小要求很低,常常是片內RAM很緊張而片內 Flash ROM很富裕,因此如果實時性 28 要求不高, 可考慮使用 宏 ,以及將一些子函數的常量數據做成數據表,放置在程序存儲區(qū),當程序運行時,進入子函數動態(tài)調用下載至 RAM即可,退出子函數后立即釋放該內存空間。 33 1. C51程序與函數 下面通過一個簡單 C51程序, 認識 C51程序與函數。 程序的 第 2行 用符號 P10來表示 。}在反匯編時不對應任何語句,即不占用機器周期。 ( 1)標準庫函數 Keil C51具有功能強大、資源豐富的標準庫函數,由C51編譯器提供。如果一個函數體內有多個花括號,則最外層的一對“ { }”為函數體的范圍。調用空函數時, 什么工作也不做,不起任何作用。 46 ( 2)嵌套調用 是在被調用的函數中 又調用其他函數的語句 。本節(jié)對 C51中用到的 標準 C運算符進行復習 ,為 C51的程序設計打下基礎。 50 例如: 若 i=4,則執(zhí)行 x=++i時,先使 i加 1,再引用結果,即 x=5,運算結果為 i=5, x=5。 邏輯與 ΙΙ 邏輯或 ! 邏輯非 52 表 145 關系運算符及其說明 符號 說明 大于 小于 = 大于或等于 = 小于或等于 == 等于 != 不等于 53 4. 位運算 位運算符及其說明如 表 146所示。 56 1. 分支結構程序 (1) 只有兩條分支的時候用 If (條件 ) {分支 1} else {分支 2} (2) 分支較多時 在 分支較多時的情況下使用 switch語句。i10。 63 【 例 142】 求 1到 100之間整數的和。可根據需要來選擇為 pdata類型或xdata類型。 69 表 143 AT89S51中斷號和中斷向量 AT89S51在內部 RAM中有 4個工作寄存器區(qū) ,每個寄存器區(qū)包含 8個工作寄存器( R0R7)。 ( 2)中斷函數不能進行參數傳遞, 如果中斷函數中包含任何參數聲明都將導致編譯出錯。由 中斷初始化程序 和 中斷服務程序 兩部分組成。在程序剛啟動時,P1口上的 8只 LED亮。s),設定時器 T0的 計數初值為 X,假設晶振的頻率為 ,則 定時時間 為:定時時間 =(216?X)?12/晶振頻率 則 5000=(216 ?X)?12/ 得: X=60928,轉換成 十六 進制后為: 0xee00,其中0xee裝入 TH0, 0x00裝入 TL0。當 STB=1時, A和 B輸入端關閉,但允許 8位并行數據輸出。 單片機外接行列式鍵盤, 用于控制單片機向 FPGA(現場可編程門陣列)發(fā)出指令啟動 AD對信號采樣分析,并控制單片機向 LCD傳輸數據以顯示波形和參數。得到鍵位值后, 進入鍵位服務程序 。 /*延時去抖 */ 101 DelayMs(5)。 /*仍然被按下 */ /*判斷是否真的釋放 */ DelayMs(5)。 case KV_wave: /*“波形顯示”鍵 */ { 104 /*調用 wave_print(void)子函數 */ } break。 } 106 DAC0832應用程序的編寫 AT89S51與 DAC0832單緩沖方式接口電路如 圖 113所示。 111 最后, *((uchar xdata*)DAC0832Addr)=c0832data意義顯然為:將 c0832data的值寫入 DAC0832的數據端口。 【 例 149】 單片機 與 ADC0809的中斷方式通信的接口 電路如 圖 144所示。ADC0809開始轉換后 EOC( End Of Converge)腳為低電平,當 A/D轉換結束時 EOC腳變?yōu)楦唠娖剑浫》呛笞鳛橹袛嗾埱笮盘栍|發(fā)單片機中斷,在中斷服務程序中讀取A/D轉換的結果。 代碼段一: define DAC0832Addr 0xfffe define uchar unsigned char *((uchar xdata*)DAC0832Addr)=c0832data; 代碼段二: unsigned char *p; p=0xfffe; *p= c0832data; 112 顯然 前者比后者 有兩個優(yōu)點 : 首先,代碼段一的意義明確,可讀性和可移植性更強。參考程序如下: include define DAC0832Addr 0xfffe /* 0832端口地址 */ define uchar unsigned char/*定義 uchar代表單字節(jié)無符號數 */ define uint unsigned int /*定義 uint無符號字 sbit P26=0xA6; /* */ 107 sbit P27=0xA7; /* */ void TransformData(uchar c0832data); /*轉換數據 */ void Delay( ) ; /*執(zhí)行延時函數 */ main( ) /*主函數 */ { uchar cDigital=0; /*待轉換的單字節(jié)無符號數字量初值為 0*/ Delay( ); /*調用延時程序 */ while(1) /*主體函數輪詢 */ { TransformData(cDigital); /*調用數模轉換函數 */ cDigital++; /*輸出鋸齒波轉換的數字量不斷加 1*/ 108 Delay( ); /*調用延時函數,無參數傳遞 */ } } void TransformData(uchar c0832data) { *((uchar xdata*)DAC0832Addr)=c0832data; /*向 DAC0832輸出待轉換數字量 c0832data*/ } void Delay() /*延時程序 */ { uint i; for(i=0; i200; i++); } 109 本例說明如下: ( 1)大部分簡單、低速的外圍設備( 例如 2MHz采樣率 AD、 DA、 RS23 RS422/485串口等,而非 DDR2 SDRAM、千兆以太網口等)都是 基于存儲器映射的字符設備 ,對于它們的操作與對于外部存儲器的讀、寫訪問是一樣。 case KV_U_harmon: /*“電壓諧波顯示”鍵 */ { /*調用 hammon_print子函數 。 /*key not released*/ 102 break。 keyValue = ~(KEY_PORT | 0xF0)。 100 /*宏定義幾種數據類型 */ typedef unsigned char uchar。獨立式4 4鍵盤的接口電路如 下頁 圖 (見第 10章的圖 1010) 。參考程序如下。 81 ( 4)啟動和停止定時器 T0 將定時器控制寄存器 TCON中的 TR0=1,則啟動定時器 T0; TR0=0,則停止定時器 T0定時。 參考程序 : 0INT75 圖 141 控制 8只 LED交替閃爍的電路 76 include void Delay(unsigned int i) /* 定義延時函數 Delay( ), i是形式參數,不能賦初值 */ { unsigned int j; for(; i 0; i ) for(j=0; j333; j++) /*晶振為 12MHz, j的范圍見例 141*/ {; } /*空函數 */ } 77 void main( ) /*主函數 */ { EA=1; /*總中斷允許 */ EX0=1; /*外部中斷 0中斷允許 */ IT0=1; /*選擇外部中斷 0為跳沿觸發(fā)方式 */ While(1) /*循環(huán) */ { P1=0; } /* P1口的 8只 LED全亮 */ } 78 void int0
點擊復制文檔內容
畢業(yè)設計相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1