数字电压表汇编语言

合集下载

EDA课程设计 数字电压表 代码及 报告

EDA课程设计 数字电压表 代码及 报告

第一部分项目名称、内容与要求项目名称:数字电压表设计1.1 设计内容利用FPGA与模数转换器ADC0809设计一个数字电压表,能够测量0~5V之间的直流电压,用四个数码管显示被测电压,要求精确到小数点后三位数字。

了解数字电压表的工作原理,掌握可编程逻辑器件与模数转换器之间的接口电路设计及调试方法。

下载并测试电路功能,分析芯片资源的占用情况。

1.2 具体要求1)、能正确测量0-5∨模拟电压,误差<1%,数字电压值分别由四个数码管显示。

(2)、FPGA芯片产生ADC0809控制信号和七段显示器断码和位码等。

(3)、ADC0809芯片实现8位模数转换,输入0-5∨,输出00H-FFH。

(4)、ADC0809输出00H-FFH送FPGA芯片处理为十进制数百十个等位,并产生动态显示位码和断码。

(5)、FPGA芯片产生ADC0809芯片需要写、读和片选信号等,注意时序。

(6)、了解掌握A/D(模数)转换器芯片ADC0809的转换原理、管脚定义以及实际用法。

第二部分:系统整体架构(Architecture Description)2.1 设计思路数字电压表(Digital V oltmeter)简称DVM,是一种用数字显示的电压测量仪表。

由于数字电压表具有读数准确方便、精度高、误差小、灵明度高和分辨率高、测量速度快等特点而备受青睐。

其基本理是采用数字化测量技术,对直流电压进行模数转换,转换成不连续、离散的数字形式并加以显示。

由此可知数字电压表的设计应包括三个主要部分:作为电压采样端口的模数转换单元、数据处理单元及电压值显示单元。

设计要求利用ADC0809模数转换器,FPGA 作为数据处理的核心器件,用LED和数码管进行电压值的显示。

系统结构框图如下图所示。

2.2 系统原理(包含:框图等阐述)与设计说明等内容1、模数转换器工作原理A/D转换器芯片ADC0809简介8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道抵制锁存用译码电路,其转换时间为100μs左右。

数字电压表,详解 汇编语言

数字电压表,详解 汇编语言

数字电压表数字电压表只是一个开端,数字电压表是把外部的电压模拟信号,转换成数字信号,也就是进行了模数转换,现在有很多传感器都是电压式传感器,那么,通过做数字电压表这个试验之后,我们可以把很多外部的电压信号转换成数字信号,供单片机进行处理,采集信息,然后进行相应的动作,所以,数字电压表实验,是一类单片机实验的开端。

我们使用的模数转换芯片是ADC0809,八路逐次比较型的AD 转换芯片,而且是八位的,也就说该芯片能识别出255份数字量,通过对参考电压VREF+(通常选择5V ),我们知道5/255约等于20mv/1B,也就是说在接到5V 参考电压的情况下,ADC0809的精度是20mv ,现在我们做的是数字电压表实验,如果以后你换成了某个传感器例如是LM35,通过查芯片手册知道,它是每升高一度电压升高10mv ,已经超过ADC0809的精度,也就是说它变成了瞎子,所以我们想继续使用该芯片的话就需要进行放大,最少需要放大2倍,即可达到ADC0809的精度,下面推荐一个单电源的运放电路。

321411U1:ALM324R110kR210kU1_V+RV1RES-VARU1_V+地址输入和控制线:4条ALE 为地址锁存允许输入线,高电平有效。

当ALE 线为高电平时,地址锁存与译码器将A ,B ,C 三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。

A ,B 和C 为地址输入线,用于选通IN0-IN7上的一路模拟量输入。

通道选择表如下表所示。

C B A 选择的通道 0 0 0 IN0 0 0 1 IN1 0 1 0 IN2 0 1 1 IN3 1 0 0 IN4 1 0 1 IN5 1 1 0 IN6 111IN7数字量输出及控制线:11条ST为转换启动信号。

当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。

EOC为转换结束信号。

当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。

用51单片机设计数字电压表的程序(汇编)

用51单片机设计数字电压表的程序(汇编)

//晶振频率12MHZ AD采样频率为8.192msCOM EQU 50H ;指令寄存器DA T EQU 51H ;数据寄存器RS EQU P2.1 ;LCD寄存器选择信号RW EQU P2.2 ;LCD读/写选择信号E EQU P2.3 ;LCD使能信号ORG 0000HLJMP MAIN ;主程序入口ORG 000BHLJMP BT0 ;T0中断入口ORG 0030H ;主程序,初始化MAIN: MOV SP,#60HLCALL INTMOV 30H,#30H ;显示电压整数位MOV 31H,#02EH ;显示小数点MOV 32H,#30H ;显示电压小数个位MOV 33H,#30H ;显示电压小数十位MOV 34H,#30H ;显示电压小数百位MOV 35H,#56H ;显示VMOV R7,#30HLCALL N1 ;显示V oltage=0.000V//**********************定时器初始化程序*********************** MOV TMOD,#00H ;定时器T0设为方式0,为13位定时/计数器MOV TL0,#00H ;装入定时初值MOV TH0,#00HSETB TR0 ;启动T0MOV 24H,#08H ;装入T0中断次数MOV IE,#82H ;开中断定时器T0溢出中断允许位//*************************************************************LP: MOV R7,#30H ;显示缓冲区首地址LCALL DISPLYSJMP LP ;循环显示//****定时器中断服务程序,读取0809第0通道的转换结果并化为显示值***** BT0: PUSH ACC ;保护现场PUSH PSWPUSH DPHPUSH DPLMOV PSW,#08H ;设定工作寄存器1区CLR TR0 ;停止T0MOV TH0,#00H ;重装定时常数MOV TL0,#00HDEC 24H ;24H内容减一,剩7次中断MOV A,24HJNZ RTN1 ;8次中断未到,返回MOV 24H,#08H ;重装中断次数MOV DPTR,#0F6FFH ;0809端口地址MOV A,#00H ;0通道MOVX @DPTR,A;启动0809MOV R7,#40H ;延时方式等待AD0809转换完毕DJNZ R7,$ ;也可采用中断方式MOVX A,@DPTR ;读0809转换结果LCALL RTN ;采样值转换为显示值子程序LCALL RTN1//*******A/D转换结果化为显示值**************RTN:PUSH PSWMOV PSW,#10H ;选择工作寄存器2区MOV R6,#00H ;填入被除数,除数为51MOV R5,ALCALL DDIV ;调用除51子程序MOV A,R5 ;商为个位数ORL A,#30HMOV 30H,A;个位存入缓冲区MOV R0,#32H ;指针指向显示缓冲区MOV R1,#3H ;循环3次LP_1:MOV A,R6 ;(余数)*10/51MOV B,#0AHMUL ABMOV R6,B ;填入被除数,除数为51MOV R5,ALCALL DDIVMOV A,R5 ;商分别为十分位,百分位,千分位ORL A,#30HMOV @R0,A; 十,百,千存入缓冲区INC R0DJNZ R1,LP_1POP PSWRET//********16位/51无符号数除法************************ ;入口:r6r5 被除数除数为33H=51;出口:r5商r6 余数DDIV:MOV R7,#08H ;R7为计数器DDIVI:CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV 07H,CCLR CSUBB A,#33HJB 07H,NEXT ;JNC NEXT ;ADD A,#33HSJMP NEXTINEXT: INC R5NEXTI:MOV R6,ADJNZ R7,DDIVIRETRTN1:LCALL DISPLYSETB TR0POP DPLPOP DPHPOP PSWPOP ACCRETI//******LCD显示子程序************************ DISPLY:MOV COM,#080H+4AH ;显示测量值首地址LCALL PR1 ;调用写指令子程序MOV R1,#06H ;要显示数据的个数MOV R0,#30H ;要显示数据的首地址L: MOV DA T,@R0 ;取A/D转换数据LCALL PR2 ;调写显示数据子程序INC R0DJNZ R1,L ;共显示6个数据?RET//******逐字依次输入显示第一行字符*********** N1: MOV COM,#01H ;LCD清屏LCALL PR1 ;调用写指令代码子程序MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#80H ; 设置数据指针首地址LCALL PR1MOV DPTR,#TAB0 ;DPTR指向显示字符表0首地址;MOV R4,#16MOV R5,#00H;xianshi:MOV A,R5;MOVC A,@A+DPTR ;取出显示字符MOV DA T,ALCALL PR2INC R5;DJNZ R4,xianshi;//******逐字依次输入显示第二行字符*********** MOV COM,#080H+42H ;LCALL PR1MOV DPTR,#TAB1 ;DPTR指向显示字符表1首地址MOV R2,#8MOV R3,#00HWRIN:MOV A,R3MOVC A,@A+DPTR ;取出显示字符MOV DA T,ALCALL PR2INC R3DJNZ R2,WRINRETTAB0:DB"ZDH10602 YW&WH"TAB1:DB"V oltage=";//*******LCD间接控制方式下的初始化子程序******** INT: ;调延时子程序MOV COM,#38H ;设置液晶显示模式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0CH ;设置显示方式LCALL PR1RET//**********延时子程序*******************DELAY: MOV R6,#0FHMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RET//****LCD间接控制方式的驱动子程序*******//*********写指令代码子程序************PR1: PUSH ACCCLR RS ;RS=0SETB RW ;R/W=1 读指令PR11:MOV P0,#0FFH ;P0置位,准备读SETB E ;E=1LCALL DELAYNOPMOV A,P0CLR EJB ACC.7,PR11 ;BF=1? 读写检测,判断忙标志CLR RW ;R/W=0 写指令MOV P0,COMSETB E ;E=1CLR E ;E=0POP ACCRET//*********写显示数据子程序************PR2: PUSH ACCCLR RS ;RS=0SETB RW ;R/W=1PR21:MOV P0,#0FFHSETB E ;E=1LCALL DELAYMOV A,P0 ;读BF和AC6-4值CLR E ;E=0JB ACC.7,PR21SETB RSCLR RW // 写数据MOV P0,DA T ;写入数据高四位SETB E ;E=1CLR E ;E=0POP ACCRETEND。

数字电压表源程序

数字电压表源程序
if(ucaChar[ucCount+1]=='\0')
break;
}
}
void vDelay()
{
unsigned int uiCount;
for(uiCount=0;uiCount<250;uiCount++);
}
/**********************************************************************************************************************/
case 'u': vWriteData(0x75);break;
case 'v': vWriteData(0x76);break;
case 'w': vWriteData(0x77);break;
case 'x': vWriteData(0x78);break;
case 'y': vWriteData(0x79);break;
}
v ucData)
{
vDelay();//先延时。
LCDE=1;//然后把LCD改为写入数据状态。
LCDRS=1;
LCDRW=0;
LCDPORT=ucData;//再输出数据。
LCDE=0;//最后显示数据。
}
void vShowOneChar(unsigned char ucChar)
case 'B': vWriteData(0x42);break;
case 'C': vWriteData(0x43);break;

数字电压表汇编程序及其分析

数字电压表汇编程序及其分析

LED_0 EQU 30HLED_1 EQU 31HLED_2 EQU 32HLED_3 EQU 33H //存放四个数码管的段码ADC EQU 35H //存放转换后的数据ST BIT P3.2OE BIT P3.0EOC BIT P3.1ORG 0000HSTART:MOV LED_0,#00HMOV LED_1,#00HMOV LED_2,#00HMOV LED_3,#00HMOV DPTR,#TABLE //送段码表首地址SETB P3.4SETB P3.5CLR P3.6 //选择ADC0808的通道3 WAIT:CLR STSETB STCLR ST //启动转换JNB EOC,$ //等待转换结束SETB OE //允许输出MOV ADC,P1 //暂存转换结果CLR OE //关闭输出LCALL INTOVLCALL DISP //显示AD转换结果SJMP WAITINTOV:MOV DPTR,#TAB //因为所用的滑动变阻器为0.01的精度,所以MOV A,ADC //最小的读数为0.05,其余均为0.05的倍数MOVC A,@A+DPTR //因此,第三位小数,要么是5,要么是0MOV B,#2DIV ABMOV R0,B //A/2的余数付给R0,通过判断R0的值,MOV B,#100DIV ABMOV R1,A //将A 除以100,并将商赋给R1MOV A,#10XCH A,B //交换数据DIV AB // 得到得商为整数位,余数为第一个小数位MOV LED_3,A //整数位MOV LED_2,B //第一位小数MOV LED_0,R1 //第三位小数CJNE R0,#01,KK1 //若R0=1,则执行下条语句,否则转移到KK1 MOV LED_1,#05 //第二位小数BACK: RETKK1: MOV LED_1,#00AJMP BACKDISP: // 采用4位共阴数码管,故选通开关低有效,MOV DPTR,#TABLE //整数位MOV A,LED_3MOVC A,@A+DPTRSETB A CC.7CLR P2.0MOV P0,ALCALL DELAYSETB P2.0MOV DPTR,#TABLE //十分位MOV A,LED_2MOVC A,@A+DPTRCLR P2.1MOV P0,ALCALL DELAYSETB P2.1MOV DPTR,#TABLE //百分位MOV A,LED_1MOVC A,@A+DPTRCLR P2.2MOV P0,ALCALL DELAYSETB P2.2MOV DPTR,#TABLE //千分位MOV A,LED_0MOVC A,@A+DPTRCLR P2.3MOV P0,ALCALL DELAYSETB P2.3RETDELAY: MOV R6,#10 //延时5毫秒D1: MOV R7,#250DJNZ R7,$DJNZ R6,D1RETTABLE: D B 3FH,06H,5BH,4FH,66H //数码管0-9的码表DB 6DH,7DH,07H,7FH,6FHTAB: DB 0, 0 , 0 , 1, 0, 2, 0, 0, 3, 0 //存放AD转换后的数DB 4, 0, 0, 5, 0, 6, 0, 0, 7, 0DB 8, 0, 0, 9, 0, 0, 10, 0, 11, 0DB 0, 12, 0, 13, 0, 0, 14, 0, 15, 0DB 0, 16, 0, 17, 0, 0, 18, 0, 19, 0DB 0, 20, 0, 0, 21, 0, 22, 0, 0, 23DB 0, 24, 0, 0, 25, 0, 26, 0, 0, 27DB 0, 28, 0, 0, 29, 0, 0, 30, 0, 31DB 0, 0, 32, 0, 33, 0, 0, 34, 0, 35DB 0, 0, 36, 0, 37, 0, 0, 38, 0, 39DB 0, 0, 40, 0, 0, 41, 0, 42, 0, 0DB 43, 0, 44, 0, 0, 45, 0, 46, 0, 0DB 47, 0, 48, 0, 0, 49, 0, 50, 0, 0DB 51, 0, 0, 52, 0, 53, 0, 0, 54, 0DB 55, 0, 0, 56, 0, 57, 0, 0, 58, 0DB 59, 0, 0, 60, 0, 0, 61, 0, 62, 0DB 0, 63, 0, 64, 0, 0, 65, 0, 66, 0DB 0, 67, 0, 68, 0, 0, 69, 0, 70, 0DB 0, 71, 0, 0, 72, 0, 73, 0, 0, 74DB 0, 75, 0, 0, 76, 0, 77, 0, 0, 78DB 0, 79, 0, 0, 80, 0, 0, 81, 0, 82DB 0, 0, 83, 0, 84, 0, 0, 85, 0, 86DB 0, 0, 87, 0, 88, 0, 0, 89, 0, 90DB 0, 0, 91, 0, 0, 92, 0, 93, 0, 0DB 94, 0, 95, 0, 0, 96, 0, 97, 0, 0DB 98, 0, 99, 0, 0, 100, 0, 0, 0END。

基于单片机的数字电压表.

基于单片机的数字电压表.

1 前言 (1)2 总体方案设计 (2)2.1 方案论证 (2)2.2 方案比较及选择 (3)3 硬件电路设计 (4)3.1 AD转换电路 (4)3.2 复位电路 (4)3.3 时钟电路 (5)3.4 显示电路 (6)3.5 特殊器件介绍 (6)3.5.1 主控芯片AT89S51 (6)3.5.2 ADC0808 (7)3.5.3 LED (9)4 软件部分设计 (11)4.1 A/D转换子程序 (11)4.2 显示子程序 (12)5 电路仿真 (13)5.1 软件调试 (13)5.2 显示结果及误差分析 (13)6 系统功能 (17)小结 (18)参考文献 (19)附录1 基于单片机的数字电压表原理图 (20)附录2 基于单片机的数字电压表程序清单 (21)1 前言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。

而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。

数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。

由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。

传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。

采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。

数字电压表是诸多数字化仪表的核心与基础。

以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。

目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。

最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。

电压测量,时间显示的单片机汇编代码

电压测量,时间显示的单片机汇编代码

ORG 0000HLJMP MAINORG 0013HLJMP VOTORG 0030HMAIN:MOV SP,#50HMOV DPTR,#7F0DH ;读寄存器D的初始状态,看是否为80H MOVX A,@DPTRMOV DPTR,#7F0AH ;寄存器A初始化MOV A,#20HMOVX @DPTR,A ;寄存器A的值为20HMOV DPTR,#7F0BH ;寄存器B初始化MOV A,#86HMOVX @DPTR,A ;寄存器B的值为86HMOV DPTR,#7F00H ;DS12887秒初始化01秒MOV A,#59HMOVX @DPTR,AINC DPTRMOV A,#00HMOVX @DPTR,AINC DPTRMOV A,#12HMOVX @DPTR,A;分初始化02分INC DPTRMOV A,#00HMOVX @DPTR,A ;分报警赋值00 INC DPTRMOV A,#18HMOVX @DPTR,A;时初始化03时INC DPTRMOV A,#00HMOVX @DPTR,AINC DPTRMOV A,#01H ;星期初始化星期1 MOVX @DPTR,AINC DPTRMOV A,#31H ;日初始化,31日MOVX @DPTR,AINC DPTRMOV A,#05H ;月初始化,5月MOVX @DPTR,AINC DPTRMOV A,#10H ;年低位初始化10 MOVX @DPTR,AMOV DPTR,#7F0EH ;年高位(使用用户RAM)初始化MOV A,#20HMOVX @DPTR,AMOV DPTR,#7F0BH ;寄存器B值为42HMOV A,#42HMOVX @DPTR,AMOV DPTR,#7F0CH ;寄存器C设置中断MOVX A,@DPTRMOV TMOD,#0D0H ;初始化计数器MOV TL1,#00HMOV TH1,#00HMOV IE,#81HSETB IT1MOV R3,#01HKK:LCALL KEYLCALL DISP4K0:CJNE R3,#01H,K1LCALL TIMEK1:CJNE R3,#02H,K2LCALL DATELJMP KKK2:CJNE R3,#03H,K3LCALL XINGQILJMP KKK3:CJNE R3,#04H,K4SETB EX1SETB TR1EE4: LJMP KKK4:MOV R3,#01HCLR EX1LJMP KKKEY:JB P1.0,KEY1LCALL DIMS1JB P1.0,KEY1INC R3WT:JNB P1.0,WTLCALL DIMS1JNB P1.0,WTKEY1:RET ;回到KK,接着调用动态扫描DIMS1:MOV R7,#10 ;10毫秒延时子程序TM:MOV R6,#255TM6:DJNZ R6,TM6DJNZ R7,TMRET;时间程序/////////////////////////////////////////TIME:MOV DPTR,#7F0AH ;把DS12887的寄存器A给DPTRMOVX A,@DPTR ;JB ACC.7,TIME ;寄存器7为1时执行TIME程序MOV DPTR,#7F00H ;读取DFS12887的秒值MOVX A,@DPTR ;把秒值给AANL A,#0FH ;A值与0FH"与"运算,以屏蔽秒高字节MOV 77H,A ;把秒的低字节送77H显示MOVX A,@DPTR ;再次把秒值送AANL A,#0F0H ;屏蔽秒低字节SWAP A ;交换高低半字节MOV 76H,A ;把秒的高字节送76H显示MOV DPTR,#7F02H ;分MOVX A,@DPTRANL A,#0FHMOV 74H,AMOVX A,@DPTRANL A,#0F0HSWAP AMOV 73H,AMOV DPTR,#7F04H ;时MOVX A,@DPTRANL A,#0FHMOV 71H,AMOVX A,@DPTRANL A,#0F0HSWAP AMOV 70H,AMOV 72H,#0CH ;72H和75H显示一条杠MOV 75H,#0CHACALL DISP4 ;绝对调用动态扫描程序,显示时间;按第二个按键S2进入闪烁//////////////////////////////////////////JB P1.1,UUU ;判断.P1.1即S2是否为1(没按下),如果没按下,执行UUU程序LCALL DIMS1 ;调用10MS延时程序JB P1.1,UUU ;再次判断S2是不是按下,以消除抖动等因数AJMP FF1 ;绝对跳转到FF1UUU:RETFF1:JNB P1.1,FF1 ;判断S2是否弹起,如果弹起则执行FF1LCALL DIMS1JNB P1.1,FF1;产生闪烁//////////////////////////////////MMM:MOV R1,#70H ;70H赋给R1PPP:MOV 66H,#0AH ;0AH(10)赋给66HVVV:LCALL DISP4 ;调用动态扫描显示DJNZ 66H,VVV ;先将66H的内容0A减1(=9,8,7....),判断是否为0,不为0则执行VVV,(其实要循环10次)MOV 45H,@R1 ;把70H的值给45HMOV 66H,#0AH ;把10赋给66H 导致66H的值回到0A(10)MOV @R1,#0AH ;把10赋给70HTTH:LCALL DISP4 ;调用动态扫描显示DJNZ 66H,TTH ;循环显示MOV @R1,45H ;把45H的值给70H;闪烁移动/////////////////////////////////;第三按键S3是否按下如果按下,执行EE1程序(判断第4键是否有按下) JB P1.2,EE1LCALL DIMS1JB P1.2,EE1;判断第三按键S3是否弹起,若弹起,跳转到CCC(闪烁移动)FF2:JNB P1.2,FF2LCALL DIMS1JNB P1.2,FF2LCALL CCC;判断第四按键S4是否按下,若按下,调用EE2(判断第2键是否有按下) EE1:JB P1.3,EE2LCALL DIMS1JB P1.3,EE2;判断第四按键S4是否弹起,若弹起跳转到DDD(加值)FF3:JNB P1.3,FF3LCALL DIMS1JNB P1.3,FF3LJMP D;判断第二按键S2是否按下,若按下调用PPPEE2:JB P1.1,PPPLCALL DIMS1JB P1.1,PPP;判断第二按键S2是否弹起,若弹起跳转到EEEFF4:JNB P1.1,FF4LCALL DIMS1JNB P1.1,FF4LJMP EEE;第三个按键功能程序CCC:INC R1 ;R1的值+1,初次为R1由#70H 变成#71H CJNE R1,#72H,CD ;如果R1的值大于72H,MOV R1,#73HCD:CJNE R1,#75H,CD1MOV R1,#76HCD1:CJNE R1,#78H,CD2MOV R1,#70HCD2:NOPRET;第四个按键功能程序(加值)//////////////D: MOV A,@R1CJNE R1,#70H,D1MOV R2,71HCJNE R2,#04H,D11D12: CJNE A,#01H,JJJMOV @R1,#0FFHLJMP JJJD11: JNC D12CJNE A,#02H,JJJMOV @R1,#0FFHLJMP JJJD1: CJNE R1,#71H,D2MOV R2,70HCJNE R2,#02H,D13CJNE A,#03H,JJJMOV @R1,#0FFHLJMP JJJD13: CJNE A,#09H,JJJMOV @R1,0FFHLJMP JJJD2: CJNE R1,#73H,D3CJNE A,#05H,JJJMOV @R1,0FFHLJMP JJJD3: CJNE R1,#74H,D4CJNE A,#09H,JJJMOV @R1,0FFHLJMP JJJD4: CJNE R1,#76H,D5CJNE A,#05H,JJJMOV @R1,0FFHLJMP JJJD5: CJNE A,#09H,JJJMOV @R1,0FFHLJMP JJJJJJ: INC @R1LJMP PPPLJMP EEE;/////////////////////////////////////;把修改过的时间重新装入时钟芯片EEE:MOV DPTR,#7F00H ;读取DS12887秒的值MOV A,76H ;秒"高位"给ASWAP A ;交换高低半字节ADD A,77H ;交换后与秒"低位"相加MOVX @DPTR,A ;相加后把新值重新装给DS12887秒INC DPTRINC DPTR ;读取DS12887分值MOV A,73HSWAP AADD A,74HMOVX @DPTR,AINC DPTRINC DPTR ;读取DS12887时值MOV A,70HSWAP AADD A,71HMOVX @DPTR,ALJMP KKXINGQI:MOV DPTR,#7F0AH ;星期显示MOVX A,@DPTRJB ACC.7,XINGQIMOV DPTR,#7F06HMOVX A,@DPTRANL A,#0FHMOV 70H,AMOV 76H,#0AHMOV 75H,#0AHMOV 74H,#0AHMOV 73H,#0AHMOV 72H,#0AHMOV 71H,#0AHMOV 77H,#0AH;修改星期/////////////////////JB P1.1,XQUUU ;判断.P1.1即S1是否为1(按下),如果按下,执行XQUUU程序LCALL DIMS1 ;调用10MS延时程序JB P1.1,XQUUU ;再次判断S1是不是按下,以消除抖动等因数AJMP XQFF1 ;绝对跳转到XQFF1XQUUU:RETXQFF1:JNB P1.1,XQFF1 ;判断S1是否弹起LCALL DIMS1JNB P1.1,XQFF1XQMMM:MOV R1,#70H ;70H赋给R1XQPPP:MOV 66H,#0AH ;0AH赋给66HXQVVV:LCALL DISP4 ;调用动态扫描显示DJNZ 66H,XQVVV ;先将66H的内容0A减1,判断是否为0,不为0则执行XQVVV,(其实要循环10次)MOV 45H,@R1 ;把70H的值给45HMOV 66H,#0AH ;把10赋给66H 导致66H的值回到10MOV @R1,#0AH ;把10赋给70HXQTTH:LCALL DISP4 ;调用动态扫描显示DJNZ 66H,XQTTH ;循环显示MOV @R1,45H ;把45H的值给70H;第三按键S3是否按下如果按下,执行XQEE1程序(判断第4键是否有按下) JB P1.2,XQEE1LCALL DIMS1JB P1.2,XQEE1;判断第三按键S3是否弹起,若弹起,跳转到XQCCCXQFF2:JNB P1.2,XQFF2LCALL DIMS1JNB P1.2,XQFF2LCALL XQCCC;判断第四按键S4是否按下,若按下,调用XQEE2(判断第2键是否有按下) XQEE1:JB P1.3,XQEE2LCALL DIMS1JB P1.3,XQEE2;判断第四按键S4是否弹起,若弹起跳转到XQDDDXQFF3:JNB P1.3,XQFF3LCALL DIMS1JNB P1.3,XQFF3LJMP XQDDD;判断第二按键S2是否按下,若按下调用XQPPPXQEE2:JB P1.1,XQPPPLCALL DIMS1JB P1.1,XQPPP;判断第二按键S2是否弹起,若弹起跳转到XQEEEXQFF4:JNB P1.1,XQFF4LCALL DIMS1JNB P1.1,XQFF4LJMP XQEEE;第三个按键功能程序XQCCC:INC R1 ;R1的值+1,初次为R1由#70H 变成#71H CJNE R1,#78H,XQCD ;如果R1的值大于72H,MOV R1,#70HXQCD:NOPRET;第四个按键功能程序XQDDD:MOV A,@R1CJNE A,#07H,XQJJJ ;星期的最大值为7MOV @R1,#00HXQJJJ:INC @R1LJMP XQPPPLJMP XQEEEXQEEE:MOV DPTR,#7F06H ;把修改过的星期重新装入时钟芯片MOV A,70HMOVX @DPTR,ALJMP KKRET;星期修改结束//////////////////////////;日期程序////////////////////////////////与时间类似DATE:MOV DPTR,#7F0AHMOVX A,@DPTRJB ACC.7,DATEMOV DPTR,#7F07H ;日显示MOVX A,@DPTRANL A,#0FHMOV 77H,AMOVX A,@DPTRANL A,#0F0HSWAP AMOV 76H,AMOV DPTR,#7F08H ;月MOVX A,@DPTRANL A,#0FHMOV 75H,AMOVX A,@DPTRANL A,#0F0HSWAP AMOV 74H,AMOV DPTR,#7F09H ;年MOVX A,@DPTRANL A,#0FHMOV 73H,AMOVX A,@DPTRANL A,#0F0HSWAP AMOV 72H,AMOV DPTR,#7F0EH ;年高位MOVX A,@DPTRANL A,#0FHMOV 71H,AMOVX A,@DPTRANL A,#0F0HSWAP AMOV 70H,A;修改日期/////////////////////////JB P1.1,RQUUU ;判断.P1.1即S2是否为1(没按下),如果没按下,执行RQUUU程序LCALL DIMS1 ;调用10MS延时程序JB P1.1,RQUUU ;再次判断S2是不是按下,以消除抖动等因数AJMP RQFF1 ;绝对跳转到FF1RQUUU:RETRQFF1:JNB P1.1,RQFF1 ;判断S2是否弹起LCALL DIMS1JNB P1.1,RQFF1RQMMM:MOV R1,#70H ;70H赋给R1RQPPP:MOV 66H,#0AH ;0AH赋给66HRQVVV:LCALL DISP4 ;调用动态扫描显示DJNZ 66H,RQVVV ;先将66H的内容0A减1,判断是否为0,不为0则执行RQVVV,(其实要循环10次)MOV 45H,@R1 ;把70H的值给45HMOV 66H,#0AH ;把10赋给66H 导致66H的值回到为10MOV @R1,#0AH ;把10赋给70HRQTTH:LCALL DISP4 ;调用动态扫描显示DJNZ 66H,RQTTH ;循环显示MOV @R1,45H ;把45H的值给70H;第三按键S3是否按下如果按下,执行RQEE1程序(判断第4键是否有按下)JB P1.2,RQEE1LCALL DIMS1JB P1.2,RQEE1;判断第三按键S3是否弹起,若弹起,跳转到RQCCCRQFF2:JNB P1.2,RQFF2JNB P1.2,RQFF2LCALL RQCCC;判断第四按键S4是否按下,若按下,调用RQEE2(判断第2键是否有按下) RQEE1:JB P1.3,RQEE2LCALL DIMS1JB P1.3,RQEE2;判断第四按键S4是否弹起,若弹起跳转到RQDDDRQFF3:JNB P1.3,RQFF3LCALL DIMS1JNB P1.3,RQFF3LJMP RQDDD;判断第二按键S2是否按下,若按下调用RQPPPRQEE2:JB P1.1,RQPPPLCALL DIMS1JB P1.1,RQPPP;判断第二按键S2是否弹起,若弹起跳转到RQEEERQFF4:JNB P1.1,RQFF4LCALL DIMS1JNB P1.1,RQFF4LJMP RQEEE;第三个按键功能程序RQCCC:INC R1 ;R1的值+1,初次为R1由#70H 变成#71H CJNE R1,#78H,RQCD ;如果R1的值大于72H,RQCD:NOPRET;第四个按键功能程序RQDDD:MOV A,@R1CJNE R1,#74H,RQD1CJNE A,#01H,RQJJJMOV @R1,0FFHLJMP RQJJJRQD1:CJNE R1,#76H,RQD2CJNE A,#03H,RQJJJMOV @R1,#0FFHLJMP RQJJJRQD2:CJNE A,#09H,RQJJJMOV @R1,#0FFHRQJJJ:INC @R1LJMP RQPPPLJMP RQEEE;把修改过的日期重新装入时钟芯片RQEEE:MOV DPTR,#7F07H MOV A,76HSWAP AADD A,77HMOVX @DPTR,AINC DPTRMOV A,74HSWAP AADD A,75HMOVX @DPTR,AINC DPTRMOV A,72HSWAP AADD A,73HMOVX @DPTR,AMOV DPTR,#7F0EHMOV A,70HSWAP AADD A,71HMOVX @DPTR,ALJMP KKRET;电压//////////////VOT:PUSH ACC ;进栈PUSH PSWSETB RS0 ;RS0置1CLR TR1 ;TR1置0CLR EA ;EA置0 (CPU中断关)MOV R6,TL1 ;定时器低位给R6MOV R7,TH1 ;定时器高位给R7MOV TL1,#00H ;定时器低位置0MOV TH1,#00H ;定时器高位置0SETB TR1 ;TR1置1MOV A,R6 ;R6的值即定时器低位的值减10H,再放到R6里SUBB A,#10HMOV R6,AMOV A,R7 ;R7的值即定时器高位的值减27H,再放到R7里SUBB A,#27HMOV R7,ALCALL CZW ;调用10进制转换程序LCALL DIANYA ;调用电压显示程序POP PSW ;退栈POP ACCSETB EA ;开CPU中断RETI;十进制转换程序//////////////CZW:CLR A ;A清0MOV R3,A ;R3.R4,R5都为0MOV R4,AMOV R5,AMOV R2,#10H ;R2的值为10HHB3:MOV A,R6 ;定时器地位减10H后给ARLC A ;A带进位循环左移1位,再放到R6MOV R6,AMOV A,R7 ;定时器高位给A,再左移一位再放到R7RLC AMOV R7,AMOV A,R5ADDC A,R5DA AMOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,AMOV A,R3ADDC A,R3MOV R3,ADJNZ R2,HB3RET;电压显示//////////DIANYA:MOV 72H,R3 ;R3的值是整数位,由数码管的72H显示MOV A,R4 ;R4的高位为小数的地一位,由74H显示ANL A,#0F0HSWAP AMOV 74H,AMOV A,R4 ;R4的低位是小数的第2位,由75H显示ANL A,#0FHMOV 75H,AMOV A,R5 ;R5的高位是小数的第3位,由76H显示ANL A,#0F0HSWAP AMOV 76H,AMOV A,R5 ;R5的地位是小数的第4位,由77H显示ANL A,#0FHMOV 77H,AMOV 70H,#0AH ;70H,71H显示全暗MOV 71H,#0AHMOV 73H,#0BH ;73H显示小数点RET;显示程序///////////////////DISP4:MOV R0,#70H ;显示段码的存放首地址MOV R7,#01H ;显示位码的初始值,1为有效DISP1:MOV A, R7 ;位码送AMOV DPTR,#0DFFFH ;取位码口地址MOVX @DPTR,A ;位码口输出位码MOV A,@R0 ;段码地址送AMOV DPTR,#TAB ;查表获得段码表首地址MOVC A,@A+DPTR ;段码相对地址+段码首地址,获得绝对地址MOV DPTR,#0BFFFH ;取段码地址MOVX @DPTR,A ;段码口输出段码LCALL DL1ms ;1ms延时子程序INC R0 ;指向下一个段码MOV A,R7 ;位码送ARL A ;A左移1位MOV R7,A ;完成处理指向下一个位码CJNE A,#01H,DISP1;如果位码不等于01H即位码有效,则继续执行否则执行RET RETDL1ms:MOV R6,#255 ;延时1msDL8T:NOPNOPDJNZ R6,DL8TRETTAB:DB 5FH,06H,3BH,2FH,66HDB 6DH,7DH,07H,7FH,6FH,00H,80H,20HEND。

数字电压表的单片机设计(C语言编程).

数字电压表的单片机设计(C语言编程).

目录一设计总体方案 (1)1.1 设计要求 (1)1.2 设计思路 (1)1.3 设计方案 (1)二硬件电路元件分析与设计 (2)2.1 单片机系统 (2)2.1.1 AT89C51性能 (2)2.1.2 AT89C51各引脚功能 (2)2.2 A/D转换模块 (3)2.2.1 ADC0808主要特性 (3)2.2.2 ADC0808工作流程 (4)2.3 LED显示系统设计 (5)2.3.1 LED显示器的选择 (5)2.3.2 LED译码方式 (5)2.4 双D正沿触发器 (6)2.5 总体电路设计 (6)三程序设计 (9)3.1 程序设计总方案 (9)3.2 系统子程序设计 (9)3.2.1 初始化程序 (9)3.2.2 A/D转换子程序 (9)3.2.3 显示子程序 (10)四仿真调试 (12)4.1 软件调试 (12)4.2 显示结果及误差分析 (12)4.2.1 显示结果 (12)4.2.2 误差分析 (13)结束 (15)参考文献 (16)附录 (17)一设计总体方案1.1 设计要求⑴以AT89C51单片机为核心器件,组成一个简单的直流数字电压表。

⑵能够测量0-5V之间的直流电压值。

⑶电压显示用4位一体的LED数码管显示,尽量使用较少的元器件。

1.2 设计思路⑴根据设计要求,选择AT89C51单片机为核心控制器件。

⑵A/D转换采用ADC0808实现,与单片机接口为P0口和P3口的高四位引脚。

⑶电压显示采用4位一体的LED数码管。

⑷LED数码的段码输入,由并行端口P1产生:位码输入,用并行端口P2高四位产生。

1.3 设计方案硬件电路设计由5个部分组成; A/D转换电路,AT89C51单片机系统,LED 显示系统、时钟电路、测量电压输入电路。

硬件电路设计框图如图1-1图1-1 数字电压表系统硬件设计框图二硬件电路元件分析与设计2.1 单片机系统2.1.1 AT89C51性能AT89C51功能性能:与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;全静态工作:0-24MHz;128*8B内部RAM;4个位可编程I/O口线;2个16位定时/计数器;5个中断源;2个串行通道;片内振荡器和掉电模式。

51汇编之ADC0809数字电压表

51汇编之ADC0809数字电压表

51汇编之ADC0809数字电压表2009年10月13日星期二 23:29这两天,一个网友用ADC0832采样并PC机处理,一个网友用ADC0809采样显示,都遇到点问题,我给过参考例程也解释过,但是他们在调试上还有问题。

这里把网友沙漠狂风的ADC0809采样显示部分调试好了。

关于ADC0809的资料,这里就不给出了,网上很多。

由于仿真软件里的ADC0809元件有问题,这里用ADC0808代替,它和ADC0809区别很小。

;########################################################;********************************************************;程序名称: ADC0808电压表;主控芯片: 89c51 ,12MHZ,(ADC0808,共阴极数码管);程序编写者:buyixin (不亦心);编写时间: 2009年10月13日 22:24;不亦心的博客:/不亦心/;********************************************************;########################################################OE BIT P3.0 ;ADC0808的OE端EOC BIT P3.1 ;ADC0808的EOC端ST BIT P3.2 ;ADC0808的START和ALE端ADD0 BIT P3.4 ;ADC0808的模拟输入选择端ADD1 BIT P3.5ADD2 BIT P3.6LED_0 DATA 30H ;显示缓冲区LED_1 DATA 31HLED_2 DATA 32HLED_3 DATA 33HADC DATA 34H ;存放转换后的数据;//////主程序开始////////////////////////////////////////ORG 0000HAJMP STARTORG 0030H;------初始化-----------------------------------START: MOV SP,#60H ;设置堆栈MOV LED_0,#00H ;清空显示缓冲区MOV LED_1,#00HMOV LED_2,#00HMOV LED_3,#00HMOV DPTR,#TABLE ;送字型码表首地址SETB ADD0SETB ADD1CLR ADD2 ;选择ADC0808的通道3;------ADC0808转换------------------------------WAIT: CLR STSETB STCLR ST ;启动转换JNB EOC,$ ;等待转换结束SETB OE ;允许输出MOV ADC,P1 ;暂存转换结果CLR OE ;关闭输出;------数据处理,已备显示------------------------MOV A,ADC ;将AD转换结果转换成BCD 码MOV B,#0C3H ;乘以19.5MVMUL ABMOV R7,AMOV R6,BHB2: CLR A ;BCD码初始化CLR CMOV R3,AMOV R4,AMOV R5,AMOV R2,#10H ;转换双字节十六进制整数HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R5 ;BCD码带进位自身相加,相当于乘2ADDC A,R5DA A ;十进制调整MOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,AMOV A,R3ADDC A,R3MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整DJNZ R2,HB3MOV A,R5SWAP AANL A,#0FHMOV LED_0,AMOV A,R4ANL A,#0FHMOV LED_1,AMOV A,R4SWAP AANL A,#0FHMOV LED_2,AMOV A,R3ANL A,#0FHMOV LED_3,ALCALL DISP ;调用显示子程序AJMP WAIT;//////数码管显示子程序///////////////////////////////////////////////DISP: MOV A,LED_0 ;数码显示子程序MOVC A,@A+DPTRCLR P2.3MOV P0,ALCALL DELAYSETB P2.3MOV A,LED_1MOVC A,@A+DPTRCLR P2.2MOV P0,ALCALL DELAYSETB P2.2MOV A,LED_2MOVC A,@A+DPTRCLR P2.1MOV P0,ALCALL DELAYSETB P2.1MOV A,LED_3MOVC A,@A+DPTRCLR P2.0MOV P0,ASETB P0.7LCALL DELAYSETB P2.0RET;//////延时子程序////////////////////////////////////DELAY: MOV R6,#0AH ;延时5毫秒D1: MOV R7,#0FAHDJNZ R7,$DJNZ R6,D1RET;//////数码管字形码表/////////////////////////////////TABLE: DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FH;/////程序结束////////////////////////////////////////END硬件部分:仿真的时候,ADC0808时钟端,我直接加的500KHZ的方波,实际中一般有单片机的ALE 端取时钟信号。

通过制作数字电压表学习单片机C语言编程

通过制作数字电压表学习单片机C语言编程

P3—5=O;
P3-5=1; P1=OxFF:
whne(P3—7);
胂龟测ADc是否转换完毕
研始读
P3-4=O;
adc=Pl:
P3—3=1;
,/使ADc0804无效
decode(adc);懈码
display(); 1 ) 结束语 程序使用Keil软件编写的。Keil软件是目 前最流行开发80c5 l系列单片机的软件,Keil提 供了包括c编译器、宏汇编、连接器、库管理和一 个功能强大的仿真调试器等在内的完整开发方 案,通过一个集成开发环境(肛Vi (下转33l页)
图1数字电压表系统框图 采用AT89c205l单片机来进行2一10进制 转换,对BcD进行查表译码以及控制LED显示。 实验利用AT89c2051系列单片机,通过P3_0、 P_1、P-2三个管脚实现对三个七段数码管的使能 控制,保证了数码管的分时响应。有Pl的七个管 脚控制数码管显示数字。显示采用3位七段数码 管(共阴),它可以直接与AT89C2051单片机Pl 口的输出相连,构成—个三位的数码显示,并且本 系统先显示睢9的数字,然后兜8最后显示所测 电压值。 3 A巾转换电路 采用AT89c2051单片机来进行2—10进制 转换,对BcD进行查表译码以及控制LED显示。 具体电路如下:
2.2.3综合考虑采光、通风,控制最大窗墙面
积比。外门窗是建筑能耗散失的最薄弱部位,其 能耗占住宅总能耗的比例较大,其中传热损失为 1,3,冷风渗透为l/3,所以在保证日照、采光、通 风、观景要求的条件下,尽量减小外门窗洞口的 面积,提高外门窗的气密性,减少冷风渗透,提高 外门窗本身的保温l生能,减少外门窗本身的传热 量。
图2 A/D转换电路 4单片机十进制转换模块电路
实验利用AT89c2051系列单片机,通过 P3.o、P-l、P_2三个管脚实现对三个七个数码管 的使能控制,保证了数码管的分时响应。有P1的 七个管脚控制数码管显示数字。其图如下

基于ADC0808的数字电压表汇编语言_完整版

基于ADC0808的数字电压表汇编语言_完整版
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
REF(+)、REF(-):基准电压。
管脚说明:
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
3)相关芯片
(1)AT89C51
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable andErasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
3.外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装。下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
(2)查询方式
A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。

单片机课程设计(直流数字电压表)

单片机课程设计(直流数字电压表)

课程设计总结与展 望
课程设计目标:掌握单片机基础知识,学会设计直流数字电压表 课程设计内容:包括硬件设计、软件设计、调试和测试等 课程设计成果:成功设计并制作出直流数字电压表 课程设计收获:提高了单片机应用能力,增强了团队合作和沟通能力
课程设计展望:未来将继续深入学习单片机技术,提高实践能力,为未来就业做好准备
实际应用:可用于测量直流电压,广泛应用于电子、电力等领域 市场前景:随着电子技术的发展,市场需求不断增长 技术更新:需要不断更新技术,提高测量精度和稳定性 市场竞争:面临国内外竞争对手的压力,需要提高产品质量和降低成本
智能化:单片机技术在智能设备中的应用越来越广泛,未来发展方向将更加智能化。
物联网:单片机技术在物联网中的应用越来越广泛,未来发展方向将更加注重物联网技术的应用。
单片机课程设计(直 流数字电压表)
汇报人:
目录
添加目录标题
单片机课程设计概 述
硬件电路设计
软件程序设计
系统调试与测试
课程设计总结与展 望
添加章节标题
单片机课程设计概 述
掌握单片机的基本原理和编程方法 提高动手实践能力和创新能力 培养团队合作精神和解决问题的能力 为未来的学习和工作打下坚实的基础
电源测试:检查电源电压是 否稳定,是否符合要求
信号测试:检查信号输入、 输出是否正常,是否符合要 求
功能测试:检查系统功能是 否正常,是否符合设计要求
性能测试:检查系统性能是 否满足设计要求,如响应时 间、精度等
稳定性测试:检查系统在 长时间运行下的稳定性, 如温度、湿度等环境因素 对系统的影响
软件调试:通过运行程序,发现并修复程序中的错误 软件测试:通过测试程序,验证程序的功能和性能是否符合预期 测试方法:包括单元测试、集成测试、系统测试等 测试工具:可以使用自动化测试工具,如JUnit、Selenium等

数字电压表实验报告

数字电压表实验报告

实验五电压表实验1.设计过程:按照“建立项目文件”--“新建VHDL源文件”--“配置管脚”--“编译下载”--“芯片测试”的顺序。

原理图:1.FPGA的系统时钟来自于小脚丫FPGA开发板配置的24MHz时钟晶振,连接FPGA的C1引脚。

2.实验借助FPGA底板自带的ADC模块,具体信息如下:ADC模块的功能时实现模拟信号转换数字信号,主要包含P1(测试点)、Radj1(10K的可调电位器)和U3(8位串行模数转换器ADC081S)。

在不外接其他信号的情况下,旋转电位计,ADC081S的输入电压在0到3.3V之间变化,通过模数转换实现ADC的采样,原理图连接如图所示:3.实验思路如下:1.根据ADC模块的时序图,完成将ADC模块和FPGA引脚连接起来。

时序图如下:2. 根据程序的框图把完整的程序写出来,显示模块和译码模块利用以前写过的进行例化使用。

以下是程序的框图:VHDL 汇编语言如下: 2.总代码: library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;entity dianyabiao is port( clk: in std_logic;--定义输入和输出 sda: in std_logic; sclk: buffer std_logic; cs: out std_logic; sdata: out std_logic; sck: out std_logic; rck: out std_logic );end dianyabiao;architecture one of dianyabiao is component led_573 --例化port( rst: in std_logic; clk_t_in : in std_logic; sdata: out std_logic; H: in std_logic; ledcode1,ledcode2,ledcode3,ledcode4: in std_logic_vector(6 downto 0); dot: in std_logic_vector(3 downto 0);sda sck cssck: out std_logic;rck: out std_logic);end component;component seg7coderport(data_in: in integer range 0 to 15;seg7_out: out std_logic_vector(6 downto 0));end component;signal ad_phase: integer range 0 to 19;signal clk_t_in: std_logic;signal ad_clk: std_logic;signal ad_out:std_logic_vector(7 downto 0);signal ad:std_logic_vector(7 downto 0);signal data_in1:integer range 0 to 15;signal data_in2:integer range 0 to 15;signal seg1,seg2: std_logic_vector(6 downto 0); --七段码beginu1:seg7coderport map(data_in => data_in1,seg7_out => seg1);u2:seg7coderport map(data_in => data_in2,seg7_out => seg2);u3:led_573port map(rst=>'1',clk_t_in => clk,H => '1',dot => "0000",ledcode1 => seg1,ledcode2 => seg2,ledcode3 =>"1111110",ledcode4 =>"1111110",sdata => sdata,sck => sck,rck => rck);--得到分频时钟,50-20000khz的分频process(clk)variable divcnt: integer range 0 to 1000;beginif clk'event and clk='1' thenif divcnt=1000 thendivcnt:=0;clk_t_in<=not clk_t_in;elsedivcnt:=divcnt+1;clk_t_in<=clk_t_in;end if;end if;end process;--ad模快process(clk_t_in)-- ad_clk<=clk_t_in;beginif clk_t_in'event and clk_t_in = '1' thensclk<=not sclk;if sclk='1' thenif ad_phase = 19 thenad_phase<=0;elsead_phase<=ad_phase+1;end if;end if;if sclk='0' and ad_phase>16 then --保证cs的值cs<='1';elsecs<='0';end if;if ad_phase=3 and sclk='0' then --值的输出ad(7)<=sda;end if;if ad_phase=4 and sclk='0' thenad(6)<=sda;end if;if ad_phase=5 and sclk='0' thenad(5)<=sda;end if;if ad_phase=6 and sclk='0' thenad(4)<=sda;end if;if ad_phase=7 and sclk='0' thenad(3)<=sda;end if;if ad_phase=8 and sclk='0' thenad(2)<=sda;end if;if ad_phase=9 and sclk='0' thenad(1)<=sda;end if;if ad_phase=10 and sclk='0' thenad(0)<=sda;end if;if ad_phase=11 and sclk='0' thenad_out<=ad;end if;end if;end process;process(ad_out) --完成将ad_out的八位输出转化成两位16进制的数begincase ad_out(3 downto 0) is--when "0000"=>data_in1<=0;when "0001"=>data_in1<=1;when "0010"=>data_in1<=2;when "0011"=>data_in1<=3;when "0100"=>data_in1<=4;when "0101"=>data_in1<=5;when "0110"=>data_in1<=6;when "0111"=>data_in1<=7; when "1000"=>data_in1<=8; when "1001"=>data_in1<=9; when "1010"=>data_in1<=10; when "1011"=>data_in1<=11; when "1100"=>data_in1<=12; when "1101"=>data_in1<=13; when "1110"=>data_in1<=14; when "1111"=>data_in1<=15; end case;case ad_out(7 downto 4) is when "0000"=>data_in2<=0; when "0001"=>data_in2<=1; when "0010"=>data_in2<=2; when "0011"=>data_in2<=3; when "0100"=>data_in2<=4; when "0101"=>data_in2<=5; when "0110"=>data_in2<=6; when "0111"=>data_in2<=7; when "1000"=>data_in2<=8; when "1001"=>data_in2<=9; when "1010"=>data_in2<=10; when "1011"=>data_in2<=11; when "1100"=>data_in2<=12; when "1101"=>data_in2<=13; when "1110"=>data_in2<=14; when "1111"=>data_in2<=15; end case;end process;end architecture;3.管脚分配:4.实验现象:旋转电压旋钮,电压从00变化到FF,现象如下面所示:。

基于8086的数字电压表、与秒表的设计

基于8086的数字电压表、与秒表的设计
办法:在确认电路没有连错的情况下,对程序进行了修改,再进行测试的时候,秒表能够正常跳动。
(2)问题:当对秒表进行分显示的时候,通过修改线路不能完成这个任务。
办法:在程序AA3的位置增加一段显示分的程序,通过测试后,能成功运行。
7、收获与建议
刚开始接触这个课程设计,觉得自己什么都不懂,之前上的理论课里面讲的一些理论知识也没有好好掌握,觉得自己肯定做不好这个课设。但是,课设来了,还是要硬着头皮去做,开始自己按照电路图搭线,翻书看程序的功能,看各个器件的工作原理。并试着去写一小段汇编程序。
SSTACKSEGMENTSTACK
4、硬件系统设计
因采用了PC机和微机实验箱,硬件电路设计相对比较简单,主要利用微机实验箱上的8255并行口、ADC 0809、七段LED数码管单元、8254定时/计数器、电位器等单元电路,就构成了数字电压表和数字秒表,硬件电原理框图1-1所示。
图1-1电路原理框图
(1)根据课设内容的要求,设计完成该任务的所需硬件系统框图;
ALEST:MOVDX,ADC0809;选择通道,启动转换
OUTDX,AL
EOC:MOVDX,C8255;检测EOC状态,判断转换是否结束
INAL,DX
TEST AL,00110000B
JZEOC
MOVDX,ADADC0809;转换结束,取AD转换结果
INAL,DX
;-------------------------------------------------------------
;HLXKSJC3.ASM
;-------------------------------------------------------------
A8255EQU0600H;8255端口地址:PA0~PA7-->LED.D0-D7

单片机数字电压表设计LED显示含C源代码

单片机数字电压表设计LED显示含C源代码

1. 绪论............................... 错误!未定义书签。

1.1 课程设计规定...................... 错误!未定义书签。

1.2 数字电压表简介.................... 错误!未定义书签。

2. 硬件单元电路设计................... 错误!未定义书签。

2.1数字电压表构造框图................. 错误!未定义书签。

2.1.1 AT89C51单片机简介............ 错误!未定义书签。

2.1.2 ADC0832转换器简介............ 错误!未定义书签。

2.1.3 时钟电路..................... 错误!未定义书签。

2.1.4 复位电路..................... 错误!未定义书签。

2.1.5 LED显示电路.................. 错误!未定义书签。

3. 软件单元电路设计................... 错误!未定义书签。

3.1 主程序流程图...................... 错误!未定义书签。

3.2显示子程序流程图................... 错误!未定义书签。

3.3 A/D转换子程序流程图............... 错误!未定义书签。

3.4 数据解决子程序流程图.............. 错误!未定义书签。

4. 数字电压表仿真设计图与实物图....... 错误!未定义书签。

4.1 仿真图............................ 错误!未定义书签。

4.2 器件清单.......................... 错误!未定义书签。

4.3 硬件电路实物图.................... 错误!未定义书签。

5. 程序代码.............................. 错误!未定义书签。

51单片机数字电压表汇编程序

51单片机数字电压表汇编程序

ORG 0000HLJMP STARTORG 0030H;初始化参数START: CLR ASETB P3.7 ;初始化EOCCLR P3.0 ;初始化LED位选,全不选中。

CLR P3.1CLR P3.2MOV P2,A ;初始化P2口,清除对ADC0809的控制信号。

MOV 70H,A ;初始化数据采样后存储空间。

MOV 78H,A ;初始化数据处理后3位有效数字的存储空间(78H最高位,7AH 最低位)。

MOV 79H,AMOV 7AH,AMOV A,#0FFH ;初始化P0,P1口,写入高电平。

MOV P0,AMOV P1,A;主程序MAIN: LCALL AD_SUB ;调用A/D转换子程序,开始采样并转换。

LCALL TURN_SUB ;调用数码转换子程序,将采样转换来的0-255转换成一一对应的;0.00-5.00LCALL DISP_SUB ;调用显示子程序。

LJMP MAIN;================================================================== ==;A/D转换子程序AD_SUB: CLR AMOV P2,A ;初始化P2口,清除对ADC0809的控制信号。

MOV R0,#70HLCALL AD_ST ;调用采样转换子程序WAIT: JB P3.7,DATASAVE ;判断采样转换是否完毕,完毕则跳转到DATASAVE 进行存储。

AJMP WAIT ;否则继续等待。

;启动采样,送脉冲时序AD_ST: SETB P2.3 ;ALE 脉冲时序NOPNOPCLR P2.3SETB P2.4 ;START 脉冲时序(上跳清零,下跳开始转换) NOPNOPCLR P2.4NOPNOPRET;采样转换的数据存储DATASAVE: SETB P2.5 ;置位OE端,允许ADC0809输出数据MOV A,P0 ;将转换的数据存储到70H中MOV @R0,ACLR P2.5CLR A ;初始化P0,P1,P2口(P0,P1高电平,P2低电平) MOV P2,AMOV A,#0FFHMOV P0,AMOV P1,ARET;将0~255转换为0.00~5.00TURN_SUB: MOV A,@R0MOV B,#51DIV A BMOV 78H,A ;以上这一段是整数部分(个位)放入78H MOV A,B ;余数部分放入ACLR F0SUBB A,#1AH ;余数和51的一半即1AH比较,以便四舍五入MOV F0,CMOV A,#10MUL AB ;余数乘以10,以便再除以51MOV B,#51DIV A BJB F0,LOOP1 ;判断四舍五入,跳到LOOP1是"四舍" ADD A,#5 ;这是"五入"LOOP1: MOV 79H,A ;十分位MOV A,BCLR F0SUBB A,#1AHMOV F0,CMOV A,#10MUL ABMOV B,#51DIV A BJB F0,LOOP2ADD A,#5LOOP2: MOV 7AH,A ;百分位RET;================================================================== ==;显示子程序DISP_SUB: MOV R1,#78H ;R1辅助寄存器,用于存放要显示的数据的地址(初始为最高位78H)CLR AMOV P1,#0FFH ;初始化P1,P2口(P1高电平,P2低电平)ANL P2,ALCALL PLAY ;调用显示位码子程序CLR P1.7 ;显示最高位(个位)后的小数点SETB P3.0 ;选中最高位LED数码管LCALL DELAY ;调用延迟子程序CLR P3.0 ;取消最高位位选INC R1 ;提取第二位有效数字(十分位)的数据地址(79H)LCALL PLAY ;调用显示位码子程序SETB P3.1 ;选中第二位LED数码管LCALL DELAY ;调用延迟子程序CLR P3.1 ;取消第二位位选INC R1 ;提取最低位(百分位)的数据地址(7AH)LCALL PLAY ;调用显示位码子程序SETB P3.2 ;选中最低位LED数码管LCALL DELAY ;调用延迟子程序CLR P3.2 ;取消最低位位选RET;位码显示PLAY: MOV A,@R1 ;送偏移量MOV DPTR,#TAB ;送表首地址MOVC A,@A+DPTR ;查表得出相应LED段码MOV P1,A ;输出显示RET;================================================================== ==;延时程序DELAY: MOV R6,#10HDL1: MOV R7,#10HDL2: DJNZ R7,DL2DJNZ R6,DL1RET;================================================================== ==;0-9段码TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND。

数字电压表程序

数字电压表程序
P1=tmp;
Delay();
P2_0=1;
if(counter<50)
{
P2_1=0;
tmp=Xue_Hao[4];
P1=tmp;
Delay();
P2_1=1;
}
else
{
P2_1=0;
tmp=Xue_Hao[1];
P1=tmp;
Delay();
P2_1=1;
}
P2_2=0;
tmp=Xue_Hao[2];
P2_0=1;
P2_1=0;
temp=temp%256;
temp=temp*10;
P1=Zheng_Shu[temp/256];
Delay();
P2_1=1;
P2_2=0;
temp=temp%256;
temp=temp*10;
P1=Zheng_Shu[temp/256];
Delay();
P2_2=1;
uchar Zheng_Shu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Xiao_Shu_Dian[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
sbit P2_0=P2^0;
counter++;
}
void main()
{
uchar tmp;
TMOD=0x01;
TH0=(65536-30000)/256;
TL0=(65536-30000)%256;
TR0=1;
EA=1;
ET0=1;
while(1)
{

数字电压表汇编程序(完整)

数字电压表汇编程序(完整)

ORG 0000HSJMP MAINORG 0003HLJMP INTVMAIN:MOV 50H,#19HMOV 54H,#78HMOV DPTR,#7FF8HMOV 51H,DPHMOV 52H,DPLMOV TMOD,#02HMOV R0,#04HMOV 53H,#00HMOV R7,#00HSETB EASETB IT0SETB EX0L4: MOV R1,#00H ;R1存放十六进制转换成十进制后的低两位MOV R2,#00H ;R2存放十六进制转换成十进制后的高两位MOV R3,#0FFH ;循环显示十进制数MOV R4,#00H ;存放A/D转换后的十六进制数MOV R5,#00H ;存放0.5相加后的数MOVX @DPTR,A ;开始A/D转换LCALL DELAY ;调用延时大于A/D转换的时间MOVX A,@DPTR ;取A/D转换后的十六进制数INC DPTR ;A/D转换芯片的地址加一PUSH DPL ;压入堆栈PUSH DPHDEC R0 ;8路转换的次数减一JZ SB2 ;判断是否是0MOV R4,AL1:MOV A,R1 ;进行十六进制到十进制的调整ADD A,50H ;每次加19DA AMOV R1,AJC L2 ;如果溢出则跳转到L2MOV A,R5 ;进行0.5V相加ADD A,54HDA AMOV R5,AJC L3 ;如果溢出则跳转到L3SB1:DJNZ R4,L1 ;判断十六进制数是否转换完成,如果没有则循环MOV A,R5SW AP AMOV B,R1ADD A,BDA AMOV R1,ASB2:LCALL DISPLCALL DJWDJNZ R3,SB2POP DPHPOP DPLMOV A,53HINC AMOV 53H,ACJNE R0,#00H,L4LJMP MAINL2: CLR CMOV A,R2ADD A,#01HDA AMOV R2,ALJMP SB1L3: CLR C ;0.5V相加溢出后进位MOV A,R1ADD A,#01HDA AMOV R1,ALJMP SB1DISP:MOV A,R1 ;显示电压子程序SW AP AANL A,#0FHMOV DPTR,#TAB1MOVC A,@A+DPTRCLR P3.0MOV P1,ALCALL DELAYSETB P3.0MOV A,R2ANL A,#0FHMOV DPTR,#TAB1MOVC A,@A+DPTRCLR P3.1MOV P1,ALCALL DELAYSETB P3.1SW AP AANL A,#0FHMOV DPTR,#TAB2MOVC A,@A+DPTRCLR P3.4MOV P1,ALCALL DELAYSETB P3.4RETDJW:MOV A,53H ;显示第几路转换电压子程序MOV DPTR,#TAB1MOVC A,@A+DPTRCLR P3.5MOV P1,ALCALL DELAYSETB P3.5RETINTV: PUSH ACC ;只显示其中一路中断PUSH 53HMOV 53H,#00HCX2: MOV R1,#00HMOV R2,#00HMOV R3,#0FFHMOV R4,#00HMOV DPH,51HMOV DPL,52HMOVX @DPTR,ALCALL DELAYMOVX A,@DPTRMOV R4,AJZ SB22L11: MOV A,R1ADD A,50HDA AMOV R1,AJC L22MOV A,R5 ;进行0.5V相加ADD A,54HDA AMOV R5,AJC L33SB11:DJNZ R4,L11MOV A,R5ANL A,#0FHMOV B,R1ADD A,BDA AMOV R1,ASB22:LCALL DISPLCALL DJWJNB P3.3,EXITDJNZ R3,SB22JNB P3.2,CX1LJMP CX2L22:CLR CMOV A,R2ADD A,#01HDA AMOV R2,ALJMP SB11L33:CLR CMOV A,R1ADD A,#01HDA AMOV R1,ALJMP SB11CX1:INC R7MOV A,53HINC AMOV 53H,AMOV DPH,51HMOV DPL,52HINC DPTRMOV 51H,DPHMOV 52H,DPLCJNE R7,#04H,CX2MOV R7,#00HMOV 53H,#00HMOV DPTR,#7FF8HMOV 51H,DPHMOV 52H,DPLLJMP CX2EXIT:POP 53HPOP ACCRETIDELAY:MOV R6,#1H ;延时子程序D1:MOV R5,#50HD2:NOPDJNZ R5,D2DJNZ R6,D1RETTAB1:DB 3FH,06H,5BH,4FH,66H ;码表DB 6DH,7DH,07H,7FH,6FHTAB2:DB 0BFH,86H,0DBH,0CFH,0E6H ;小数点的段码表DB 0EDH,0FDH,87H,0FFH,0EFHEND。

数字电压表程序及仿真图

数字电压表程序及仿真图

//************************************************//**用adc0809进行电压测量,lcd1602显示,精度0.001v**//************************************************#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intuchar code table []="ID: " ; //欢迎显示,包括空格在内<=16 uchar code table1 []="Name: " ;//欢迎显示,包括空格在内<=16//************管脚定义************************sbit ADC_OE = P3^0; //ADC输入允许信号端口sbit ADC_EOC = P3^1; //ADC转换结束信号输出端sbit ADC_START= P3^2; //ADC启动转换信号输入端sbit ADC_CLK = P3^3; //ADC时钟输入端sbit lcd_rs = P3^4; //液晶数据命令选择端sbit lcd_en = P3^5; //液晶使能//************参数定义************************uchar num; //LCD1602开机显示数组数uchar AD_data; //AD转换原始数据uchar dis1[] = " Current Voltage";uchar dis2[] = {' ',' ',' ',' ','V','=','0','.','0','0','0','v',' ',' ',' ',' ',}; //初始化数组,用来保存电压显示//************子函数定义************************void delay(uchar z); //delay延时子程序void init_lcd(); //LCD1602初始化函数void InitTimer0(); //定时器0初始化函数void write_com(uchar com); //LCD1602写指令函数void write_data(uchar date); //LCD1602写数据函数void write_welcome(); //LCD1602开启显示欢迎函数void init_ADC(); //ADC初始化函数void AD_covert(); //AD转换子程序void ADC_change(); //ADC转换函数void write_adc(); //ADC显示函数//************主函数************************void main(){init_lcd(); //LCD1602初始化write_welcome(); //LCD1602开启显示欢迎InitTimer0(); //定时器0初始化init_lcd(); //LCD1602初始化init_ADC(); //ADC初始化while(1){AD_covert(); //AD转换ADC_change(); //ADC转换函数write_adc(); //ADC显示}}//************delay延时子程序************************void delay(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<114;y++);}//************LCD1602初始化函数************************void init_lcd(){lcd_en = 0; // 将使能端置0write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x08); //写一个字符后地址指针加1write_com(0x01); //显示清零,数据指针清零write_com(0x06); //写一个字符后地址指针加1write_com(0x0c); //关显示,光标不显示不闪烁}//************定时器0初始化函数************************void InitTimer0(){TMOD = 0x02; //定时器0工作方式2TH0 = 0x14; //初值位20TL0 = 0x14;EA = 1; //开总中断ET0 = 1; //允许T0中断TR0 = 1; //启动T0}//************LCD1602写指令函数************************void write_com(uchar com){lcd_rs = 0; // 选择写指令P2 = com; // 将要写的命令送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602写数据函数************************void write_data(uchar date){lcd_rs = 1; // 选择写数据P2 = date; // 将要写的数据送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602开启显示欢迎函数******************void write_welcome(){write_com(0x80); // 现将数据指针定位到第一行第一个字处for(num=0;num<16;num++) //做简短延时{write_data(table[num]);delay(5);}write_com(0x80+0x40); // 现将数据指针定位到第二行第一个字处for(num=0;num<16;num++) //做简短延时{write_data(table1[num]);delay(20);}delay(50000);}//************中断函数************************void Timer0()interrupt 1{ADC_CLK = ~ADC_CLK; //时钟不断取反}//***********ADC初始化函数************************void init_ADC(){ADC_OE = 0; //ADC输入允许信号端口置1ADC_EOC = 1; //ADC转换结束信号输出端置1ADC_START= 1; //ADC启动转换信号输入端置1ADC_CLK = 1; //ADC时钟输入端置1}//***********AD转换子程序***********************void AD_covert(){ADC_START= 0;ADC_CLK = 0;_nop_(); //延时空循环,一个机器指令的时间ADC_START= 1;ADC_CLK = 1;_nop_(); //延时空循环,一个机器指令的时间ADC_START= 0;ADC_CLK = 0; //在START上产生一个正脉冲while(ADC_EOC); //等待上次转换完成_nop_();delay(100);while(ADC_EOC == 0){ADC_CLK = 1;delay(1);ADC_CLK = 0;delay(1);}P1 = 0xff;_nop_();ADC_OE = 1;_nop_();AD_data = P1;ADC_OE = 0;}//***********ADC转换函数************************void ADC_change(){double v;uchar val_integer;uint val_decimal;v = AD_data*0.0196078; //5v时输出的数字量是2.55,为使5v时输出5.00 val_integer = (uchar)v; //电压整数部分val_decimal = (uint)((v-val_integer)*1000);//将电压小数点后三位转换为整数(dis2[6]) = val_integer+0x30; //电压整数转换为ASSII(dis2[8]) = val_decimal/100+0x30; //电压小数第一位转换为ASSII(dis2[9]) = val_decimal/10%10+0x30; //电压小数第二位转换为ASSII(dis2[10]) = val_decimal/10%10+0x30; //电压小数第三位转换为ASSII}//************LCD1602显示adc函数******************void write_adc(){write_com(0x80); // 现将数据指针定位到第一行第一个字处for(num=0;num<16;num++)//做简短延时{write_data(dis1[num]);delay(1);}write_com(0x80+0x40); // 现将数据指针定位到第二行第一个字处for(num=0;num<16;num++)//做简短延时{write_data(dis2[num]);delay(1);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

$NOMOD51
;------------------------------------------------------------------------------
; This file is part of the C51 Compiler package
; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
;------------------------------------------------------------------------------
; 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 <your object file list>, STARTUP.OBJ <controls>
;
;------------------------------------------------------------------------------
;
; 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.
;
XDATASTART EQU 0H ; the absolute start-address of XDATA memory 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。

相关文档
最新文档