
汇编代码:
程序代码
LED_0 EQU 30H
LED_1 EQU 31H
LED_2 EQU 32H
ADC EQU 35H
CLOCK BIT P24
ST BIT P25
EOC BIT P26
OE BIT P27
ORG 00H
SJMP START
ORG 0BH
LJMP INT_T0
START: MOV LED_0, #00H
MOV P2, #0FFH
MOV LED_1, #00H
MOV LED_2, #00H
MOV DPTR, #TABLE
MOV TMOD, #02H
MOV TH0, #245H
MOV TL0, #00H
MOV IE, #82H
SETB TR0
WAIT: CLR ST
SETB STH
CLR ST
JNB EOC, $
SETB OE
MOV ADC, P1
CLR OE
MOV A, ADC
MOV B, #51
DIV AB
MOV LED_2, A
MOV A, B
MOV B, #5
DIV AB
MOV LED_1, A
MOV LED_0, B
LCALL DISP
SJMP WAIT
INT_T0: CPL, CLOCK
RETI
DISP: MOV A, LED_0
MOVC A, @A+DPTR
CLR P23
MOV P0, A
LCALL DELAY
SETB P23
MOV A, LED_1
MOVC A,@A+DPTR
CLR P22
MOV P0, A
LCALL DELAY
SETB P22
MOV A, LED_2
MOVC A, @A+DPTRL
CLR P21
ORL A, #80H
MOV P0, A
LCALL DELAY
SETB P21
RET
DELAY: MOV R6, #10
D1: MOV R7, #250
DJNZ R7, $
DJNZ R6, D1
RET
TABLE: DB 3FH, 06H, 5BH, 4FH, 66H
DB 6DH, 7DH, 07H, 7FH, 6FH
END
你这个程序有些不规范,比如SIGNAL current_state,next_state:states :=st0;
这里是小写,而你在后面又用大写,建议前后大小写保持一致;还有就是有些是在输入的时候把一些字母输错了,自己以后写程序要注意;一定还要注意一些标点符号,比如“)”,“;”之类的。还有END IF,END与IF之间一定要有一个空格。我把改好之后的程序写在下面,你自己对照看一下。
修改后的程序:
LIBRARY IEEE;
USE IEEESTD_LOGIC_1164ALL;
ENTITY ADCINT IS
PORT(D :IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CLK : IN STD_LOGIC;
EOC : IN STD_LOGIC;
ALE : OUT STD_LOGIC;
START : OUT STD_LOGIC;
OE : OUT STD_LOGIC;
ADDA : OUT STD_LOGIC;
LOCK0 : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ADCINT;
ARCHITECTURE BEHAV OF ADCINT IS
TYPE STATES IS (ST0,ST1,ST2,ST3,ST4);
SIGNAL CURRENT_STATE,NEXT_STATE:STATES :=ST0;
SIGNAL REGL :STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL LOCK :STD_LOGIC;
BEGIN
ADDA<='1';
Q<=REGL;
LOCK0<=LOCK;
COM: PROCESS(CURRENT_STATE,EOC)
BEGIN
CASE CURRENT_STATE IS
WHEN ST0=>ALE<='0';START<='0';LOCK<='0';OE<='0'; NEXT_STATE <=ST1;
WHEN ST1=>ALE<='1';START<='1';LOCK<='0';OE<='0'; NEXT_STATE <=ST2;
WHEN ST2=>ALE<='0';START<='0';LOCK<='0';OE<='0';
IF (EOC='1') THEN NEXT_STATE<=ST3;
ELSE NEXT_STATE<=ST2;
END IF;
WHEN ST3=>ALE<='0';START<='0';LOCK<='0';OE<='1';NEXT_STATE<=ST4;
WHEN ST4=>ALE<='0';START<='0';LOCK<='0';OE<='1';NEXT_STATE<=ST0;
WHEN OTHERS=>NEXT_STATE<=ST0;
END CASE;
END PROCESS COM;
REG: PROCESS (CLK)
BEGIN
IF (CLK'EVENT AND CLK='1') THEN CURRENT_STATE<=NEXT_STATE;
END IF;
END PROCESS REG;
LATCH1:PROCESS (LOCK)
BEGIN
IF LOCK'EVENT AND LOCK='1' THEN REGL<=D;
END IF;
END PROCESS LATCH1;
END BEHAV;
ADC0809的数据你都已经采集到了,并且也把个十百的数字都计算出来了,那就只剩下显示了,LCD1602的初始化都已经完成了,只剩下最后一步那就是显示了,你会初始化,就会显示啊!
查看LCD的数据手册,有在液晶屏对应的地址上显示字符和数字的指令,你按数据手册上的时序在你想显示的地址上把你读到的个十百位数据显示到相应位置上不就可以了啊,这还有什么问题呢!
#include<reg52h> //包含单片机寄存器的头文件
#include<intrinsh> //包含_nop_()函数定义的头文件
//AD端口定义
sbit CLK=P3^4;
sbit start=P3^0;
sbit oe=P3^1;
sbit eoc=P3^2;
#define uchar unsigned char
#define uint unsigned int
/初始化/
void sysinit()
{
TMOD = 0x20; //设定定时器T1工作方式 T0 工作方式1
TH1=0xfe; //利用T1中断产生CLK信号
TL1=0xfe;//
EA = 1; //开总中断
ET1=1;
TR1=1; //启动定时器T1
start=0; // START: A/D转换启动信号,输入,高电平有效。
oe=0; //数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
}
void t1(void) interrupt 3
{
ET1=0;
CLK=~CLK;
ET1=1;
}
//adc0800数据采集
unsigned char adc()
{
unsigned char Temp;
start=1;
start=0; //启动信号
while (!eoc);// A/D转换结束信号
P1=0xff;
oe=1;
Temp=P1;//读取采集数据
oe=0;
return(Temp);//返回采集数据
}
void main()
{
uchar a;
sysinit();
while(1)
{
a=adc();//AD转换,转换后将数据存入变量a中
}
}
以上就是关于adc0809数字电压表,用汇编语言,求代码全部的内容,包括:adc0809数字电压表,用汇编语言,求代码、vhdl 原程序如下、FPGA高手请进~~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)