|
;=============兩機(jī)串口通訊程序(主機(jī))===================== ; ; 功 能: 使用串行中斷,接收數(shù)據(jù)并顯示 ; 硬件環(huán)境: 自制單片機(jī)實(shí)驗(yàn)板 ; 軟件環(huán)境: 偉福 V3.20 ; Create date: 2004_07_26 ; First Modify: 2004_07_26 ; second Modify: ; Last Modify: 2004_07_26 ; Author: Sujiande ; ;===========預(yù)定義=================== LED0 EQU 40H ;預(yù)定義數(shù)碼管 LED1 EQU 41H ;預(yù)定義數(shù)碼管 LED2 EQU 42H ;預(yù)定義數(shù)碼管 LED3 EQU 43H ;預(yù)定義數(shù)碼管 LED4 EQU 44H ;預(yù)定義數(shù)碼管 LED5 EQU 45H ;預(yù)定義數(shù)碼管 LED6 EQU 46H ;預(yù)定義數(shù)碼管 LED7 EQU 47H ;預(yù)定義數(shù)碼管 SDA BIT P0.1 ; 定義數(shù)據(jù)線引腳定義 SCL BIT P0.0 ; 定義時(shí)鐘線引腳定義 ;--------------------------- ORG 0000H ;主程序入口 AJMP MAIN ;跳轉(zhuǎn)到主程序 ORG 0100H ;主程序在ROM中存放位置 ;===============主程序===================== MAIN: MOV LED0,#00H ;賦初值 MOV LED1,#00H MOV LED2,#16 ;賦初值為16, 數(shù)碼管顯示代碼為: 滅 MOV LED3,#16 MOV LED4,#16 MOV LED5,#16 MOV LED6,#16 MOV LED7,#16 ;-------------------- ;MOV DPTR,#TABLE ; 賦顯示代碼首地址 MOV R1,#00H ; 給R1賦初值00H ACALL DISPLAY ; 調(diào)顯示子程序 MOV SP, #30H ; 給堆棧指針賦初值 ;-------------------------- ; 使用定時(shí)器1,作為波特率發(fā)生器,設(shè)定波特率=9600, ; 定時(shí)器初值為:FAH ; 串行控制器設(shè)置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0, ; RB8=0,TI=0,RI=0 即0101 0000B ; 波特率加倍 ;----------------------------- MOV TMOD,#20H ;設(shè)置定時(shí)器1,工作方式2 MOV TH1,#0FAh ;賦初值: FA MOV TL1,#0FAh ;賦初值: FA MOV SCON, #50h ;設(shè)置串行口控制寄存器 MOV PCON, #80h ;設(shè)置電源控制寄存器, 讓波特率加倍(2X) SETB TR1 ;啟動(dòng)定時(shí) ;*****************主程序結(jié)束************************ LP8: MOV A,R1 ;將R1的數(shù)據(jù)裝到A中 ;----------------------- MOV SBUF,A ;將A的數(shù)據(jù)送到緩沖區(qū) JNB TI,$ ;等待數(shù)據(jù)發(fā)送完畢 CLR TI ;清發(fā)送中斷標(biāo)志 ;----------------------- INC R1 CJNE R1,#99,LP3 MOV R1,#00H LP3: ACALL SEPERATE ;調(diào)拆分程序 ACALL DISPLAY ;調(diào)顯示子程序 ACALL DELAY_1S ;調(diào)延時(shí)子程序 AJMP LP8 ;=================拆分程序===================== SEPERATE: ANL A,#0Fh ;與操作得到個(gè)位數(shù)據(jù) MOV LED0,A ;個(gè)位送LED0 MOV A,R1 ANL A,#0F0H ;與操作得到十位數(shù)據(jù) SWAP A MOV LED1,A ;十位送LED1 RET ;===============顯示子程序====================== DISPLAY: MOV DPTR,#TABLE ; 賦顯示代碼首地址 MOV A,LED0 ;查表數(shù)據(jù)送A MOVC A,@A+DPTR ;查表,得到顯示代碼 ACALL SHIFT ;調(diào)移位子程序 MOV A,LED1 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED2 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED3 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED4 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED5 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED6 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED7 MOVC A,@A+DPTR ACALL SHIFT RET ;---------顯示代碼表--------- TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,滅,- ;================移位子程序============================ SHIFT: PUSH A ; 進(jìn)棧暫存A值 MOV R0,#8 ; 循環(huán)8次 CLR C ;清進(jìn)位標(biāo)志 CLR SCL ;時(shí)鐘線,先鉗位為0 LP2: RLC A MOV SDA,C NOP NOP SETB SCL NOP NOP CLR SCL NOP NOP DJNZ R0,LP2 POP A ; 出;謴(fù)A值 RET ;=============延時(shí)子程序=============== DELAY_1S: MOV R7,#0ffH LOOP7: MOV R6,#0ffH LOOP6: NOP NOP NOP NOP NOP NOP DJNZ R6,LOOP6 DJNZ R7,LOOP7 RET ;------------------------------ END ;=============兩機(jī)串口通訊程序(從機(jī))===================== ; ; 功 能: 使用串行中斷,接收數(shù)據(jù)并顯示 ; 硬件環(huán)境: 自制單片機(jī)實(shí)驗(yàn)板 ; 軟件環(huán)境: 偉福 V3.20 ; Create date: 2004_07_26 ; First Modify: 2004_07_26 ; second Modify: ; Last Modify: 2004_07_26 ; Author: Sujiande ; ;===========預(yù)定義=================== LED0 EQU 40H ;預(yù)定義數(shù)碼管 LED1 EQU 41H ;預(yù)定義數(shù)碼管 LED2 EQU 42H ;預(yù)定義數(shù)碼管 LED3 EQU 43H ;預(yù)定義數(shù)碼管 LED4 EQU 44H ;預(yù)定義數(shù)碼管 LED5 EQU 45H ;預(yù)定義數(shù)碼管 LED6 EQU 46H ;預(yù)定義數(shù)碼管 LED7 EQU 47H ;預(yù)定義數(shù)碼管 SDA BIT P0.1 ; 定義數(shù)據(jù)線引腳定義 SCL BIT P0.0 ; 定義時(shí)鐘線引腳定義 ;--------------------------- ORG 0000H ;主程序入口 AJMP MAIN ;跳轉(zhuǎn)到主程序 ORG 0023H ;中斷入口地址 AJMP S_INT ;跳轉(zhuǎn)到中斷程序 ORG 0100H ;主程序在ROM中存放位置 ;==============主程序======================== MAIN: MOV LED0,#00H ;賦初值 MOV LED1,#00H MOV LED2,#16 ;賦初值為16, 數(shù)碼管顯示代碼為: 滅 MOV LED3,#16 MOV LED4,#16 MOV LED5,#16 MOV LED6,#16 MOV LED7,#16 ;------------------------------ MOV DPTR,#TABLE ; 賦顯示代碼首地址 ACALL DISPLAY ; 調(diào)顯示子程序 MOV SP, #30H ; 給堆棧指針賦初值 ;-------------------------------------------- ; 使用定時(shí)器1,作為波特率發(fā)生器,設(shè)定波特率=9600, ; 定時(shí)器初值為:FAH ; 串行控制器設(shè)置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0, ; RB8=0,TI=0,RI=0 即0101 0000B ; 波特率加倍 ;--------------------------------------------- MOV TMOD,#20H ;設(shè)置定時(shí)器1,工作方式2 MOV TH1,#0FAh ;賦初值: FA MOV TL1,#0FAh ;賦初值: FA MOV SCON, #50h ;設(shè)置串行口控制寄存器 MOV PCON, #80h ;設(shè)置電源控制寄存器, 讓波特率加倍(2X) ;--------------------------------------- SETB EA ; 啟動(dòng)總中斷 SETB ES ; 啟動(dòng)串行中斷 SETB TR1 ;啟動(dòng)定時(shí) AJMP $ ; 等待中斷 ;*****************主程序結(jié)束************************ ;===============中斷服務(wù)程序============================= S_INT: MOV R1, SBUF ;將緩沖區(qū)的數(shù)據(jù)送到R1
ACALL SEPERATE ;調(diào)拆分程序 ACALL DISPLAY ;調(diào)顯示子程序 CLR RI ;清接收中斷標(biāo)志 RETI ;中斷返回 ;=================拆分程序===================== SEPERATE: MOV A,R1 ANL A,#0Fh ;與操作得到個(gè)位數(shù)據(jù) MOV LED0,A ;個(gè)位送LED0 MOV A,R1 ANL A,#0F0H ;與操作得到十位數(shù)據(jù) SWAP A ; MOV LED1,A ;十位送LED1 RET ;===============顯示子程序====================== DISPLAY: MOV A,LED0 ;查表數(shù)據(jù)送A MOVC A,@A+DPTR ;查表,得到顯示代碼 ACALL SHIFT ;調(diào)移位子程序 MOV A,LED1 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED2 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED3 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED4 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED5 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED6 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED7 MOVC A,@A+DPTR ACALL SHIFT RET ;---------顯示代碼表--------- TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,滅,- ;================移位子程序============================ SHIFT: PUSH A ; 進(jìn)棧暫存A值 MOV R0,#8 ; 循環(huán)8次 CLR C ;清進(jìn)位標(biāo)志 CLR SCL ;時(shí)鐘線,先鉗位為0 LP2: RLC A MOV SDA,C NOP NOP SETB SCL NOP NOP CLR SCL NOP NOP DJNZ R0,LP2 POP A ; 出;謴(fù)A值 RET ;=============延時(shí)子程序=============== DELAY_1S: MOV R7,#0ffH LOOP7: MOV R6,#0ffH LOOP6: NOP NOP NOP NOP NOP NOP DJNZ R6,LOOP6 DJNZ R7,LOOP7 RET ;------------------------------ END
|