24c16讀寫驅動程序,//=-------------------------------------------------------------------------------/*模塊調用:讀數據:read(unsigned int address)寫數據:write(unsigned int address,unsigned char dd) dd為要寫的 數據字節*///------------------------------------------------------------------------------ sbit sda=P3^0;sbit scl=P3^1; sbit a0=ACC^0; //定義ACC的位,利用ACC操作速度最快sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7; //------------------------------------------------------------------------------#pragma disablevoid s24(void) //起始函數{_nop_(); scl=0; sda=1; scl=1; _nop_(); sda=0; _nop_(); _nop_(); scl=0; _nop_(); _nop_(); sda=1;} //------------------------------------------------------------------------------#pragma disablevoid p24(void) //停止函數{sda=0; scl=1; _nop_(); _nop_(); sda=1;} //-----------------------------------------------------------------------------#pragma disableunsigned char rd24(void) /////////////////從24c16讀一字節數據{ ACC=0x00;sda=1;scl=1;a7=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a6=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a5=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a4=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a3=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a2=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a1=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a0=sda;_nop_();_nop_();_nop_();_nop_();scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0; /// ///////////////24c16的一位回答位。return(ACC);}//------------------------------------------------------------------------------#pragma disablevoid wd24(unsigned char dd) ////////////////向24c16寫一字節數據{ sda=1;ACC=dd;sda=a7;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a6;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a5;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a4;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a3;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a2;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a0;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=0;scl=1;//scl=0;(在下面程序中)}//---------------------------------------------------------------------------#pragma disableunsigned char read(unsigned int address){unsigned char dd; s24(); ////////////////////////開始條件 wd24(0xa0); /////////////////////////寫器件地址(寫命令) _nop_();_nop_();_nop_();_nop_(); scl=0; ///////////////////////////////////接收器件地址確認信號 wd24(address); //////////////////////////// 寫數據地址 _nop_();_nop_();_nop_();_nop_(); scl=0;s24(); ///////////////////////////////////開始條件 wd24(0xa1); /////////////////////////////寫器件地址(讀命令) scl=0; dd=rd24(); //////////////////////////////////讀 一字節 p24(); ////////////////////////////////////停止條件 return(dd);}//------------------------------------------------------------------------------#pragma disablevoid write(unsigned int address,unsigned char dd){s24(); /////////////////開始條件 wd24(0xa0); ////////////////////////寫器件地址; scl=0; wd24(address); /////////////////////寫數據地址 scl=0; wd24(dd); //////////////////////////寫dd數據 scl=0; p24(); /////////////////////////停止條件; }
上傳時間: 2013-11-18
上傳用戶:墻角有棵樹
單片機匯編語言程序庫內容有運算子程序,通訊子程序,擴展接口程序,中斷服務子程序,代碼轉換,邏輯操作,數據結構,其他。
上傳時間: 2013-10-09
上傳用戶:libinxny
;片內RAM初始化子程序 IBCLR :MOV A,R0 MOV R1,A CLR AIBC1 :MOV @R1,A INC R1 DJNZ R7,IBC1 RET ;片外RAM初始化子程序 EBCLR1 :MOV A,ADDPL MOV DPL,A MOV A,ADDPH MOV DPH,A CLR CEBC11 :MOVX @DPTR,A INC DPTR DJNZ R7,EBC11 RET ;片外RAM初始化子程序(雙字節個單元) EBCLR2 :MOV A,ADDPL MOV DPL,A MOV A,ADDPH MOV DPH,A MOV A,R7 JZ EBC21 INC R6EBC21 :CLR A MOVX @DPTR,A INC DPTR DJNZ R7,EBC21 DJNZ R6,EBC21 RET ;內部RAM數據復制程序;入口 :R0,R7;占用資源:A;堆棧需求:2字節;出口 :R1 IBMOV :MOV A,R0 ADD A,R7 MOV R0,A MOV A,R1 ADD A,R7 MOV R1,AIBM1 :DEC R0 DEC R1 MOV A,@R0 MOV @R1,A DJNZ R7,IBM1 RET ;外部RAM數據復制程序;入口 :ADDPH,ADDPL,R7;占用資源:ACC;堆棧需求:2字節;出口 :R0,R1 EBMOV1 :MOV A,ADDPL ADD A,R7 MOV DPL,A CLR A ADDC A,ADDPH MOV DPH,A MOV A,R7 ADD A,R1 XCH A,R0 ADDC A,#00H MOV P2,AEBM11 :DEC R0 CJNE R0,#0FFH,EBM12 DEC P2EBM12 :DEC DPL MOV A,DPL CJNE A,#0FFH,EBM13 DEC DPHEBM13 :MOVX A,@R0 MOVX @DPTR,A DJNZ R7,EBM11 RET ;外部RAM數據復制程序
上傳時間: 2013-10-30
上傳用戶:bs2005
子程序庫的使用方法如下:1.將子程序庫全部內容鏈接在應用程序之后,統一編譯即可。優點是簡單方便,缺點是程序太長,大量無關子程序也包含在其中。 2.僅將子程序庫中的有關部分內容鏈接在應用程序之后,統一編譯即可。有些子程序需要調用一些低級子程序,這些低級子程序也應該包含在內。優點是程序緊湊,缺點是需要對子程序庫進行仔細刪節。MCS-51 浮點運算子程序庫及其使用說明本浮點子程序庫有三個不同層次的版本,以便適應不同的應用場合: 1.小型庫(FQ51A.ASM):只包含浮點加、減、乘、除子程序。 2.中型庫(FQ51B.ASM):在小型庫的基礎上再增加絕對值、倒數、比較、平方、開平方、 數制轉換等子程序。 3.大型庫(FQ51.ASM):包含本說明書中的全部子程序。 為便于讀者使用本程序庫,先將有關約定說明如下: 1.雙字節定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續單元中的數 據,地址小的單元存放高字節。如果[R0]=1234H,若(R0)=30H,則(30H)=12H,(31H)=34H。 2.二進制浮點操作數:用三個字節表示,第一個字節的最高位為數符,其余七位為 階碼(補碼形式),第二字節為尾數的高字節,第三字節為尾數的低字節,尾數用雙字節 純小數(原碼)來表示。
上傳時間: 2013-10-15
上傳用戶:wmwai1314
§4-1 程序設計語言計算機程序設計語言是指計算機能夠理解和執行的語言。 程序設計語言的種類很多,歸納起來有三種: 機器語言、匯編語言和高級語言。 編程時采用哪種語言由程序設計語言的特點和適用場合決定。 機器語言、匯編語言和高級語言比較一覽表§4-2 匯編語言源程序格式匯編語言源程序格式如下:1、匯編語言源程序由一條一條匯編語句組成。2、每條匯編語句獨占一行,以CR—LF結束。3、典型的匯編語句由四部分組成: 標號:操作碼 操作數;注釋§4-3 偽指令一、偽指令與指令的區別: 偽指令由匯編程序識別,用來對匯編過程進行某種控制,或者對符號、標號賦值。在匯編過程中, 偽指令不產生可執行的目標代碼;而指令由CPU執行,在匯編過程中,產生可執行的目標代碼,完成對數據的運算與處理。二、常用的偽指令:ORG END EQU DATA DB DW DS §4-4 匯編語言程序設計基礎一、匯編語言程序設計的一般步驟 分析課題 確定算法 畫流程圖 編寫程序 上機調試二、程序結構 按程序的走向可以將程序分成4種結構: 簡單程序 分支程序 循環程序 子程序
上傳時間: 2013-10-15
上傳用戶:daoxiang126
微機原理與匯編語言程序設計課件為PPT文件,內容有:第1章 基礎知識 4第2章 微型計算機系統結構 6第3章 程序加載并執行 4第4章 微處理器一般指令 6第5章 匯編語言程序設計基礎 4第6章 算術運算與邏輯運算 8第7章 基本輸入與輸出 4第8章 程序流程控制 10第9章 字符串處理 6第10章 宏 4第11章 過程 4第12章 文件處理 4第13章 模塊化程序設計 4
上傳時間: 2013-10-28
上傳用戶:yanming8525826
紅外遙控接收;=================================================;; zsMCU51實驗板配套學習例程;; 中山單片機學習網 智佳科技;; 作者:逸風 QQ:105558851;; http://www.zsmcu.com; E-mail:info@zsmcu.com;=================================================ORG 0000HLJMP START;轉入主程序ORG 0010HSTART:MAIN:JNB P2.2,IRLJMP MAIN;以下為進入P3.2腳外部中斷子程序,也就是解碼程序IR:MOV R6,#9SB:ACALL DELAY882 ;調用882微秒延時子程序JB P2.2,EXIT ;延時882微秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序DJNZ R6, SB ;重復10次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序;以上完成對遙控信號的9000微秒的初始低電平信號的識別。JNB P2.2, $ ;等待高電平避開9毫秒低電平引導脈沖ACALL DELAY2400JNB P2.2,IR_Rp ;ACALL DELAY2400 ;延時4.74毫秒避開4.5毫秒的結果碼MOV R1,#1AH ;設定1AH為起始RAM區MOV R2,#4PP:MOV R3,#8JJJJ:JNB P2.2,$ ;等待地址碼第一位的高電平信號LCALL DELAY882 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態MOV C,P2.2 ;將P3.2引腳此時的電平狀態0或1存入C中 JNC UUU ;如果為0就跳轉到UUULCALL DELAY1000UUU:MOV A,@R1 ;將R1中地址的給ARRC A ;將C中的值0或1移入A中的最低位MOV @R1,A ;將A中的數暫時存放在R1中DJNZ R3,JJJJ ;接收地址碼的高8位INC R1 ;對R1中的值加1,換下一個RAMDJNZ R2,PP ;接收完16位地址碼和8位數據碼和8位數據,存放在1AH/1BH/1CH/1DH的RAM中MOV P1,1DH ;將按鍵的鍵值通過P1口的8個LED顯示出來!CLR P2.3 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功LCALL DELAY2400LCALL DELAY2400LCALL DELAY2400SETB P2.3;蜂鳴器停止LJMP MAINIR_Rp:LJMP MAINEXIT:LJMP MAIN ;退出解碼子程序;=============================882DELAY882: ;1.085x ((202x4)+5)=882MOV R7,#202DELAY882_A:NOPNOPDJNZ R7,DELAY882_ARET;=============================1000DELAY1000: ;1.085x ((229x4)+5)=999.285MOV R7,#229DELAY1000_A:NOPNOPDJNZ R7,DELAY1000_ARET;=============================2400
上傳時間: 2013-11-01
上傳用戶:2525775
單片機常用程序庫包中提供了一些有實際應用價值的子程序供參考選用 SUB1----X25045/43 看門狗/存儲器與 89C2051接口子程序 源程序/原理圖(21K)X25045.EXE SUB2----AT24C02/04/08/16 串行存儲器與 89C2051接口子程序 源程序/原理圖(22K) AT24C02.EXE SUB3----紅外遙控器(熊貓M50462/C54L2)與 89C2051接口子程序 源程序/原理圖(21K) M50462.EXE SUB4----DS1302/HT1302 實時時鐘與 89C2051接口子程序 源程序/原理圖(20K) DS1302.EXE SUB6----AT89C2051與上位機RS232通訊接口子程序 源程序/原理圖(25K) RS232.EXE SUB7----VB5.0 與AT89C2051通訊接口子程序 源程序/原理圖(22K) VB5.EXE SUB8----單片機間RS485多機通訊子程序 源程序/原理圖(24K) RS485.EXE
上傳時間: 2013-10-17
上傳用戶:gundan
16 16點陣顯示漢字原理及顯示程序 #include "config.h" #define DOTLED_LINE_PORT PORTB #define DOTLED_LINE_DDR DDRB #define DOTLED_LINE_PIN PINB #define DOTLED_LINE_SCKT PB1 #define DOTLED_LINE_SCKH PB5 #define DOTLED_LINE_SDA PB3 #define DOTLED_ROW_PORT PORTC #define DOTLED_ROW_DDR DDRC #define DOTLED_ROW_PIN PINC #define DOTLED_ROW_A0 PC0 #define DOTLED_ROW_A1 PC1 #define DOTLED_ROW_A2 PC2 #define DOTLED_ROW_A3 PC3 #define DOTLED_ROW_E PC4 uint8 font[] = { /*-- 調入了一幅圖像:這是您新建的圖像 --*/ /*-- 寬度x高度=16x16 --*/ 0x00,0x00,0x00,0x00,0x08,0x38,0x18,0x44,0x08,0x44,0x08,0x04,0x08,0x08,0x08,0x10, 0x08,0x20,0x08,0x40,0x08,0x40,0x08,0x40,0x3E,0x7C,0x00,0x00,0x00,0x00,0x00,0x00 }; static void TransmitByte(uint8 byte); static void SelectRow(uint8 row); static void FlipLatchLine(void); static void TransmitByte(uint8 byte) { uint8 i; for(i = 0 ; i < 8 ; i ++) { if(byte & (1 << i)) { DOTLED_LINE_PORT |= _BV(DOTLED_LINE_SDA); } else { DOTLED_LINE_PORT &= ~_BV(DOTLED_LINE_SDA); } //__delay_cycles(100); DOTLED_LINE_PORT |= _BV(DOTLED_LINE_SCKH); //__delay_cycles(100); DOTLED_LINE_PORT &= ~_BV(DOTLED_LINE_SCKH); //__delay_cycles(100); } } static void SelectRow(uint8 row) { //row -= 1; row |= DOTLED_ROW_PIN & 0xe0; DOTLED_ROW_PORT = row; } static void FlipLatchLine(void) { DOTLED_LINE_PORT |= _BV(DOTLED_LINE_SCKT); DOTLED_LINE_PORT &= ~_BV(DOTLED_LINE_SCKT); } void InitDotLedPort(void) { DOTLED_LINE_PORT &= ~(_BV(DOTLED_LINE_SCKT) | _BV(DOTLED_LINE_SCKH)); DOTLED_LINE_PORT |= _BV(DOTLED_LINE_SDA); DOTLED_LINE_DDR |= _BV(DOTLED_LINE_SCKT) | _BV(DOTLED_LINE_SCKH) | _BV(DOTLED_LINE_SDA); DOTLED_ROW_PORT |= 0x1f; DOTLED_ROW_PORT &= 0xf0; DOTLED_ROW_DDR |= 0x1f; } void EnableRow(boolean IsEnable) { if(IsEnable) { DOTLED_ROW_PORT &= ~_BV(DOTLED_ROW_E); } else { DOTLED_ROW_PORT |= _BV(DOTLED_ROW_E); } } void PrintDotLed(uint8 * buffer) { uint8 i , tmp; for(i = 0 ; i < 16 ; i ++) { tmp = *buffer ++; TransmitByte(~tmp); tmp = *buffer ++; TransmitByte(~tmp); SelectRow(i); FlipLatchLine(); } } void main(void) { InitDotLedPort(); EnableRow(TRUE); while(1) { PrintDotLed(font); __delay_cycles(5000); } } //---------------------------------------------------- config.h文件 #ifndef _CONFIG_H #define _CONFIG_H //#define GCCAVR #define CPU_CYCLES 7372800L #ifndef GCCAVR #define _BV(bit) (1 << (bit)) #endif #define MSB 0x80 #define LSB 0x01 #define FALSE 0 #define TRUE 1 typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; typedef unsigned char boolean; #include <ioavr.h> #include <inavr.h> #include "dotled.h" #endif //-----
上傳時間: 2013-11-18
上傳用戶:mnacyf
PLC 以 其 可靠性高、抗干擾能力強、配套齊全、功能完善、適應性強等特點,廣泛應用于各種控制領域。PLC作為通用工業控制計算機,是面向工礦企業的工控設備,使用梯形圖符號進行編程,與繼電器電路相當接近,被廣大工程技術人員接受。但是在實際應用中,如何編程能夠提高PLC程序運行速度是一個值得我們思考研究的問題。1 PLC工作原理PLC 與 計 算機的工作原理基本相同,即在系統程序的管理下,通過運行應用程序完成用戶任務。但兩者的工作方式有所不同。計算機一般采用等待命令的工作方式,而PLC在確定了工作任務并裝人了專用程序后成為一種專用機,它采用循環掃描工作方式,系統工作任務管理及應用程序執行都是用循環掃描方式完成的。PLC 有 兩 種基本的工作狀態,即運行(RUN)與停止(STOP)狀態。在這兩種狀態下,PLC的掃描過程及所要完成的任務是不盡相同的,如圖1所示。 PLC在RUN工作狀態時,執行一次掃描操作所的時間稱為掃描周期,其典型值通常為1一100nis,不同PLC廠家的產品則略有不同。掃描周期由內部處理時間、輸A/ 輸出處理執行時間、指令執行時間等三部分組成。通常在一個掃描過程中,執行指令的時間占了絕大部分,而執行指令的時間與用戶程序的長短有關。用戶 程 序 是根據控制要求由用戶編制,由許多條PLC指令所組成。不同的指令所對應的程序步不同,以三菱FX2N系列的PLC為例,PLC對每一個程序步操作處理時間為:基本指令占0.741s/步,功能指令占幾百微米/步。完成一個控制任務可以有多種編制程序的方法,因此,選擇合理、巧妙的編程方法既可以大大提高程序運行速度,又可以保證可靠性。 提高PLC程序運行速度的幾種編程方法2.1 用數據傳送給位元件組合的方法來控制輸出在 PL C應 用編程中,最后都會有一段輸出控制程序,一般都是用邏輯取及輸出指令來編寫,如圖2所示。在圖2所示的程序中,邏輯取的程序步為1,輸出的程序步為2,執行上述程序共需3個程序步。通常情況下,PLC要控制的輸出都不會是少量的,比如,有8個輸出,在條件滿足時要同時輸出。此時,執行圖2所示的程序共需17個程序步。若我們通過位元件的組合并采用數據傳送的方法來完成圖2所示的程序,就會大大減少程序步驟。在三 菱 PLC中,只處理ON/OFF狀態的元件(如X,Y,M和S),稱為位元件。但將位元件組合起來也可以處理數據。位元件組合由Kn加首元件號來表示。位元件每4bit為一組組合成單元。如KYO中的n是組數,當n=1時,K,Yo 對應的是Y3一Yo。當n二2時,KZYo對應的是Y7一Yo。通過位元件組合,就可以用處理數據的方式來處理位元件,圖2程序所示的功能可用圖3所示的傳送數據的方式來完成。
上傳時間: 2013-11-11
上傳用戶:幾何公差