51单片机+ADC0809+LCD1602用汇编语言编程

51单片机+ADC0809+LCD1602用汇编语言编程,第1张

你把这两个程序合起来改下就差不多咯!时间忙 只能把自己以前学的子程序给你咯

:1602显示

LCD_RS EQU P2.0

LCD_RW EQU P2.1

LCD_EN EQU P2.2

LCD_DATA EQU P0

*******************************************************************

ORG 0000H

AJMP MAIN

ORG 0030H

*******************************************************************

MAIN:

MOV SP,#60H

ACALL LCD_INIT LCD初始化

MAIN1:

ACALL CLR_LCD 清LCD

MOV A,#90H在第一行第17列的位置

ACALL LCD_CMD

MOV DPTR,#LINE1 第一行字符串的起始地址送入DPTR。

ACALL WRITE

MOV A,#0D0H 在第二行第17列的位置

ACALL LCD_CMD

MOV DPTR,#LINE2 第二行字符串的起始地址送入DPTR。

ACALL WRITE

MOV R3,#10H 向左移动16格

LOOPA:

MOV A,#18H 字符同时左移一格

ACALL LCD_CMD

MOV R5,#03H 延时375MS

ACALL DELAY125MS

DJNZ R3,LOOPA

ACALL DELAY4延时1.6s

ACALL DELAY4

MOV R4,#02H设置闪烁次数

ACALL FLASH 开始闪烁

AJMP MAIN1

LINE1:

DB "YALONG:",00H

LINE2:

DB "welcome you!",00H

***************************************************************

LCD初始化设定子程序

***************************************************************

LCD_INIT:

ACALL DELAY5MS延时15MS

ACALL DELAY5MS等待LCD电源稳定

ACALL DELAY5MS

MOV A,#38H 16*2显示,5*7点阵,8位数据

ACALL LCD_CMD_NC 不进行LCD忙检测

ACALL DELAY5MS

MOV A,#38H 16*2显示,5*7点阵,8位数据

ACALL LCD_CMD_NC 不进行LCD忙检测

ACALL DELAY5MS

MOV A,#38H 16*2显示,5*7点阵,8位数据

ACALL LCD_CMD_NC 不进行LCD忙检测

ACALL DELAY5MS

MOV A,#08H 显示关

ACALL LCD_CMD进行LCD忙检测

MOV A,#01H 清除屏幕

ACALL LCD_CMD进行LCD忙检测

MOV A,#0CH显示开,关光标

ACALL LCD_CMD 进行LCD忙检测

RET

***************************************************************

清LCD子程序

***************************************************************

CLR_LCD:

MOV A,#01H清除屏幕

ACALL LCD_CMD 进行LCD忙检测

RET

***************************************************************

写指令数据到LCD

RS=L,RW=L,D0-D7=指令码,E=高脉冲

***************************************************************

LCD_CMD:

CALL CHECKBUSY

LCD_CMD_NC:

CLR LCD_RS

CLR LCD_RW

MOV LCD_DATA,A

SETB LCD_EN

NOP

NOP

NOP

NOP

CLR LCD_EN

RET

***************************************************************

写显示数据到LCD

RS=H,RW=L,D0-D7=数据,E=高脉冲

***************************************************************

LCD_WDATA:

ACALL CHECKBUSY

SETB LCD_RS

CLR LCD_RW

MOV LCD_DATA,A

SETB LCD_EN

NOP

NOP

NOP

NOP

CLR LCD_EN

RET

***************************************************************

检测LCD控制器忙状态

读数据

RS=L,RW=H,E=H,输出:D0-D7=数据

LCD_DATA.7=1,LCD忙,等待。LCD_DATA.7=0,LCD闲,可以进行读写 *** 作。

***************************************************************

CHECKBUSY:

PUSH ACC

MOV LCD_DATA,#0FFH

CLR LCD_RS

SETB LCD_RW

SETB LCD_EN

BUSYLOOP:

NOP

JB LCD_DATA.7,BUSYLOOP

CLR LCD_EN

POP ACC

RET

***************************************************************

发送字符串子程序

***************************************************************

WRITE:

PUSH ACC

WRITE1:

CLR A

MOVC A,@A+DPTR

JZ WRITE2

INC DPTR

ACALL LCD_WDATA

JMP WRITE1

WRITE2:

POP ACC

RET

***************************************************************

闪烁子程序

***************************************************************

FLASH:

MOV A,#08H关闭显示

ACALL LCD_CMD

ACALL DELAY4

MOV A,#0CH开显示,关闭光标

ACALL LCD_CMD

ACALL DELAY4

DJNZ R4,FLASH

RET

***************************************************************

延时5MS子程序

LCD初始化使用

***************************************************************

DELAY5MS:

MOV R6,#10

DL1:

MOV R7,#249

DL2:

DJNZ R7,DL2

DJNZ R6,DL1

RET

***************************************************************

延时125MS子程序

字符串移动时使用

***************************************************************

DELAY125MS:

DL3:

MOV R6,#250

DL4:

MOV R7,#249

DL5:

DJNZ R7,DL5

DJNZ R6,DL4

DJNZ R5,DL3

RET

***************************************************************

延时800MS子程序

闪烁时使用

***************************************************************

DELAY4:

MOV R5,#40

DL6:

MOV R6,#100

DL7:

MOV R7,#100

DL8:

DJNZ R7,DL8

DJNZ R6,DL7

DJNZ R5,DL6

RET

***************************************************************

ENd

ADC0809子程序

引脚定义

ADC_EOCEQUP2.0

ADC_CS EQU P2.1

ADC_RD EQU P2.2

ADC_WR EQU P2.3

ADC_DATA EQUP0

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN:

SETBADC_EOC

SETBADC_WR

SETBADC_RD

SETBADC_CS

CLR ADC_CS START and ALE is H

CLRADC_WR

NOP

NOP

NOP

SETBADC_WR

SETBADC_CS

NOP

JB ADC_EOC,$ JNB ADC_EOC,$

CLR ADC_CS

CLR ADC_RD

MOV ADC_DATA,#0FFH

MOV A,ADC_DATA

SETBADC_RD

SETBADC_CS

CJNEA,#00H,BELL

INC A

BELL:

MOVR5,A

BELL1: ACALL DELAY

DJNZR5,BELL1

CPL P2.7

AJMP MAIN

DELAY:

MOV R7,#02H

D1:

MOV R6,#0FFH

DJNZ R6,$

DJNZ R7,D1

RET

END

#include<reg52.h> //包含单片机寄存器的头文件

#include<intrins.h> //包含_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中

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12030263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存