数字电压表汇编语言

合集下载

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个串行通道;片内振荡器和掉电模式。

  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。

相关文档
最新文档