單片機c語言輕松入門:隨著單片機開發技術的不斷發展,目前已有越來越多的人從普遍使用匯編語言到逐漸使用高級語言開發,其中主要是以C 語言為主,市場上幾種常見的單片機均有其C 語言開發環境。這里以最為流行的80C51 單片機為例來學習單片機的C 語言編程技術。本書共分六章,每章一個專題,以一些待完成的任務為中心,圍繞該任務介紹 C 語言的一些知識,每一個任務都是可以獨立完成的,每完成一個任務,都能掌握一定的知識,等到所有的任務都完成后,即可以完成C 語言的入門工作。
標簽: 單片機c語言
上傳時間: 2013-11-18
上傳用戶:zhqzal1014
單片機C語言應用程序設計針對目前最通用的單片機8051和最流行的程序設計語言——C語言,以KEII。公司8051單片機開發套件講解單片機的C語言應用程序設計。該套件的編譯器有支持經典8051及8051派生產品的版本,統稱為Cx51。Windows集成開發環境μVision2把μVisionl用的模擬調試器dScope與集成環境無縫結合起來,使用更方便,支持的單片機品種更多。 本書的特點是取材于原文資料,總結實際教學和應用經驗,實例較多,實用性強。本書中C語言是針對8051特有結構描述的,這樣,即使無編程基礎的人,也可通過本書學習單片機的c編程。單片機C語言應用程序設計目錄第1章 單片機基礎知識 1.1 8051單片機的特點 1.2 8051的內部知識 1.3 8051的系統擴展 習題一第2章 C與8051 2.1 8051的編程語言 2.2 Cx51編譯器 2.3 KEIL 8051開發工具 2.4 KEIL Cx51編程實例 2.5 Cx51程序結構 習題二第3章 Cx51 數據與運算 3.1 數據與數據類型 3.2 常量與變量 3.3 Cx51數據存儲類型與8051存儲器結構 3.4 8051特殊功能寄存器(SFR)及其Cx51定義 3.5 8051并行接口及其Cx51定義 3.6 位變量(BIT)及其Cx51定義 3.7 Cx51運算符、表達式及其規則 習題三第4章 Cx51 流程控制語句 4.1 C語言程序的基本結構及其流程圖 4.2 選擇語句 4.3 循環語句 習題四第5章 Cx51 構造數據類型 5.1 數組 5.2 指針 5.3 結構 5.4 共用體 5.5 枚舉 習題五第6章 Cx51 函數第7章 模塊化程序設計第8章 8051內部資源的C編輯第9章 8051擴展資源的C編輯第10章 8051輸出控制的C編程第11章 8051數據采集的C編程第12章 8051機間通信的C編程第13章 8051人機交互的C編程附錄A μVision2集成開發環境使用附錄B KEIL Cx51 上機制南
上傳時間: 2013-10-21
上傳用戶:行者Xin
含原理圖+電路圖+程序的波形發生器:在工作中,我們常常會用到波形發生器,它是使用頻度很高的電子儀器。現在的波形發生器都采用單片機來構成。單片機波形發生器是以單片機核心,配相應的外圍電路和功能軟件,能實現各種波形發生的應用系統,它由硬件部分和軟件部分組成,硬件是系統的基礎,軟件則是在硬件的基礎上,對其合理的調配和使用,從而完成波形發生的任務。 波形發生器的技術指標:(1) 波形類型:方型、正弦波、三角波、鋸齒波;(2) 幅值電壓:1V、2V、3V、4V、5V;(3) 頻率值:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;(4) 輸出極性:雙極性操作設計1、 機器通電后,系統進行初始化,LED在面板上顯示6個0,表示系統處于初始狀態,等待用戶輸入設置命令,此時,無任何波形信號輸出。2、 用戶按下“F”、“V”、“W”,可以分別進入頻率,幅值波形設置,使系統進入設置狀態,相應的數碼管顯示“一”,此時,按其它鍵,無效;3、 在進入某一設置狀態后,輸入0~9等數字鍵,(數字鍵僅在設置狀態時,有效)為欲輸出的波形設置相應參數,LED將參數顯示在面板上;4、 如果在設置中,要改變已設定的參數,可按下“CL”鍵,清除所有已設定參數,系統恢復初始狀態,LED顯示6個0,等待重新輸入命令;5、 當必要的參數設定完畢后,所有參數顯示于LED上,用戶按下“EN”鍵,系統會將各波形參數傳遞到波形產生模塊中,以便控制波形發生,實現不同頻率,不同電壓幅值,不同類型波形的輸出;6、 用戶按下“EN”鍵后,波形發生器開始輸出滿足參數的波形信號,面板上相應類型的運行指示燈閃爍,表示波形正在輸出,LED顯示波形類型編號,頻率值、電壓幅值等波形參數;7、 波形發生器在輸出信號時,按下任意一個鍵,就停止波形信號輸出,等待重新設置參數,設置過程如上所述,如果不改變參數,可按下“EN”鍵,繼續輸出原波形信號;8、 要停止波形發生器的使用,可按下復位按鈕,將系統復位,然后關閉電源。硬件組成部分通過綜合比較,決定選用獲得廣泛應用,性能價格高的常用芯片來構成硬件電路。單片機采用MCS-51系列的89C51(一塊),74LS244和74LS373(各一塊),反相驅動器 ULN2803A(一塊),運算放大器 LM324(一塊) 波形發生器的硬件電路由單片機、鍵盤顯示器接口電路、波形轉換(D/ A)電路和電源線路等四部分構成。1.單片機電路功能:形成掃描碼,鍵值識別,鍵功能處理,完成參數設置;形成顯示段碼,向LED顯示接口電路輸出;產生定時中斷;形成波形的數字編碼,并輸出到D/A接口電路;如電路原理圖所示: 89C51的P0口和P2口作為擴展I/O口,與8255、0832、74LS373相連接,可尋址片外的寄存器。單片機尋址外設,采用存儲器映像方式,外部接口芯片與內部存儲器統一編址,89C51提供16根地址線P0(分時復用)和P2,P2口提供高8位地址線,P0口提供低8位地址線。P0口同時還要負責與8255,0832的數據傳遞。P2.7是8255的片選信號,P2.6是0832(1)的片選,P2.5是0832(2)的片選,低電平有效,P0.0、P0.1經過74LS373鎖存后,送到8255的A1、A2作,片內A口,B口,C口,控制口等寄存器的字選。89C51的P1口的低4位連接4只發光三極管,作為波形類型指示燈,表示正在輸出的波形是什么類型。單片機89C51內部有兩個定時器/計數器,在波形發生器中使用T0作為中斷源。不同的頻率值對應不同的定時初值,定時器的溢出信號作為中斷請求。控制定時器中斷的特殊功能寄存器設置如下:定時控制寄存器TCON=(00010000)工作方式選擇寄存器(TMOD)=(00000000)中斷允許控制寄存器(IE)=(10000010)2、鍵盤顯示器接口電路功能:驅動6位數碼管動態顯示; 提供響應界面; 掃面鍵盤; 提供輸入按鍵。由并口芯片8255,鎖存器74LS273,74LS244,反向驅動器ULN2803A,6位共陰極數碼管(LED)和4×4行列式鍵盤組成。8255的C口作為鍵盤的I/O接口,C口的低4位輸出到掃描碼,高4位作為輸入行狀態,按鍵的分布如圖所示。8255的A口作為LED段碼輸出口,與74LS244相連接,B口作為LED的位選信號輸出口,與ULN2803A相連接。8255內部的4個寄存器地址分配如下:控制口:7FFFH , A口:7FFFCH , B口:7FFDH , C口:7FFEH 3、D/A電路功能:將波形樣值的數字編碼轉換成模擬值;完成單極性向雙極性的波形輸出;構成由兩片0832和一塊LM324運放組成。0832(1)是參考電壓提供者,單片機向0832(1)內的鎖存器送數字編碼,不同的編碼會產生不同的輸出值,在本發生器中,可輸出1V、2V、3V、4V、5V等五個模擬值,這些值作為0832(2)的參考電壓,使0832(2)輸出波形信號時,其幅度是可調的。0832(2)用于產生各種波形信號,單片機在波形產生程序的控制下,生成波形樣值編碼,并送到0832(2)中的鎖存器,經過D/A轉換,得到波形的模擬樣值點,假如N個點就構成波形的一個周期,那么0832(2)輸出N個樣值點后,樣值點形成運動軌跡,就是波形信號的一個周期。重復輸出N個點后,由此成第二個周期,第三個周期……。這樣0832(2)就能連續的輸出周期變化的波形信號。運放A1是直流放大器,運放A2是單極性電壓放大器,運放A3是雙極性驅動放大器,使波形信號能帶得起負載。地址分配:0832(1):DFFFH ,0832(2):BFFFH4、電源電路:功能:為波形發生器提供直流能量;構成由變壓器、整流硅堆,穩壓塊7805組成。220V的交流電,經過開關,保險管(1.5A/250V),到變壓器降壓,由220V降為10V,通過硅堆將交流電變成直流電,對于諧波,用4700μF的電解電容給予濾除。為保證直流電壓穩定,使用7805進行穩壓。最后,+5V電源配送到各用電負載。
上傳時間: 2013-11-08
上傳用戶:685
The XA-S3 is a member of Philips Semiconductors’ XA (eXtended Architecture) family of high performance 16-bit single-chip Microcontrollers. The XA-S3 combines many powerful peripherals on one chip. Therefore, it is suited for general multipurpose high performance embedded control functions.One of the on-chip peripherals is the I2C bus interface. This report describes worked-out driver software (written in C) to program / use the I2C interface of the XA-S3. The driver software, together with a demo program and interface software routines offer the user a quick start in writing a complete I2C - XAS3 system application.
上傳時間: 2013-11-10
上傳用戶:liaofamous
《現代微機原理與接口技術》實驗指導書 TPC-H實驗臺C語言版 1.實驗臺結構1)I / O 地址譯碼電路如上圖1所示地址空間280H~2BFH共分8條譯碼輸出線:Y0~Y7 其地址分別是280H~287H、288H~28FH、290H~297H、298H~29FH、2A0H~2A7H、2A8H~2AFH、2B0H~2B7H、2B8H~2BFH,8根譯碼輸出線在實驗臺I/O地址處分別由自鎖緊插孔引出供實驗選用(見圖2)。 2) 總線插孔采用“自鎖緊”插座在標有“總線”區引出數據總線D7~D0;地址總線A9~A0,讀、寫信號IOR、IOW;中斷請求信號IRQ ;DMA請求信號DRQ1;DMA響應信號DACK1 及AEN信號,供學生搭試各種接口實驗電路使用。3) 時鐘電路如圖-3所示可以輸出1MHZ 2MHZ兩種信號供A/D轉換器定時器/計數器串行接口實驗使用。圖34) 邏輯電平開關電路如圖-4所示實驗臺右下方設有8個開關K7~K0,開關撥到“1”位置時開關斷開,輸出高電平。向下打到“0”位置時開關接通,輸出低電平。電路中串接了保護電阻使接口電路不直接同+5V 、GND相連,可有效地防止因誤操作誤編程損壞集成電路現象。圖 4 圖 55) L E D 顯示電路如圖-5所示實驗臺上設有8個發光二極管及相關驅動電路(輸入端L7~L0),當輸入信號為“1” 時發光,為“0”時滅6) 七段數碼管顯示電路如圖-6所示實驗臺上設有兩個共陰極七段數碼管及驅動電路,段碼為同相驅動器,位碼為反相驅動器。從段碼與位碼的驅動器輸入端(段碼輸入端a、b、c、d、e、f、g、dp,位碼輸入端s1、 s2)輸入不同的代碼即可顯示不同數字或符號。
上傳時間: 2013-11-22
上傳用戶:sssnaxie
串行編程器源程序(Keil C語言)//FID=01:AT89C2051系列編程器//實現編程的讀,寫,擦等細節//AT89C2051的特殊處:給XTAL一個脈沖,地址計數加1;P1的引腳排列與AT89C51相反,需要用函數轉換#include <e51pro.h> #define C2051_P3_7 P1_0#define C2051_P1 P0//注意引腳排列相反#define C2051_P3_0 P1_1#define C2051_P3_1 P1_2#define C2051_XTAL P1_4#define C2051_P3_2 P1_5#define C2051_P3_3 P1_6#define C2051_P3_4 P1_7#define C2051_P3_5 P3_5 void InitPro01()//編程前的準備工作{ SetVpp0V(); P0=0xff; P1=0xff; C2051_P3_5=1; C2051_XTAL=0; Delay_ms(20); nAddress=0x0000; SetVpp5V();} void ProOver01()//編程結束后的工作,設置合適的引腳電平{ SetVpp5V(); P0=0xff; P1=0xff; C2051_P3_5=1; C2051_XTAL=1;} BYTE GetData()//從P0口獲得數據{ B_0=P0_7; B_1=P0_6; B_2=P0_5; B_3=P0_4; B_4=P0_3; B_5=P0_2; B_6=P0_1; B_7=P0_0; return B;} void SetData(BYTE DataByte)//轉換并設置P0口的數據{ B=DataByte; P0_0=B_7; P0_1=B_6; P0_2=B_5; P0_3=B_4; P0_4=B_3; P0_5=B_2; P0_6=B_1; P0_7=B_0;} void ReadSign01()//讀特征字{ InitPro01(); Delay_ms(1);//----------------------------------------------------------------------------- //根據器件的DataSheet,設置相應的編程控制信號 C2051_P3_3=0; C2051_P3_4=0; C2051_P3_5=0; C2051_P3_7=0; Delay_ms(20); ComBuf[2]=GetData(); C2051_XTAL=1; C2051_XTAL=0; Delay_us(20); ComBuf[3]=GetData(); ComBuf[4]=0xff;//----------------------------------------------------------------------------- ProOver01();} void Erase01()//擦除器件{ InitPro01();//----------------------------------------------------------------------------- //根據器件的DataSheet,設置相應的編程控制信號 C2051_P3_3=1; C2051_P3_4=0; C2051_P3_5=0; C2051_P3_7=0; Delay_ms(1); SetVpp12V(); Delay_ms(1); C2051_P3_2=0; Delay_ms(10); C2051_P3_2=1; Delay_ms(1);//----------------------------------------------------------------------------- ProOver01();} BOOL Write01(BYTE Data)//寫器件{//----------------------------------------------------------------------------- //根據器件的DataSheet,設置相應的編程控制信號 //寫一個單元 C2051_P3_3=0; C2051_P3_4=1; C2051_P3_5=1; C2051_P3_7=1; SetData(Data); SetVpp12V(); Delay_us(20); C2051_P3_2=0; Delay_us(20); C2051_P3_2=1; Delay_us(20); SetVpp5V(); Delay_us(20); C2051_P3_4=0; Delay_ms(2); nTimeOut=0; P0=0xff; nTimeOut=0; while(!GetData()==Data)//效驗:循環讀,直到讀出與寫入的數相同 { nTimeOut++; if(nTimeOut>1000)//超時了 { return 0; } } C2051_XTAL=1; C2051_XTAL=0;//一個脈沖指向下一個單元//----------------------------------------------------------------------------- return 1;} BYTE Read01()//讀器件{ BYTE Data;//----------------------------------------------------------------------------- //根據器件的DataSheet,設置相應的編程控制信號 //讀一個單元 C2051_P3_3=0; C2051_P3_4=0; C2051_P3_5=1; C2051_P3_7=1; Data=GetData(); C2051_XTAL=1; C2051_XTAL=0;//一個脈沖指向下一個單元//----------------------------------------------------------------------------- return Data;} void Lock01()//寫鎖定位{ InitPro01();//先設置成編程狀態//----------------------------------------------------------------------------- //根據器件的DataSheet,設置相應的編程控制信號 if(ComBuf[2]>=1)//ComBuf[2]為鎖定位 { C2051_P3_3=1; C2051_P3_4=1; C2051_P3_5=1; C2051_P3_7=1; Delay_us(20); SetVpp12V(); Delay_us(20); C2051_P3_2=0; Delay_us(20); C2051_P3_2=1; Delay_us(20); SetVpp5V(); } if(ComBuf[2]>=2) { C2051_P3_3=1; C2051_P3_4=1; C2051_P3_5=0; C2051_P3_7=0; Delay_us(20); SetVpp12V(); Delay_us(20); C2051_P3_2=0; Delay_us(20); C2051_P3_2=1; Delay_us(20); SetVpp5V(); }//----------------------------------------------------------------------------- ProOver01();} void PreparePro01()//設置pw中的函數指針,讓主程序可以調用上面的函數{ pw.fpInitPro=InitPro01; pw.fpReadSign=ReadSign01; pw.fpErase=Erase01; pw.fpWrite=Write01; pw.fpRead=Read01; pw.fpLock=Lock01; pw.fpProOver=ProOver01;}
上傳時間: 2013-11-12
上傳用戶:gut1234567
用C 語言來開發單片機系統軟件最大的好處是編寫代碼效率高、軟件調試直觀、維護升級方便、代碼的重復利用率高、便于跨平臺的代碼移植等等,因此C 語言編程在單片機系統設計中已得到越來越廣泛的運用。針對PIC 單片機的軟件開發,同樣可以用C 語言實現。但在單片機上用C 語言寫程序和在PC 機上寫程序絕對不能簡單等同。現在的PC 機資源十分豐富,運算能力強大,因此程序員在寫PC 機的應用程序時幾乎不用關心編譯后的可執行代碼在運行過程中需要占用多少系統資源,也基本不用擔心運行效率有多高。寫單片機的C 程序最關鍵的一點是單片機內的資源非常有限,控制的實時性要求又很高,因此,如果沒有對單片機體系結構和硬件資源作詳盡的了解,以筆者的愚見認為是無法寫出高質量實用的C 語言程序。這就是為什么前面所有章節中的的示范代碼全部用基礎的匯編指令實現的原因,希望籍此能使讀者對PIC 單片機的指令體系和硬件資源有深入了解,在這基礎之上再來討論C 語言編程,就有水到渠成的感覺。本書圍繞中檔系列PIC 單片機來展開討論,Microchip 公司自己沒有針對中低檔系列PIC單片機的C 語言編譯器,但很多專業的第三方公司有眾多支持PIC 單片機的C 語言編譯器提供,常見的有Hitech、CCS、IAR、Bytecraft 等公司。其中筆者最常用的是Hitech 公司的PICC編譯器,它穩定可靠,編譯生成的代碼效率高,在用PIC 單片機進行系統設計和開發的工程師群體中得到廣泛認可。其正式完全版軟件需要購置,但在其網站上有限時的試用版供用戶評估。另外,Hitech 公司針對廣大PIC 的業余愛好者和初學者還提供了完全免費的學習版PICC-Lite 編譯器套件,它的使用方式和完全版相同,只是支持的PIC 單片機型號限制在PIC16F84、PIC16F877 和PIC16F628 等幾款。這幾款Flash 型的單片機因其所具備的豐富的片上資源而最適用于單片機學習入門,因此筆者建議感興趣的讀者可從PICC-Lite 入手掌握PIC 單片機的C 語言編程。
上傳時間: 2013-11-17
上傳用戶:aa54
HI-TECH PICC C 的使用說明. 這里我們只講述了PICC C 與標準C 的不同,它不是一本C 語言的教程, 并且我們假定你有C 語言的基礎. 為了對PIC 單片機有更好的支持,PICC 在標準C 的基礎上作了一些擴充: 定義I/O 函數,以便在你的硬件系統中使用<stdio.h>中定義的函數。 用C 語言編寫中斷服務程序 用C 語言編寫I/O 操作程序 C 語言與匯編語言間的接口1-1 與標準C 的不同PICC 只在一處與標準C 不同:函數的重入。因為PIC 單片機的寄存器及堆棧有限,所以PICC 不支持可重入函數。1-2 支持的PIC 芯片PICC 支持很多PIC 單片機,支持PIC 單片機的類型在LIB 目錄下的picinfo.ini文件中有定義。1-3 PICC 包含一些標準庫1-4 PICC 編譯器可以輸出一些格式的目標文件,缺省設置為輸出Bytecraft 的'COD'格式和 Intel 的'HEX'格式。你可以用表1-1 中的命令來指定輸出格式。
上傳時間: 2013-10-10
上傳用戶:781354052
U盤IC1114的電路圖和C語言源程序
上傳時間: 2013-12-17
上傳用戶:hanli8870
微型打印機的C語言源程序:微型打印機的C51源程序#define uchar unsigned char#define uint unsigned int#include <reg52.h>#include <stdio.h>#include <absacc.h>#include <math.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#define PIN XBYTE[0x8000]#define POUT XBYTE[0x9000]sbit PRINTSTB =P1^6;sbit DOG=P1^7;bdata char pin&#118alue;sbit PRINTBUSY=pin&#118alue^7;sbit PRINTSEL =pin&#118alue^6;sbit PRINTERR =pin&#118alue^5;sbit PRINTACK =pin&#118alue^4; void PrintString(uchar *String1,uchar *String2);void initprint(void);void print(uchar a); void initprint(void) //打印機初始化子程序 { pin&#118alue=PIN; if((PRINTSEL==1)&&(PRINTERR==1)) { print(0x1b); print(0x40); print(0x1b); print(0x38); print(0x4); }}void print(uchar a) //打印字符a{ pin&#118alue=PIN; if((PRINTSEL==0)||(PRINTERR==0)) return; for(;;) { DOG=~DOG; pin&#118alue=PIN; if(PRINTBUSY==0) break; } DOG=~DOG; POUT=a; PRINTSTB=1; PRINTSTB=1; PRINTSTB=1; PRINTSTB=1; PRINTSTB=0; PRINTSTB=0; PRINTSTB=0; PRINTSTB=0; PRINTSTB=1;}void PrintString(uchar *String) //打印字符串后回車{ uchar CH; for (;;) { DOG=~DOG; CH=*String; if (CH==0) { print(0x0d); break; } print(CH); String++; } initprint();}
上傳時間: 2013-10-18
上傳用戶:hasan2015