基于单片机的数控电压源课程设计毕业设计 下载本文

内容发布更新时间 : 2024/12/28 21:18:06星期一 下面是文章的全部内容请认真阅读。

五.由设置子程序可以看出,进入设置子程序后就屏蔽了“+”,“-”和设置

键。然后逐步判断按键,执行相应程序。设计总结

六.附件

A、程 序 实 现

单片机系统初始化和存储器分配程序 $NOMOD51 ;------------------------------------------------------------------------------ ; This file is part of the C51 Compiler package //这个文件是c51 链接的数据 ;------------------------------------------------------------------------------ ; STARTUP.A51: This code is executed after processor reset. 这个代码在程序重启之后执行 ; ; To translate this file use A51 with the following invocation: ; ; A51 STARTUP.A51 ; ; To link the modified STARTUP.OBJ file to your application use the following ; BL51 invocation: ; ; BL51 , STARTUP.OBJ ; ;------------------------------------------------------------------------------ ; ; User-defined Power-On Initialization of Memory ; ; With the following EQU statements the initialization of memory ; at processor reset can be defined: ; ; ; the absolute start-address of IDATA memory is always 0 IDATALEN EQU 80H ; the length of IDATA memory in bytes. IDATA存储的字节长度 ;

XDATASTART EQU 0H ; the absolute start-address of XDATA memory XDATA 存储的实际起始地址 XDATALEN EQU 0H ; the length of XDATA memory in bytes. ; PDATASTART EQU 0H ; the absolute start-address of PDATA memory PDATALEN EQU 0H ; the length of PDATA memory in bytes. ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; 8051 CPU. At minimum the memory space occupied from the C51

; run-time routines must be set to zero.

;------------------------------------------------------------------------------ ;

; Reentrant Stack Initilization ;

; The following EQU statements define the stack pointer for reentrant ; functions and initialized it: ;

; Stack Space for reentrant functions in the SMALL model.

IBPSTACK EQU 0 ; set to 1 if small reentrant is used.

IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1. ;

; Stack Space for reentrant functions in the LARGE model.

XBPSTACK EQU 0 ; set to 1 if large reentrant is used.

XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ;

; Stack Space for reentrant functions in the COMPACT model.

PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ;

;------------------------------------------------------------------------------ ;

; Page Definition for Using the Compact Model with 64 KByte xdata RAM ;

; The following EQU statements define the xdata page used for pdata ; variables. The EQU PPAGE must conform with the PPAGE control used ; in the linker invocation. ;

PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. ;

PPAGE EQU 0 ; define PPAGE number. ;

PPAGE_SFR DATA 0A0H ; SFR that supplies uppermost address byte ; (most 8051 variants use P2 as uppermost address byte) ;

;------------------------------------------------------------------------------

; Standard SFR Symbols ACC DATA 0E0H B DATA 0F0H SP DATA 81H DPL DATA 82H DPH DATA 83H

NAME C_STARTUP

C_C51STARTUP SEGMENT CODE STACK SEGMENT IDATA

RSEG STACK DS 1

EXTRN CODE (?C_START) PUBLIC C_STARTUP

CSEG AT 0 ?C_STARTUP: LJMP STARTUP1

RSEG C_C51STARTUP

STARTUP1:

IF IDATALEN <> 0

MOV R0,#IDATALEN - 1 CLR A

IDATALOOP: MOV @R0,A

DJNZ R0,IDATALOOP ENDIF

IF XDATALEN <> 0

MOV DPTR,#XDATASTART MOV R7,#LOW (XDATALEN) IF (LOW (XDATALEN)) <> 0

MOV R6,#(HIGH (XDATALEN)) +1 ELSE

MOV R6,#HIGH (XDATALEN) ENDIF

CLR A

XDATALOOP: MOVX @DPTR,A INC DPTR

DJNZ R7,XDATALOOP DJNZ R6,XDATALOOP ENDIF

IF PPAGEENABLE <> 0

MOV PPAGE_SFR,#PPAGE ENDIF

IF PDATALEN <> 0 MOV R0,#LOW (PDATASTART) MOV R7,#LOW (PDATALEN) CLR A PDATALOOP: MOVX @R0,A INC R0 DJNZ R7,PDATALOOP ENDIF IF IBPSTACK <> 0 EXTRN DATA (?C_IBP) MOV C_IBP,#LOW IBPSTACKTOP ENDIF IF XBPSTACK <> 0 EXTRN DATA (?C_XBP) MOV C_XBP,#HIGH XBPSTACKTOP MOV C_XBP+1,#LOW XBPSTACKTOP ENDIF IF PBPSTACK <> 0 EXTRN DATA (C_PBP) MOV C_PBP,#LOW PBPSTACKTOP ENDIF MOV SP,#STACK-1 ; This code is required if you use L51_BANK.A51 with Banking Mode 4 ; EXTRN CODE (B_SWITCH0) ; CALL B_SWITCH0 ; init bank mechanism to code bank 0 LJMP C_START END

键盘扫描程序 #include #define uchar unsigned char

#define uint unsigned int sbit key1=P1^0; sbit key2=P1^1; void delay(uint z); uchar keyscan() // 键盘扫描程序 { uchar temp,num; num=17; P1=0xfe; // p1.0口置0 temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(20); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { // delay(10); //延迟去抖 P1=P1&0xf0; while(P1!=0xf0); switch(temp) { case 0xe0:num=7;break; //0xf0和0xe0的交处,即p1.0与p1.4的交处 case 0xd0:num=8;break; // p1.0与p1.5的交处, case 0xb0:num=9;break; case 0x70:num=15;break; default:break; } } else break; } P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(20); temp=P1; temp=temp&0xf0;