求一个为 51 单片机编写的 LCD 1602电子时钟的设计

作者&投稿:亓齿 (若有异议请与网页底部的电邮联系)
求教一个51单片机程序。。(LCD电子时钟)~

你的单片机信息和单片机原理图都没提供,源代码是没法写的啊,要的话留邮箱,我这有stc89c52的源程序,功能差不多,你可以修改一下

RS EQU P2.5
RW EQU P2.6
E EQU P2.7
DS1 EQU 40H
DS2 EQU 41H
DS3 EQU 42H
DS4 EQU 43H
DS5 EQU 44H
DS6 EQU 45H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
ORG 0030H
MAIN:
MOV SP, #60H
MOV TMOD,#01H
MOV TH0, #3CH
MOV TL0, #0B0H
SETB ET0
SETB EA
SETB TR0
MOV R7,#20

MOV R1,#0
MOV R2,#0
MOV R3,#12

LCALL CHUS;调用LCD初始化

MOV A,#82H
LCALL LCDCMD
MOV DPTR,#TAB1
ACALL WRITE
MOV A,#0C0H
LCALL LCDCMD
MOV DPTR,#TAB2
LCALL WRITE
MOV A,#0CCH
LCALL LCDCMD
MOV DPTR,#TAB2
LCALL WRITE

LOOP:
LCALL BCD
LCALL DISP
LJMP LOOP

;**************************************
;时钟显示子程序
;**************************************
DISP:
MOV A,#0C4H
LCALL LCDCMD

MOV A,DS5
ADD A,#30H
LCALL LCDWDATA
MOV A,DS6
ADD A,#30H
LCALL LCDWDATA
MOV A,#3AH
LCALL LCDWDATA
MOV A,DS3
ADD A,#30H
LCALL LCDWDATA
MOV A,DS4
ADD A,#30H
LCALL LCDWDATA
MOV A,#3AH
LCALL LCDWDATA
MOV A,DS1
ADD A,#30H
LCALL LCDWDATA
MOV A,DS2
ADD A,#30H
LCALL LCDWDATA
RET
;****************************************
;BCD码转换
;****************************************
BCD:
MOV A,R1
MOV B,#10
DIV AB
MOV DS1,A
MOV DS2,B
MOV A,R2
MOV B,#10
DIV AB
MOV DS3,A
MOV DS4,B
MOV A,R3
MOV B,#10
DIV AB
MOV DS5,A
MOV DS6,B
RET
;*******************************************
;LCD初始化设定子程序
;*******************************************
CHUS:
LCALL DELAY5MS
LCALL DELAY5MS
LCALL DELAY5MS
MOV A,#38H
LCALL LCDCMD
LCALL DELAY5MS
MOV A,#38H
LCALL LCDCMD
LCALL DELAY5MS
MOV A,#38H
LCALL LCDCMD
LCALL DELAY5MS

MOV A,#08H
LCALL LCDCMD
MOV A,#01H
LCALL LCDCMD
MOV A,#0CH
LCALL LCDCMD
RET
;******************************************
;写指令到LCD
;RS=L RW=L D0~D7=指令码 E=高脉冲
;******************************************
LCDCMD:
ACALL CMBUSY
CLR RS
CLR RW
MOV P0,A
SETB E
NOP
NOP
NOP
NOP
NOP
CLR E
RET
;******************************************
;写显示数据到LCD
;RS=H,RW=L D0~D7=指令码 E=高脉冲
;******************************************
LCDWDATA:
ACALL CMBUSY
SETB RS
CLR RW
MOV P0,A
SETB E
NOP
NOP
NOP
NOP
CLR E
RET
;******************************************
;检测LCD控制器忙状态
;RS=L RW=H E=H
;P0.7=0LCD闲
;******************************************
CMBUSY:
PUSH ACC
MOV P0,#0FFH
CLR RS
SETB RW
SETB E
LOOP1:
NOP
JB P0.7,LOOP1
CLR E
POP ACC
RET
;*****************************************
;发送字符串子程序
;*****************************************
WRITE:
PUSH ACC
W1:
CLR A
MOVC A,@A+DPTR
JZ W2
INC DPTR
ACALL LCDWDATA
JMP W1
W2:
POP ACC
RET
;****************************************
;延时5ms子程序
;****************************************
DELAY5MS:
MOV R5,#10
D1:MOV R6,#250
DJNZ R6,$
DJNZ R5,D1
RET
;*****************************************
;定时器中断子程序
;*****************************************
T0INT:
DJNZ R7,FAN
MOV R7,#20
INC R1
CJNE R1,#60,FAN
MOV R1,#00
INC R2
CJNE R2,#60,FAN
MOV R2,#00
INC R3
CJNE R3,#24,FAN
MOV R3,#12
FAN:
MOV TH0,#3CH
MOV TL0,#0B0H
RETI

TAB1:
DB "==ZHUBING==",00H
TAB2:
DB "====",00H




END

//按你的仿真图编写的
RS BIT P2.0 //重命名IO口
RW BIT P2.1
E BIT P2.2
BF BIT P3.7 //D0~D7接在P3口
K1 BIT P1.0
K2 BIT P1.1
K3 BIT P1.2
K4 BIT P1.3
NOP
MOV TMOD ,#11H //设定时器0和1工作在定时方式一
MOV IE,#8AH
SETB TR0
AJMP L0
JS: MOV TH0,#0BH //定时器中断0
MOV TL0,#0DCH
INC R7 //R7为秒的个位
CJNE R7,#160,JW
INC R6 //R6为秒的十位
CPL P2.4 //LED每过10秒状态变一下
AJMP L1
JW: RETI
INC R7 //定时器中断1
CJNE R7,#2,JW
MOV R7,#0
INC @R0
CJNE R5,#3AH,L3 //R5为分的个位
MOV R5,#48
INC R4
L3: CJNE R4,#36H,L6 //R4为分的十位
MOV R4,#48
L6: CJNE R3,#24,JW //R3为小时
MOV R3,#0
RETI
L1: MOV R7,#0
CJNE R6,#36H,JW
MOV R6,#48
INC R5
CJNE R5,#3AH,JW
MOV R5,#48
INC R4
CJNE R4,#36H,JW
MOV R4,#48
INC R3
CJNE R3,#24,JW
MOV R3,#0
RETI
L0: MOV R6,#48 //初始化程序
MOV R5,#48
MOV R4,#48
MOV R3,#12
CLR K2
CLR K3
CLR K4
ACALL CSH
L2: MOV R2,#87H //1602显示时间
ACALL ML
MOV B,#10
MOV A,R3
DIV AB
ADD A,#48
XCH A,R2
ACALL SJ
XCH A,B
ADD A,#48
XCH A,R2
ACALL SJ
MOV R2,#':'
ACALL SJ
MOV R2,4
ACALL SJ
MOV R2,5
ACALL SJ
MOV R2,#':'
ACALL SJ
MOV R2,6
ACALL SJ
MOV B,#16
MOV A,R7
DIV AB
ADD A,#30H
XCH A,R2
ACALL SJ
JNB K1,SS //检测K1
AJMP L2
SS: CLR TR0 //K1:进入设置现在的时间
SETB K2
SETB K3
SETB K4
JNB K3,F
JNB K2,S
JNB K4,W
CLR TR1
MOV TH1,#0
MOV TL1,#0
MOV R7,#0
MOV R6,#48
CLR K1
AJMP L2
S: MOV R0,#3 //K2:设置小时。
SETB TR1
AJMP L2
F: MOV R0,#5 //K3:设置分钟。
SETB TR1
AJMP L2
W: SETB TR0 //K4:确认完成设置
SETB K1
CLR K2
CLR K3
CLR K4
AJMP L2
T: MOV R1,#1 //延时
DJNZ R1,$
RET
ZT: CLR RS //查状态
SETB RW
L9: ACALL T
SETB E
ACALL T
MOV C,BF
CLR E
JC L9
CLR RW
RET
ML: ACALL ZT //传命令
SETB E
MOV P3,R2
ACALL T
CLR E
RET
SJ: ACALL ZT //传数据
SETB RS
SETB E
MOV P3,R2
ACALL T
CLR E
RET
CSH:MOV R2,#38H //初始化1602
ACALL ML
MOV R2,#0CH
ACALL ML
MOV R2,#06H
ACALL ML
MOV R2,#81H
ACALL ML
MOV R2,#'T'
ACALL SJ
MOV R2,#'i'
ACALL SJ
MOV R2,#'m'
ACALL SJ
MOV R2,#'e'
ACALL SJ
MOV R2,#':'
ACALL SJ
RET
END

可见:

http://hi.baidu.com/do_sermon/item/c8d1161d40768f10e3f98682

我只才c语言的

我在学习板上调的,没有流程图啊。


广宁县17894748639: 急求高手给写一个51单片机程序~注意:只要汇编语言~不要C语言~~急急急~~~~~~~~ -
归些埃索: 查询方式:ORG 0000H AJMP MAIN MAIN: MOV P1,#01H MOV R0,#8 MOV A,P1 XU: RL A MOV P1,A ACALL DELAY DJNZ R0,XU AJMP MAIN DELAY: MOV R0,#0FFH ONE:MOV R1,#0FFH TWO:MOV R2,#02H THE:DJNZ R2,THE DJNZ R1,...

广宁县17894748639: 求高人写一个用c语言写一个51单片机输出PWM控制舵机的程序,舵机参数可以自己定.最好加注释.高分谢谢啦 -
归些埃索: 用带PWM输出的单片机做吧!51单片机只能通过定时器来实现.想12C2052AD这些单片机就带PWM输出的.他的PWM输出程序:#include<reg52.h> sfr CCON =0xD8; sfr CMOD=0xD9; sfr CL=0xE9; sfr CH =0xF9; sfr CCAP0L=0xEA; sfr CCAP...

广宁县17894748639: 用c语言编写一个计数器(单片机为51型,数码管为共阴)要求有三个按键分别控制停止、加、减 -
归些埃索: 一看到你说是计数器,又看到你要求有停止功能,意思是把Timer改为计数器,然后可以通过一个键停止计数对吧?如果这样的话挺简单的,51单片机的计数器io口记得好像是P3^0和P3^1,但不管怎么,首先设置TMOD,将C/T位置1,这就改为计数器了,然后可以编写函数来对一个变量进行加减;同样利用51单片机的外部中断也可以实现计数功能,打开外部中断开关,在外部中断服务函数对计数变量进行加减;最简单的,直接利用io口高低电平变化来进行计数,编写if函数,只要某个io口电平变化了,就对计数变量进行加减.如果你对这个有点陌生,那么回复我一起讨论或者我可以帮你写程序.希望我的回答能帮助到你.

广宁县17894748639: 求个51单片机开平方的汇编程序
归些埃索: 双字节二进制无符号数开平方(快速) 入口条件:被开方数在R2、R3中. 出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数. 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH2: MOV A,R2 ORL A,R3 JNZ ...

广宁县17894748639: 求个51单片机程序 -
归些埃索: #include unsigned char time1s; void t0isr() interrupt 1 sbit KEY=P1^0; sbit PULSE=P1^1; { TH0=(65536-50000)/256; TL0=(65536-50000)%256; time1s++; if(time1s>=20) { time1s=0; PULSE=!PULSE; } } void delay(unsigned char x) { unsigned char ...

广宁县17894748639: 求写一段简单的51单片机C语言代码 -
归些埃索: 单片机检测高电平.1、可以用外部中断,外接激光传感器最好用普通光耦隔离一下,顺便改成低电平触发单片机中断.然后用位移指令移动跑马灯,然后计数值加1. 2、可以用循环检测,也建议用光耦隔离先,在MAIN里面不断检测P00,发现变化后,再次检测以便确认,确认后同样位移一下跑马灯,然后计数加1.

广宁县17894748639: 求一个单片机程序 -
归些埃索: #include#define uint unsigned int#define uchar unsigned charsbit rw=P2^5;sbit rs=P2^6;sbit re=P2^7;uchar code zmo0[]="I LOVE YOU!";uchar code zmo1[]="THAT...

广宁县17894748639: 求个51单片机程序
归些埃索: #include&lt;reg51.h&gt; unsigned char time1s; void t0isr() interrupt 1 sbit KEY=P1^0; sbit PULSE=P1^1; {TH0=(65536-50000)/256;TL0=(65536-50000)%256;time1s++;if(time1s&gt;=20){time1s=0;PULSE=!PULSE;} } void delay(unsigned ...

广宁县17894748639: 求写一个51单片机C语言程序,不复杂的,在线求助!!!感谢您八辈祖宗!!内有详细说明 -
归些埃索: 程序简单,吃完饭饭看有时间没#include code unsigned char temp[] = {0xC0, 0xF9, 0xA4 , 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; unsigned int num; unsigned char table[4]; void main() { TMOD = 0X01; TH0 = 0XFC; TL0 = 0X18; EA = 1; TR0 = ...

广宁县17894748639: 求51单片机控制继电器的汇编程序或c语言程序!!!! -
归些埃索: #include#include sbit key=P1^0; sbit key1=P1^1; sbit d1=P0^0; sbit d2=P0^1; void delay1s(void) //误差 0us { unsigned char a,b,c; for(c=167;c>0;c--) for(b=171;b>0;b--) for(a=16;a>0;a--); _nop_(); //if Keil,require use intrins.h } main() { while(1) { if(key...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网