第一篇:电压表主程序模块
/**电压表主程序模块*/
#include
#define uchar unsigned char #define uint unsigned int void result(uchar);uchar value=0;#include“adc0809.h” #include“lcd1602.h” uchar str[5];uchar volt[7];
uchar a=0+0x30;uchar str1[11]=“tanxiaopin”;sbit CLK=P0^7;uint n;
void main(){
//uint i;ADC0809_init();lcd_init();while(1){
lcd_zifu(str1,0x01);
value=AD();//原值
str[0]=value/100+0x30;
str[1]=value%100/10+0x30;
str[2]=value%10+0x30;
result(value);
lcd_data(str,0x40);
lcd_data(volt,0x46);
} while(1);}
void result(uchar v)//转换成电压值 { float a;a=(v/255.0)*500.0;volt[0]=((int)a)/100+0x30;volt[1]='.';volt[2]=((int)a)%100/10+0x30;volt[3]=((int)a)%10+0x30;volt[4]=' ';volt[5]='V';} void t1(void)interrupt 3
{
CLK=~CLK;
}
/*ADC0809程序模块*/
#include
sbit ST=P0^4;sbit EOC=P0^5;sbit OE=P0^6;//sbit CLK=P0^7;sbit ADDA=P0^0;sbit ADDB=P0^1;sbit ADDC=P0^2;
sbit ALE=P0^3;
uchar v;//保存IN0和经AD转换后的数据 /*非精确演示函数*/ void delay(ms){ uint i,j;
for(i=ms;i>0;i--)
for(j=125;j>0;j--);}
void ADC0809_init(){ TMOD=0x20;TH1=(255-250);TL1=(255-250);EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//启动定时器1
ST=0;
OE=0;ALE=0;} /*用中断做一个500K HZ的时钟信号*/
/******AD转换函数*******/ uchar AD(){ uchar temp=0;ST=0;//EOC=1;// ALE=1;ADDA=0;ADDB=0;ADDC=0;
delay(1);// ALE=0;
//OE=0;
ST=0;
ALE=1;
ST=1;
ALE=0;
ST=0;
delay(2);
while(EOC==0);
OE=1;
temp=P2;
delay(2);
OE=0;
return temp;}
/*ADC0809 模块封装头文件*/ void ADC0809_init();uchar AD();
/*LCD1602液晶显示模块*/ #include
void lcd_1602(uchar comm);void lcd_write(uchar dat);
bit lcd_busy();sbit busy=P3^7;extern void delay(uint);
/***************************** 1602液晶写命令函数 参数: 返回值:无
******************************/ void lcd_1602(uchar comm){ while(lcd_busy());//查忙
rs = 0;rw = 0;en = 0;
_nop_();P3 = comm;_nop_();en = 1;_nop_();_nop_();en = 0;} /***************************** 1602液晶写数据函数 参数: 返回值:无
******************************/ void lcd_write(uchar dat){ while(lcd_busy());//查忙
rs = 1;
rw = 0;
en = 0;
_nop_();
P3 = dat;
_nop_();
_nop_();
en = 1;
_nop_();
_nop_();
en = 0;}
/***************************** 1602液晶初始化函数 参数:无 返回值:无
******************************/ void lcd_init(){
delay(15);lcd_1602(0x38);delay(3);lcd_1602(0x38);
delay(3);lcd_1602(0x38);delay(3);lcd_1602(0x08);lcd_1602(0x01);delay(3);lcd_1602(0x06);lcd_1602(0x0c);} /***************************** 1602液晶读忙标志 参数:无 返回值:无
******************************/ bit lcd_busy(){
bit result;rs = 0;rw = 1;en = 1;delay(2);result = busy;en = 0;return result;}
/***************************** 1602液晶写字符 参数: 返回值:无
******************************/ void lcd_zifu(uchar *p,uchar wei){ uchar temp;lcd_1602(0x80+wei);/*temp= *p;while(temp!=' '){
lcd_write(temp);
p++;
temp=*p;}*/ for(temp=*p;temp!=' ';p++,temp=*p)
lcd_write(temp);
delay(10);}
void lcd_data(uchar *p,uchar wei){ uchar temp;lcd_1602(0x80+wei);for(temp=*p;temp!=' ';p++,temp=*p)
lcd_write(temp);delay(10);} /*LCD1602液晶模块封装*/ void lcd_init();void lcd_zifu(uchar *p,uchar wei);void lcd_data(uchar *p,uchar wei);
第二篇:单片机主程序流程
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
单片机主程序流程
单片机教程 栏目导航
第一页..单片机入门教程
第二页..单片机c语言
第三页..红外遥控和步进电机
第四页..单片机问答
3.主程序流程图---51系列单片机设计实例教程
主程序流程图如图6.2所示。
图6.2 主程序流程图
本控制器在使用中,如要改变闪烁的方式,可按下相应的功能按键。当一个完整的闪烁循环结束后,即可转入新的闪烁方式。由于键扫描是在闪烁循环结束时进行,因此,功能开关按下的时间应较长才能被读入。改进的方法是把DL05S延时子程序用键扫描子程序来替代,这样,只要按下按键即可被键扫描程序读入。以下是LED小灯闪烁控制器的完整源程序:
;* * * * * * * * * * * *;;
小灯控制程序;
;* * * * * * * * * * * *;
;
;* * * * * * * * * * * *;;
中断入口程序
;
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
;* * * * * * * * * * * *;
;
ORG
OOOOH;程序执行开始地址
LJMP START;跳至START执行
ORG
OOO3H;外中断0中断入口地址
RETI;
中断返回(不开中断)
ORG
OOOBH;定时器TO中断入口地址
RETI;
中断返回(不开中断)
ORG
OO13H;外中断1中断入口地址
RETI;
中断返回(不开中断)
ORG 001BH;定时器T1中断入口地址
RETI;
中断返回(不开中断)
ORG 0023H;串行口中断入口地址
RETI;
中断返回(不开中断)
;
;* * * * * * * * * * * *;;
初始化程序;
;* * * * * * * * * * * *;
;
CLEAR: MOV
20H,#00H;20H单元内存清0(闪烁标志清0)
SETB
00H;
20H.0位置1(上电时,自动执行闪烁功能1)
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
RET;
子程序返回 ;
;* * * * * * * * * * * *;;
主程序
;
;* * * * * * * * * * * *;
;
START:
ACALL CLEAR;
调用初始化子程序
MAIN:
LCALL KEYWORK;
调用键扫描子程序
JB
OOH,FUNO;20H.0位为1时执行FUNO
JB
01H,FUN1;20H.1位为1时执行FUN1
JB
02H,FUN2;20H.2位为1时执行FUN2
JB
03H,MAIN;备用
AJMP
MAIN;
返回主程序MAIN ;
;* * * * * * * * * * * *;;
功能程序
;
;* * * * * * * * * * * *;
;第1种闪烁功能程序
FUNO:
MOV
A,OFEH;
累加器赋初值 FUNOO:
MOV
P1,A;
累加器值送至P1口
LCALL DL05S;
延时
JNB
ACC.7.MAIN;累加器最高位为0时转MAIN
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
RL
A;
累加器A中数据循环左移1位
AJMP
FUNOO;
转FUNOO循环 ;
;第2种闪烁功能程序
FUN1:
MOV
A,#OFEH;
累加器赋初值
FUN11:
MOV
P1,A;
累加器值送至P1口
LCALL DLO5S;
延时
CPL
A;
A中各位取反
MOV
P1,A;
累加器值送至P1口
LCALL DL05S;
延时
AJMP MAIN;
转MAIN ;* * * * * * * * * * * *;;
扫键程序
;
;* * * * * * * * * * * *;
;
KEYWORK:MOV
P3#OFFH;
置P3口为输入状态
JNB
P3.0,KEYO;读P3.0口,若为0转KEYO
JNB
P3.1,KEY1;读P3.1口,若为0转KEY1
JNB
P3.2,KEY2;读P3.2口,若为0转KEY2
JNB
P3.3,KEY3;读P3.3口,若为0转KEY3
RET;
子程序返回 ;
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
;闪烁功能0键处理程序
KEYO:
LCALL
DL10MS;
延时10ms消抖
JB
P3.0,OUTO;P3.0为1,子程序返回(干扰)
SETB
OOH;
20H.0位置1(执行闪烁功能1标志)
CLR
01H;
20H.1位清0
CLR
02H;
20H.2位清0 OUTO:
RET;
子程序返回 ;
;闪烁功能1键处理程序
KEY1:
LCALL
PL10MS
JB
P3.1,OUT1
SETB
01H;
20H.1位置1(执行闪烁功能2标志)
CLR
00H
CLR
02H
CLR
03H OUT2:
RET ;
;闪烁功能(备用)键处理程序
KEY3:
LCALL
DL10MS
JB
P3.2,OUT2
SETB
02H;
20H.2位置1(执行闪烁功能3标志)
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
CLR
01H
CLR
00H
CLR
03H OUT2:
RET ;
;闪烁功能(备用)键处理程序
KEY3:
LCALL
DL10MS
JB
P3.3,OUT3
SETB
03H;
20H.3位置1(执行闪烁功能3标志)
CLR
01H
CLR
02H
CLR
00H OUT3:
RET ;
;* * * * * * * * * * * *;;
延时程序
;
;* * * * * * * * * * * *;
;延时子程序,执行一次时间为513us DL512: MOV
R2,#OFFH LOOP1: DJNZ
R2,LOOP1
RET ;
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
;10ms延时子程序(调用20次0.5ms延时子程序)
DL10MS:MOV
R3,#14H LOOP2: LCALL DL512
DJNZ
R3,LOOP2
RET ;
;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为25msX15)
DL05s: MOV
R4,#OFH LOOP3: LCALL DL25MS
DJNZ R4,LOOP3
RET ;
;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为25msX15)
DL05S: MOV
R4,#OFH LOOP3: LCALL DL25MS
DJNZ R4,LOOP3
RET ;
;25ms延时子程序,调用扫键子程序延时,可快速读出功能按键值
DL25MS:MOV
R5,#OFFH LOOP4: LCALL KEYWORK
DJNZ R5,LOOP4
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
RET
END;
程序结束
12个经典单片机程序设计实例: 闪烁LED小灯主程序图 数码管时钟电路的主程序 单键学习型遥控器的设计 15路电器遥控器的设计 自行车里程/速度计的设计 自动往返行驶小汽车的设计 遥控小汽车的设计 数码管时钟电路的设计 8*8点阵LED字符显示器的设计 8路输入模拟信号数值显示电路的设计 8路输入模拟信号数值显示电路程序
单键学习型遥控器的程序如果对本文有疑问,请到论坛提问 编辑:51单片机学习网 @ 2009-10-20校对 中国开发板最佳品牌
版权:部分由编辑摘引,权利属原著作人
精心收集
精心编辑
精致阅读
如需请下载!
第三篇:物理教案-电压表
[物理教案-电压表]
教学目标知识目标
1、知道电压表的用途和表示符号;
2、掌握电压表的量程、刻度方法、连接方法及调“零”方法.能力目标
1、培养学生的观察能力;
2、会正确使用电压表并能正确地读出电压表的示数.情感目标
培养学生热爱仪器、认真细心、实事求是的科学态度.教学建议教材分析
本节主要内容为两部分:一是电压表的读数,二是电压表的使用.这些知识均需要通过观察和实验获得,因此必须利用实物或挂图进行教学,注意培养学生的观察能力和重视实践的良好习惯.教材介绍了四种外形不同的电压表,目的是让学生了解形状各不相同、测量范围各不相同,然后要向学生说明我们物理实验室用的电压表示要求熟练掌握的.在实际测量电压中,要选用电压表的量程.选用电压表量程时,首先要知道刻度盘上每个大格和每个小格所代表的电压值,对于有两个量程的电压表要分清它们对应的刻度线所表示的电压值.这一点是学生容易错的,要通过反复练习是学生掌握.电压表的使用是本节的重点,首先是根据实际需要量程正确地接入电路,其次是根据选用的量程正确记录测量数据.这部分内容教学,教师要先做好示范,然后让学生反复练习.教法建议
1.首先要从生活实际中提出问题,引起学生思考,在学生需求状态下引入课题.例如:你家中的用电器,如收音机、电子钟、电风扇等,它们的工作电压各不相同.你知道它们的电压是怎样得到的吗?用什么仪表?怎样测量? 2.接下来介绍教材图6-
5、6-7形状不同、量程不同的各式电压表.(可以根据自己学校实际情况酌情处理).3.着重介绍物理实验室现有的学生用的电压表的量程和读数.对于选用的电压表的量程,要知道刻度盘上每个大格和每个小格所表示的电压值.着重练习有两个量程的电压表读数.读数是一件认真细心做的事.要仿照教材上图6-6的电压表表头,做一个较大的刻度盘供学生练读.在学生已使用过电流表的基础上,可以介绍电压表调零知识.当指针在电路未接通时不指在零位置,需用螺丝到调节中间旋钮,直至调到指针指在零位置为止.若无法调到零位置时,读数要计入这个差值.4.电压表的使用,可以按课文顺序,对每一条使用电压表的规则,先画图说明,接着进行操作演示,并要求学生认真观察.准备演示实验时,要注意如下两方面:(1)增大观察对象的能见度和清晰度.如用大型电表,利用幻灯放大,布线分开适当距离等,利用活动指针练习读数.(2)提高仪器放置的位置,尽可能使每给学生都能看到.建议自制一些试教板,将部件安放在试教板上,竖直地挂起来,边讲边操作.最后将电压表的使用根电流表的使用进行对比,做出小结.它们的共同点是:①都要选择量程;②都要在弄清最小刻度值后再度数;③都要使电流从正接线柱流进,从负接线柱流出.它们的不同点是,:①电流表是串联在被测电路中,电压表要与被测电路并联;②电流表的两个接线柱不允许直接接到电源的两个极上,而电压表在被测量范围内,可以这样连接.使用多个量程的电压表测量电压时,如果不能预先估计被测电压的大小,应先用哪个量程试触,为什么要这样做?这是实际生活中常遇到的问题,组织学生讨论课深化使用电压表的知识.试触方法是学生应该学会的,教师要根据学生情况对电压表的试触做一次示范.告诉学生,试触时宜用单根导线从侧面试触,这样可在看到指针偏转超出最大刻度时立即移开导线.教学设计方案教学单元分析 本节教学重点是电压表的使用,电压表的使用包括电压表的读数和电压表的连接.在电压表连接时,首先要选择量程,其次是把电压表并联在被测电路中,让电流从正接线柱流入,从负接线柱流出.本节的难点是根据电压表不同的量程去读数.应当通过反复练习让学生掌握.教学过程分析 1.通过比较电流表和电压表,加深对电压表的印象,培养学生的观察能力.在前面学完电流表使用的基础上,学习电压表有类似之处.因此在教学时,首先提出测电压的必要,其次指出测电压的仪表叫电压表.在介绍了电压表之后,要把电压表与学过的电流表进行比较.可以让学生进行观察比较,方法是每两个学生位一组,课桌上摆放一块电流表和一块电压表,看一看表头的标记有什么区别?表盘的标度有什么区别?表盘的接线柱标记有什么区别? 2.介绍与量程对应的表头读数.在使用电压表测电压前,要先估计被测电压值,再确定量程.确定量程后,介绍读数方法.照上图做表头试教板,移动指针练习读数.3.教师示范连接电压表,侧小灯泡两端电压.在连接教材图6-8电路用电压表测灯泡两端电压过程中,向学生介绍电压表的使用规则(教材中的三条).4.教师可以组织学生练习连接电压表测小灯泡两端电压.在实验室每两个学生为一组进行练习.板书设计:探究活动【课题】电压表的种类、原理、构造.【组织形式】学生小组【活动方式】
制订分类课题:1种类2原理3构造 制订查阅和查找方式:
物理教案-电压表
第四篇:电压表教案
电压表
1)电压表的连接
通过大家的努力,我们对电池及电压已有所了解。如果老师现在有几节不同的电池,由于不小心将电池上标称的电压值磨掉了看不清楚,但必须知道其电压值是多少,大家可以帮助我吗? 我们可以利用电压表测量电池的电压,电路中电流的大小用电流表测量,电压的大小可以用电压表来测量。
1.a)b)c)认识电压表
该电压表的零刻度线在表盘的最左端。
该电压表有三个接线柱,两个量程。一个公共的“-”接线柱和两个“+”接线柱。使用“-”和“3”两个接线柱时,量程是3 V,刻度盘上每一大格表示“1 V”,每一小格表示“0.1 V”;使用“-”和“15”两个接线柱时,量程是15 V,刻度盘上每一大格表示“5 V”,每一小格表示“0.5 V”。电压表中间的旋钮可以调零。
电压表读数(二要、一不、二看清)
二要:电压表要并联在被测电路的两端,要使电流从电压表的“+”接线柱流入,从电压表的“-”接线柱流出。
一不:被测电压不能超过电压表的量程。
二看清:读数时一要看清电压表所用的量程;二要看清每一小格所表示的数值。d)2.a)
b)c)
小结
板书
注意:如果正、负接线柱接反了,指针会反向偏转,即向没有刻度的方向偏转。如果被测电压超过了电压表的量程,电压表的指针可能会超出刻度盘上的刻度线。
注意:如果正、负接线柱接反了,指针会反向偏转,即向没有刻度的方向偏转。如果被测电压超过了电压表的量程,电压表的指针可能会超出刻度盘上的刻度线。
习题:
1.在图所示的电路中,开关闭合后,会出现的情况是()
A.电流表鱼电压表都被烧坏 B.电流表与电压表都不会被烧坏 C.只有电压表会被烧坏
D.电流表、电源可能会被烧坏
2.如图9所示,设计电路图,要求亮灯串联,电压表测量两灯的总电压
第五篇:基于FPGA的电压表
FPGA控制的数字电压表电路设计
李培
(河南科技大学电子信息工程学院 河南洛阳 471003)
摘 要:介绍数字电压表的组成及工作原理,论述了基于VHDL语言和FPGA芯片的数字系统的设计思想和实现过程。
关键词:数字电压表;VHDL语言;FPGA
VHDL Realization of Digital Voltmeter
Abstract: The composition and working principle of digital voltm eter were introduced in this paper, the designing idea and implementation proces s based on VHDL and FPGA were also described.Key words: digital voltmeter;VHDL;FPGA 引言
在硬件电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,而VHDL语言则是EDA的关键技术之一,它采用自顶向下的设计方法,即从系统总体要求出发,自上至下地将设计任务分解为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。本文用FPGA芯片和VHDL语言设计了一个数字电压表,举例说明了利用VHDL语言实现数字系统的过程。
1.系统组成及工作原理
整个数字电压表的硬件结构如图1所示。
系统的核心电路由FPGA完成,本设计选用了Altera公司的EPlKl00QC208-3芯片,用VHDL语言对它进行设计,实现三大功能模块:(1)控制模块,激活A/D转换器动作、接收A/D转换器传递过来的数字转换值;(2)数据处理模块,将接收到的转换值调整成对应的数字信号;(3)扫描、显示模块,产生数码管的片选信号,并将数值处理模块输出的BCD码译成相应的7段数码驱动值。
工作时,系统按一定的速率采集输入的模拟电压,经ADC0804转换为8位数字量,此8位数字量经FPGA处理得到模拟电压的数字码,再输入数码管获得被测电压的数字显示。
此电压表的测量范围:0~5V,三位数码管显示。
2.FPGA功能模块的设计
数字电压表的三大模块都是用VHDL语言编程实现的。2.1控制模块
用状态机作法,产生ADC0804的片选信号、读/写控制信号,通过状态信号INTR判断转换是否结束;转换结束后将转换数据锁存并输出。其状态转换图如图2所示。
State machine viewer
A/D模块如下:
2.2数据处理模块
ADC0804是8位模数转换器,它的输出状态共有28=256种,如果输入信号Vin为0~5V电压范围,则每两个状态值为5/(256-1),约为0.0196V,故测量分辨率为0.02V。常用测量方法是:当读取到DB7~DB0转换值是XXH时,电压测量值为U≈XXH×0.02V;考虑到直接使用乘法计算对应的电压值将耗用大量的FPGA内部组件,本设计用查表命令来得到正确的电压值。
在读取到ADC0804的转换数据后,先用查表指令算出高、低4位的两个电压值,并分别用12位BCD码表示;接着设计12位的BCD码加法,如果每4位相加结果超过9需进行加6调整。这样得到模拟电压的BCD码。
CBD模块如下:
本模块的功能仿真结果如图3所示;当转换数据为00010101,通过查表高4位0001是0.32V,而低4位0101是0.1V,最后的电压输出结果是0.32V+0.1V=0.42V,它的BCD码表示为000001000010,仿真结果正确。2.3扫描、显示模块
如图4所示,CLK是扫描时钟,其频率为1kHz,由给定的40MHz时钟分频得到;DATAIN是数据处理模块输出的电压值的BCD码;SEL是数码管的片选信号;POINT是数码管小数点驱动;通过扫描分别输出3位电压值的BCD码DATAOUT,并通过DISP将BCD码译成相应的7段数码驱动值,送数码管显示。
2.4 3选1 数据选择器模块
下图是3选1 数据选择器模块,由sel来选择数据输出,sel的三个状态分别对应选中三个数据A,B,C,同时将选中的数据输出。
2.5位选信号产生器(3进制计数器)
位选信号产生器,实际上时一个3进制计数器,随着时钟的上升沿的到来,它始终在0,1,2之间来回的循环,它的输出作为3选1 数据选择器模块和小数点产生器的输入。以下是仿真和模块。
位选信号产生器的模块:
2.6 7段译码
将输入的数据通过译码电路在数码管上显示出来 7段译码的模块:
2.7小数点产生器
当if selDP=“10” then DPout<='0';
elsif
selDP=“01” then DPout<='0';elsif
selDP=“00” then DPout<='1';只有当它等于1的时候,小数点才起作用,也就是说,只有当高四位有数值的时候,必须需要小数点来确定数值。下面仿真波形中,黑色的部分就是小数点显示的时候和部分,可以很清楚地看出,当输出等于3的时候,就是显示小数点。
小数点产生器模块:
3.顶层文件的模块如下图:
4.仿真结果
在Quartus II 8.0中,仿真波形如图所示:
5.心得体会
从这次的课程设计中,我受益匪浅。电压表的设计,用EDA仿真工具Quartus II 8.0,用vhdl语言设计,这些对于我们初学者来说,并不是件容易的事情,但是同时巩固了我们对知识的深刻理解。为以后的FPGA设计打下了坚实的基础。所以,总的来说,过程是困难的,不容易的,结果却是很满意的,获得了很宝贵的知识和经验!
6.结束语
本文设计的VHDL语言程序已在Quartus II 8.0工具软件上进行了编译、仿真和调试。经过实验验证,本设计是正确的,其电压显示值误差没有超过量化台阶上限(0.02V)。本文给出的设计思想也适用于其他基于PLD芯片的系统设计。
参考文献
[1]潘松 EDA技术实用教程[M]。北京:科学出版社,2003.[2]卢毅 VHDL与数字电路设计[M]。北京:科学出版社,2001.[3]林敏 VHDL数字系统设计与高层次综合[M]。北京:电子工业出版社,2001.[ 4 ] http://www.xiexiebang.com:process(c_state,eoc)begin
case c_state is
when st0=>ale<='0';sta<='0';oe<='0';lock<='0';
n_state<=st1;
when st1=>ale<='1';sta<='0';oe<='0';lock<='0';
n_state<=st2;
when st2=>ale<='0';sta<='1';oe<='0';lock<='0';
n_state<=st3;
when st3=>ale<='0';sta<='0';oe<='0';lock<='0';
if(eoc='1')then n_state<=st4;
else n_state<=st3;
――eoc为‘1’转换结束 进入下一状态
end if;
――否则 继续转换
when st4=>ale<='0';sta<='0';oe<='1';lock<='0';
n_state<=st5;
when st5=>ale<='0';sta<='0';oe<='0';lock<='1';
n_state<=st6;
when st6=>ale<='0';sta<='0';oe<='0';lock<='1';
n_state<=st0;
when others=>n_state<=st0;
end case;end process com;reg:process(st)
begin
if(st'event and st='1')then
c_state<=n_state;
end if;end process reg;lo:process(lock)
--锁存 begin
if(lock'event and lock='1')then
regl<=d;
end if;end process lo;
q<=regl;
end a;
BCD 8位转12 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY BCD IS PORT(V:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
HB,LB:BUFFER STD_LOGIC_VECTOR(11 DOWNTO 0);
BVALUE:BUFFER STD_LOGIC_VECTOR(11 DOWNTO 0);
BCD_L,BCD_M,BCD_H:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END BCD;ARCHITECTURE A OF BCD IS BEGIN P1:PROCESS(V(7 DOWNTO 4))
BEGIN
--A/D输出高4位转换
分辨率0.32V
IF V(7 DOWNTO 4)=“1111” THEN HB<=“010010000000”;
--4.80V
ELSIF V(7 DOWNTO 4)= “1110” THEN HB<=“010001001000”;--4.48V
ELSIF V(7 DOWNTO 4)= “1101” THEN HB<=“010000010110”;--4.16V
ELSIF V(7 DOWNTO 4)= “1100” THEN HB<=“001110000100”;--3.84V
ELSIF V(7 DOWNTO 4)= “1011” THEN HB<=“001101010010”;--3.52V
ELSIF V(7 DOWNTO 4)= “1010” THEN HB<=“001100100000”;--3.20V
ELSIF V(7 DOWNTO 4)= “1001” THEN HB<=“001010001000”;--2.88V
ELSIF V(7 DOWNTO 4)= “1000” THEN HB<=“001001010110”;--2.56V
ELSIF V(7 DOWNTO 4)= “0111” THEN HB<=“001000100100”;--2.24V
ELSIF V(7 DOWNTO 4)= “0110” THEN HB<=“000110010010”;--1.92V
ELSIF V(7 DOWNTO 4)= “0101” THEN HB<=“000101100000”;--1.60V
ELSIF V(7 DOWNTO 4)= “0100” THEN HB<=“000100101000”;--1.28V
ELSIF V(7 DOWNTO 4)= “0011” THEN HB<=“000010010110”;--0.96V
ELSIF V(7 DOWNTO 4)= “0010” THEN HB<=“000001100100”;--0.64V
ELSIF V(7 DOWNTO 4)= “0001” THEN HB<=“000000110010”;--0.32V
ELSIF V(7 DOWNTO 4)= “0000” THEN HB<=“000000000000”;--0.00V
ELSE HB<=“000000000000”;
--0.00V
END IF;
END PROCESS P1;P2:PROCESS(V(3 DOWNTO 0))
BEGIN
--A/D输出低4位转换 分辨率0.02V
IF V(3 DOWNTO 0)= “1111” THEN LB<=“000000110000”;
--0.30V
ELSIF V(3 DOWNTO 0)= “1110” THEN LB<=“000000101000”;--0.28V
ELSIF V(3 DOWNTO 0)= “1101” THEN LB<=“000000100110”;--0.26V
ELSIF V(3 DOWNTO 0)= “1100” THEN LB<=“000000100100”;--0.24V
ELSIF V(3 DOWNTO 0)= “1011” THEN LB<=“000000100010”;--0.22V
ELSIF V(3 DOWNTO 0)= “1010” THEN LB<=“000000100000”;--0.20V
ELSIF V(3 DOWNTO 0)= “1001” THEN LB<=“000000011000”;--0.18V
ELSIF V(3 DOWNTO 0)= “1000” THEN LB<=“000000010110”;--0.16V
ELSIF V(3 DOWNTO 0)= “0111” THEN LB<=“000000010100”;--0.14V
ELSIF V(3 DOWNTO 0)= “0110” THEN LB<=“000000010010”;--0.12V
ELSIF V(3 DOWNTO 0)= “0101” THEN LB<=“000000010000”;--0.10V
ELSIF V(3 DOWNTO 0)= “0100” THEN LB<=“000000001000”;--0.08V
ELSIF V(3 DOWNTO 0)= “0011” THEN LB<=“000000000110”;--0.06V
ELSIF V(3 DOWNTO 0)= “0010” THEN LB<=“000000000100”;--0.04V
ELSIF V(3 DOWNTO 0)= “0001” THEN LB<=“000000000010”;--0.02V
ELSIF V(3 DOWNTO 0)= “0000” THEN LB<=“000000000000”;--0.00V
ELSE LB<=“000000000000”;
--0V
END IF;END PROCESS P2;
BVALUE<=HB+LB;P3:PROCESS(BVALUE)VARIABLE JJ:STD_LOGIC_VECTOR(11 DOWNTO 0);
BEGIN
JJ:=BVALUE;
IF(JJ(3 DOWNTO 0)>“1001”)THEN
――如果12位结果中,低4位
JJ:=JJ+“000000000110”;
――大于9 则低4位加6
END IF;
IF(JJ(7 DOWNTO 4)>“1001”)THEN
――如果中间的4位大于9
JJ:=JJ+“000001100000”;
――则中4位加6
END IF;BCD_L<=JJ(3 DOWNTO 0);
BCD_M<=JJ(7 DOWNTO 4);BCD_H<=JJ(11 DOWNTO 8);END PROCESS P3;END A;
3选1 数据选择器
LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity mux3_1 is port(sel:in std_logic_vector(1 downto 0);A,B,C:in std_logic_vector(3 downto 0);Mselout:out std_logic_vector(3 downto 0));end mux3_1;architecture a of mux3_1 is begin
process(sel)begin
if
sel=“10” then Mselout<=A;
elsif
sel=“01” then Mselout<=B;
elsif
sel=“00” then Mselout<=C;
else null;
end if;end process;end a;
位选信号产生器(3进制计数器)
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity c3 is
port(clk,clr:in std_logic;
qout:buffer std_logic_vector(1 downto 0));end c3;architecture behave of c3 is begin
process(clk,clr)begin if(clr='0')then qout<=“00”;elsif(clk'event and clk='1')then
qout<=qout+1;
if(qout=2)then qout<=“00”;
end if;end if;end process;end behave;
7段译码
LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY del7 IS PORT(input : IN STD_LOGIC_vector(3 downto 0);
output : OUT
STD_LOGIC_vector(6 downto 0));END del7;ARCHITECTURE a OF del7 IS
BEGIN PROCESS(input)BEGIN
CASE input IS
WHEN “0000” =>output<=“1111110”;
WHEN “0001” =>output<=“0110000”;
WHEN “0010” =>output<=“1101101”;
WHEN “0011” =>output<=“1111001”;
WHEN “0100” =>output<=“0110011”;
WHEN “0101” =>output<=“1011011”;
WHEN “0110” =>output<=“1011111”;
WHEN “0111” =>output<=“1110000”;
WHEN “1000” =>output<=“1111111”;
WHEN “1001” =>output<=“1111011”;
WHEN OTHERS=>NULL;
END CASE;end process;
END a;
小数点产生器
LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity DP is port(SELDP:in std_logic_vector(1 downto 0);
DPout:out std_logic);end DP;architecture a of DP is begin
process(selDP)begin
if
selDP=“10” then DPout<='0';
elsif
selDP=“01” then DPout<='0';
elsif
selDP=“00” then DPout<='1';――在高4位整数输出时,输出
else null;
――小数点DP
end if;end process;end a;
顶层文件
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity V_WATCH is
port(clkK,EOCC:in std_logic;
DD:IN std_logic_vector(7 downto 0);
clk3,CLR3:IN STD_LOGIC;
OEE,START,ALEE,ADDAA:OUT STD_LOGIC;
DPOUT:OUT STD_LOGIC;
Qoutput:out std_logic_vector(6 downto 0);
Qselout:out std_logic_vector(1 downto 0));end V_WATCH;architecture a of V_WATCH is
――元件例化 COMPONENT DP port(SELDP:in std_logic_vector(1 downto 0);
DPout:out std_logic);END COMPONENT;COMPONENT del7 PORT(input : IN STD_LOGIC_vector(3 downto 0);
output
: OUT STD_LOGIC_vector(6 downto 0));END COMPONENT;COMPONENT mux3_1 port(sel:in std_logic_vector(1 downto 0);A,B,C:in std_logic_vector(3 downto 0);Mselout:out std_logic_vector(3 downto 0));END COMPONENT;COMPONENT ad port(st,eoc:in std_logic;
d:in std_logic_vector(7 downto 0);
oe,sta,ale,adda:out std_logic;
q:out std_logic_vector(7 downto 0));END COMPONENT;COMPONENT C3 PORT(clk,clr: IN STD_LOGIC;
qout: OUT std_logic_vector(1 downto 0));END COMPONENT;COMPONENT BCD PORT(V:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
HB,LB:BUFFER STD_LOGIC_VECTOR(11 DOWNTO 0);
BVALUE:BUFFER STD_LOGIC_VECTOR(11 DOWNTO 0);
BCD_L,BCD_M,BCD_H:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;signal a:
std_logic_vector(1 downto 0);SIGNAL SBCD_L,SBCD_M,SBCD_H: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL b:
STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL q:
STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL BBCD:
STD_LOGIC_VECTOR(11 DOWNTO 0);
BEGIN U1:AD
PORT MAP(CLKK,EOCC,DD,OEE,START,ALEE,ADDAA, q);U2:BCD
PORT MAP(q,BCD_L=>SBCD_L,BCD_M=>SBCD_M,BCD_H=>SBCD_H);U3:C3
PORT MAP(CLK3,CLR3,a);
U4:MUX3_1 PORT MAP(SELOUT,SBCD_L,SBCD_M,SBCD_H,DI);U5:DEL7
PORT MAP(b, Qoutput);U6:DP
PORT MAP(a,DPOUT);QSELOUT<=a;end a;