刚学单片机数码管自己写了个数码管时钟请教怎么写

求51单片机数字时钟设计,要求用8位数码管,能显示年月日,时分秒,带调时,闹钟功能,三个独立按键来_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
求51单片机数字时钟设计,要求用8位数码管,能显示年月日,时分秒,带调时,闹钟功能,三个独立按键来
时分秒求51单片机数字时钟设计,带调时,要求用8位数码管,能显示年月日
我有更好的答案
AT8951单片机带闹钟数字时钟-C语言编程
有直接的资料吗?那个没积分下不了
采纳率:85%
你需要材料?
要能在51中运行的原程序~~
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包51单片机数码管时钟显示(年月日、时分秒可调)【人人网 - 分享】
51单片机数码管时钟显示(年月日、时分秒可调)
分享这个视频的人喜欢
分享这个视频的人也爱看
次午饭了么
新主播求守护
你就是我的大心心
在澳门的第五天直播啦啦
第三天直播刚吃完午饭好饱哦
新人求守护
热门视频推荐
热门日志推荐
同类视频推荐
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场STC89C52+PCF8563+4位数码管制作的电子钟,请教编程问题! - 51单片机编程高级技巧 -
51单片机学习论坛
- Powered by Discuz!
STC89C52+PCF8563+4位数码管制作的电子钟,请教编程问题!
单片机幼儿园
STC89C52+PCF8563+4位数码管制作的电子钟,请教编程问题!
按下面示意图制作好了硬件,STC89C52+PCF8563+4位数码管,用P3.6 P3.7作为I2C总线单片机与8563时钟芯片进行通信,程序写好了,反复修改不能正确显示时间。后我修改程序,暂时关闭数码管显示,用串口通信程序将要显示的时分秒数据输出到电脑,用电脑串口接收软件接收单片机输出的数据,发现导出来的时分数据乱,不稳定,不知是那里出了问题,我已经研究几天了!请高手帮我分析一下!
&&程序如下:
& & K1& & EQU&&P2.4& &&&;按键1引脚定义
& & K2& & EQU&&P2.5& &&&;按键2引脚定义
;时钟芯片8563
;从8563读出时,分,秒数据,数码管显示
SCL_8563 BIT P3.6& & ;时钟芯片的时钟线
SDA_8563 BIT P3.7& & ;时钟芯片的数据线
;SCL BIT P0.3& && && & ;164的时钟线
;SDA BIT P0.2& && && & ;164的数据线
LED0 EQU 40H& & ;保存秒个位数据
LED1 EQU 41H& & ;保存秒十位数据
LED2 EQU 42H& & ;保存分个位数据
LED3 EQU 43H& & ;保存分十位数据
LED4 EQU 44H& & ;保存时个位数据
LED5 EQU 45H& & ;保存时十位数据
TDATE EQU 46H& & ;时间缓存
MIN EQU 48H
HOU EQU 49H
SUBA EQU 4AH
;*********主程序***********
ACALL SEND8563 ;写时钟,初初始化时钟为12点0分0秒
ACALL RCV8563 ;读时钟数据
ACALL SEP& &&&;数据拆分
;-------------------------
& && &&&MOV&&SCON,&&#40H& & ;设串口方式1、REN=0
& && &&&MOV&&PCON,&&#80H& & ;SMOD=1,波特率提高1倍
& && &&&MOV&&TMOD,&&#20H& & ; 设置定时器1为方式2
& && &&&MOV&&TH1,& &#0FAH& &; 定时器1装计数初值& && &&&
& && &&&SETB&&TR1& && && &&&; 启动定时器1& && && && &&&
& && &&&CLR& &A& && && && &&&;清零
& && && && && && && &&&
MOV& &SBUF, led0& && & ;发送取码数据
JNB& & TI, $& && &&&;等待发送完
CLR& & TI& && && &&&;将发送中断标志位清0
MOV& &SBUF, led1& && &;发送取码数据
JNB& & TI, $& && &&&;等待发送完
CLR& & TI& && && &&&;将发送中断标志位清0
MOV& &SBUF, led2& && & ;发送取码数据
JNB& & TI, $& && &&&;等待发送完
CLR& & TI& && && &&&;将发送中断标志位清0
MOV& &SBUF, led3& && & ;发送取码数据
JNB& & TI, $& && &&&;等待发送完
CLR& & TI& && && &&&;将发送中断标志位清0
MOV& &SBUF, led4& && &;发送取码数据
JNB& & TI, $& && &&&;等待发送完
CLR& & TI& && && &&&;将发送中断标志位清0
MOV& &SBUF, led5& && & ;发送取码数据
JNB& & TI, $& && &&&;等待发送完
CLR& & TI& && && &&&;将发送中断标志位清0
;-------------------------
ACALL DELAY& &&&;调用延时
;*********主程序结束***********
;**********初始化时间写进8563子程序**************
MOV S,#02H& && &&&;初始化时间
MOV MIN,#02H
MOV HOU,#02H
MOV SUBA,#02H ; 取读秒时间字节地址
MOV TDATE,S& && &&&;秒数据
ACALL WRITE_8563& & ;把数据读人8563
MOV SUBA,#03H& && & ;取读分时间字节地址
MOV TDATE,MIN
ACALL WRITE_8563
MOV SUBA,#04H& && & ;取读时时间字节地址
MOV TDATE,HOU
ACALL WRITE_8563
;********** 初始化时间写进8563子程序 结束**************
;**********写8563子程序************
WRITE_8563:
ACALL START& & ;发送IC总线起始条件启动PC8563
MOV A,#0A2H& & ;取器件地址向8563发出写的指令
ACALL WRITE_BYTE ;写进PCF8563器件总线地址
MOV A,SUBA& && &&&;取读时间字节地址
ACALL WRITE_BYTE ;写进时间字节地址
MOV A,TDATE& && &&&;将所要写入的数据写入
ACALL WRITE_BYTE& & ;写进时间
ACALL STOP& && && &&&;发送IC总线停止条件
;**********写8563子程序结束***********
;******** 读8563子程序**************
ACALL START& & ;启动总线
MOV A,#0A2H& &&&;写操作器件地址
ACALL WRITE_BYTE& & ;写入器件地址
MOV A,#02H& && && &;选择单元地址
ACALL WRITE_BYTE& &&&;写入单元地址
ACALL START& && & ;重新启动总线
MOV A,#0A3H& && & ;读操作器件地址
ACALL WRITE_BYTE& & ;写入器件地址
ACALL READ_BYTE& && &;读入一个数据:秒
ANL A,#7FH& && &;屏蔽无效位
MOV S,A& && && &;送秒保存单元
ACALL START& &&&;重新启动总线
MOV A,#0A3H& && &;读操作器件地址
ACALL WRITE_BYTE& &;写入器件地址
ACALL READ_BYTE& &;读下个字节数据:分
ANL A,#7FH& && && &;屏蔽无效位
MOV MIN,A& && && & ;送分保存单元
ACALL START
MOV A,#0A3H
ACALL WRITE_BYTE
ACALL READ_BYTE& &&&;读下个字节数据:时
ANL A,#3FH& && && &&&;屏蔽无效位
MOV HOU,A& && && && & ;送时保存单元
ACALL STOP& && && & ;结束总线
;******读8563子程序结束************
;***写一个字节子程序*********
WRITE_BYTE:
MOV R0,#8& && &&&;写进的数据为8位
CLR C& && && && & ;清进位标志
CLR SCL_8563& && &;时钟线钳位为0
RLC A& && && && &&&;要发送的数据左移,被写进位进人C
MOV SDA_8563,C& &&&;要写进的位送到时钟线
SETB SCL_8563& &&&; 置时钟线为高,数据写入芯片
CLR SCL_8563& && &;钳住总线准备接受下一个数据位
DJNZ R0,DL& && && &;8位没写完继续写
SETB SDA_8563& && & ;8位发送完后释放数据线准备收应答位
SETB SCL_8563& && & ;开始接受应答信号
CLR F0& && && && &;预先清发送数据出错标志
JNB SDA_8563,ACKEND ;判断是否接受应答信号正常转ACKEND
SETB F0& && && &&&;未受到应答置位错误标志
CLR SCL_8563& & ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理
;***写一个字节子程序结束*********
;****** 读一个字节子程序************
READ_BYTE:
SETB SDA_8563& &;置数据线为输入方式
CLR SCL_8563& & ;置时钟线为低,准备接受数据
SETB SCL_8563& & ;置时钟线为高使数据线上数据有效
MOV C,SDA_8563& & ;接受的数据位放入ACC
DJNZ R0,READ& &;8位没收完继续接受
CLR SCL_8563
;**********写一个字节子程序结束**********
;********** 启动总线子程序*********
SETB SDA_8563& & ;发送起始条件的数据信号
SETB SCL_8563
CLR SDA_8563& && &;发送起始信号
CLR SCL_8563& &&&;钳住总线
;**********启动总线子程序 结束*********
;********** 停止总线子程序***********
CLR SCL_8563
CLR SDA_8563& & ;发送停止条件的数据信号
SETB SCL_8563& & ;发送停止条件的时钟信号
SETB SDA_8563& &&&;发送IC总线停止信号
CLR SCL_8563
;**********停止总线子程序 结束***********
;******拆分子程序***********
MOV A,S& && &;秒
ANL A,#0FH& & ;屏蔽高四位,只取低四位
MOV LED0,A& & ;秒个位存到LED0
MOV A,S& && &&&;秒重载
ANL A,#0F0H& & ;屏蔽底四位,取高四位
SWAP A& && && &;高低字节交换
MOV LED1,A& &&&;秒十位存到LED1
ANL A,#0FH
MOV LED2,A
ANL A,#0F0H
MOV LED3,A
ANL A,#0FH
MOV LED4,A
ANL A,#0F0H
MOV LED5,A
;******拆分子程序 结束***********
;********* 延时子程序********
MOV R1,#0FFH
MOV R2,#0FFH
mov R5,#0fH
djnz R5,DEL5
DJNZ R2,DEL2
DJNZ R1,DEL1
这是单片机发送出来的数据:
(秒个位 秒十位 分个位 分十位 时个位 时十位)
80 82 40 88 04 FE
82 82 40 88 04 FE
85 82 50 88 04 FE
87 82 50 88 04 FE
89 02 50 88 04 FE
81 A1 40 88 04 FE
83 A1 40 88 04 FE
85 A1 40 88 04 FE
88 A1 50 88 04 FE
80 40 42 00 00 82
40 42 00 00 84 00
28 44 02 FF 86 00
28 44 02 FF 88 00
88 41 41 E0 80 20
A1 10 10 F8 83 20
A1 10 00 85 20 A1
10 00 87 20 A1 10
10 F8 89 20 A1 10
10 F8 81 01 42 10
10 F8 83 41 42 10
10 F8 86 41 42 00
00 88 41 42 00 00
80 00 28 44 02 FF
82 00 28 44 02 FF
84 00 28 44 02 FF
86 10 28 44 02 FF
88 10 28 44 02 FF
81 02 42 00 00 83
82 42 10 10 F8 85
82 42 10 10 F8 87
82 42 10 10 F8 89
82 42 00 10 F8 81
21 A1 10 00 84 21
A1 10 00 86 21 A1
10 10 F8 88 21 A1
10 10 F8 80 40 22
10 10 F8 82 40 22
00 00 84 40 22 00
00 86 40 22 00 00
89 00 22 10 10 F8
81 A0 A1 10 10 F8
83 A0 A1 10 10 F8
85 A0 A1 10 00 87
A0 A1 10 00 89 A0
[ 本帖最后由 kenblade 于
14:03 编辑 ]
附件: 您所在的用户组无法下载或查看附件
单片机幼儿园
我已经自己分析出问题原因了
是波特率的问题,波特率不对会造成接收数据的错误,要修正波特率参数或调整晶振。
问题已经解决!51单片机学习记录——数码管动态显示
> 51单片机学习记录——数码管动态显示
51单片机学习记录——数码管动态显示
正在学习51的数码管以及中断,打算利用六位数码管实现一个时钟的功能。但使用数码管输出时,如果不添加延时语句,那么一直有显示混乱的现象,有时完全无法分辨清楚数字。本文引用地址:如果在传送完数据以后延时1ms,显示混乱情况会好转。同时发现延时的时间越长,显示效果越好。但是当然,相应的显示稳定程度也会下降,即数码管闪烁。程序中在送完段选数据以后已经使用了参考书中的&消影&语句:1 dula=1;2 P0=table[k];3 dula=0;4 P0=0xff;//&消影&可是这个语句只是在有延时的情况下才有效果,如果我不写延时语句,那么显示依旧混乱。虽然在显示过程延时不会影响中断的计时,但是我总不想依赖for语句写出来的延时。= =于是自己就尝试了很多方法,想要解决这个问题,我的目标就是不写延时语句让数码管正常显示。我有试过先向P0传送数据,然后打开锁存器,马上关闭。如:1 P0=table[k];2 dula=1;3 dula=0;但是问题依旧也尝试过在打开任一锁存器之前,再锁一次另一锁存器(即送一次低电平),仍然无效。最后发现需要在输出数据之前加这么一段代码:1
dula=0;//初始化消除干扰加了这段代码,数码管显示不再混乱。语句的功能就类似于初始化一下锁存器的内容。经过两天的研究,终于明白了期中的猫腻。现在发出来跟大家分享一下:(转载请说明出处)数码管之所以有&影&,根本原因是段选,位选数据无法同时送达。具体解释一下:当我改变了位选的值后(改变了要显示的数码管),接下来才改变段选的值(改变要显示的数字)。而在这中间有微小的时间间隔,位选的值改变了,但是段选的值没变。也就是说,我改变了要显示的数码管,但是这个数码管显示的是上一个数码管的数字!想到这里,我有如醍醐灌顶,豁然开朗!当然,反之亦然,如果你是先段选再位选,同样有问题。请大家自己考虑。所以不难解释上面那段代码的作用了,就是在输出之前将之前那个数码管显示空(或者不选择任何数码管)。所以显然这个初始化代码还可以简化,但是要取决于你是先段选还是先位选。如果先位选,那么就要清空段选数据。1 P0=0x00;2 dula=1;3 dula=0;反过来也一样。如果先段选,那么清空位选数据即可。百度百科有人问了一个差不多的问题,这里引用过来供大家参考:经验总结:数码管的显示,段选数据和位选数据要紧贴,中间不要夹杂其他语句。换句话说,计算在先,最后一次性传送数据。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一还没有帐号? 赶紧
用户版块帖子
新手C51单片机简单数码管时钟
UID:1309577
在线时间327小时
M币930专家0
&&&& 昨天搞了一天,终于知道自己买来的四位数码管是怎么样去驱动的,就是有些东西还是懵懵懂懂的,真的该买单一的数码管和锁存器,自己搞下,不过看了点例程,总算出来个样品,给大家看看,顺便想让高手指点下程序的问题,由于没有连接两个数码管,只搞定了分和秒……下面是程序:&&&&&& 话说程序都是拼接的,然后有些东西是多次下载修改,下载修改,还有一些时间的调试,最后成下面的东西了的。#include &reg51.h&#define DATAOUT P2&&&&//指定P2口做为输出sbit H1=DATAOUT^0;&&&&//位选控制sbit H2=DATAOUT^1;sbit H3=DATAOUT^2;sbit H4=DATAOUT^3;sbit DA=DATAOUT^4;&&&&//数据输出&&&&sbit SC=DATAOUT^5;&&&&//移位时钟sbit ST=DATAOUT^6;&&&&//锁存信号//变量定义:code unsigned char table[]=&&&&&&&&&&&&{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};&&&&&&&&&&&&&&&&&&&&//表:共阳数码管 0-9 //定义一个unsigned char型的数组,里面存放的是共阳数码管对应的编码unsigned char l_posit=0;&&&&//显示位置索引int s=0,m=0;//定义一个全局变量s,m 存放秒和分void output(unsigned char dat) //移出一字节&& {&&&&&&&&&&&& for(i=0;i&8;i++)&&&&&&&&&&{&&&&&&&&&&&& SC=0;&&&&&&&&&&&& DA=dat&0x80;&&&&//高位先移出&&&&&&&&&&&& SC=1;&&&&&&&&&&&& dat&&=1;&&&&&&&&&&}&& }//这个过程好不容易看懂了,void print(unsigned char dat)&&&&{&&&&&&&&output(table[dat]);&&&&&&&&&&&&//输出一个字节,显示&1&的断码&&&&&&&&DATAOUT|=0X0F;&&&&&&&&&&&&&&&&//关闭显示,位切换准备&&&&&&&&ST=0;&&&&&&&&&&&&&&&&&&&&&&&&//锁存准备&&&&&&&&ST=1;&&&&&&&&&&&&&&&&&&&&&&&&//数据锁存到输出&&&&&&&&DATAOUT=DATAOUT&~(1&&l_posit);&&&&&&&&//打开下一位显示&&(这一句真心看不懂了,各种好奇,)&&&&&&&&l_posit++;&&&&&&&&//每调用一次函数将轮流显示一位&&&&&&&&if(l_posit&3)&&&&&&&&l_posit=0;&&&&}void timer() interrupt 1 using 1 //定时器中断处理函数&& {&&&&&&&&&&&&&&&&//定义一个临时变量&&&&&&&&if(i==20) &&&&&&&&&& {&&&&&&&&&&&&&&&&s++;&&&&&&&& //秒数自加1&&&&&&&&&&&&&&&&i=0;&&&&&&&& //对i清零&&&&&& &&&&&&&&&&&&}&&&&&& &&&&&&&&if(s==60)&&&&//如果到了60秒,则对秒数清零&&&&&&&&&&&&{&&&&&&&&&&&&&&&&m++;&&&&&&&&&&&&&&&&s=0;&&&&&&&&&&&&}&&&&&&&&i++;&&&&&&&&&&//每中断一次,i的值加1&&&&&&&&TH0=()/256;&&&&&&&&&& //重新给定时器赋初始值,我根据实际情况进行了微调&&&&&&&&TL0=()%256;&& } void init()&&&&//定时器初始函数,对定时器初始化&& {&&&&&&&&EA=1;&&&&&&&&&&&& //允许所有的中断请求&&&&&&&&TMOD=0x01;&&&&&&&&//设定时器0的工作模式为 方式1 即16位定时器&&&&&&&&ET0=1;&&&&&&&&&& //允许定时器0的中断请求&&&&&&&&TH0=()/256;&&&&&&&& //定时时间为50ms,初始值微调的结果&&&&&&&&TL0=()%256;&&&&&&&&TR0=1;&&&&&&&&&&&&&&&&//打开定时器0,开始定时&& } void main()&&{&&&&&&&&init();&&&&&&&&&&//调用定时器初始化函数,对定时器进行初始化&&&&&&&&while(1) &&&&&&&&&& {&&&&&&&&&&&&&&&& print(m/10);&&&&&&&&&&&&&&&& print(m%10);&&&&&&&&&&&&&&&& print(s/10);&&&&&&&&&&&&&&&& print(s%10);&&&&&&&&&&&&}&& }&&&&&&&&DATAOUT=DATAOUT&~(1&&l_posit);&&&& //打开下一位显示&&&&&&&&
这样一句话真的是一头雾水了,求解答啊,发现还是要从零开始认真的去学C语言,求大神推荐C语言书,当然要是有电子的直接发给我也行,很是感谢,邮箱:。&&&&明天接着搞,加油……
我也开始学单片机,之后可以交流交流
UID:1017083
在线时间2293小时
M币2881专家0
我只看到了88点88分88秒。。。。。。。
UID:541075
在线时间3591小时
M币23050专家43
回 1楼(pansiyu) 的帖子
数码管漏光?拍摄的效果问题?消隐没处理好?
UID:805500
在线时间4407小时
M币4644专家85
用多个单一的数码管连线太多,更麻烦,只驱动几个数码管锁存器完全可以不用的。
UID:1309577
在线时间327小时
M币930专家0
回 1楼(pansiyu) 的帖子
拍摄问题,其实是正常的
UID:1309577
在线时间327小时
M币930专家0
回 2楼(fang3) 的帖子
拍摄问题,完全拍花了
UID:239985
在线时间1512小时
M币6625专家13
这个楼偏的.全是答非所问啊.语句看上去是复杂的,但是还是由一个个组合起来的.只不过是相当于多个语句的复合罢了.DATAOUT=DATAOUT&~(1&&l_posit);&&&& //打开下一位显示&&拆开来看就能知道了.括号里的先.1&&l_posit就是把1左移l_posit个bit位.反映在寄存器中就是相当于把一个byte8位全是0中的第l_posit位置为1.然后是括号前的~是取反,那么和上一个的内容组合就相当于把一个byte8位全是1中的第l_posit位置为0然后再是DATAOUT&,那么就是把DATAOUT对应的l_posit位置为0.硬件电路中的io输出为0为有效,所以结果就是对应位打开.
UID:896699
在线时间413小时
M币180专家1
拍摄角度有待改进.
UID:805500
在线时间4407小时
M币4644专家85
初学还是直接位操作简单,。
UID:1216293
在线时间31小时
M币225专家0
骚年,你是在用两片2032纽扣电池串联供电的?呃,(⊙o⊙)…光个数码管模块就得几十毫安的电流,真以为你是卖电池的。初学者不适合用这个595数码管模块,省了几根线不假,但程序上还得串行移位再动态扫描,还不如自己直接用三极管焊个数码管模块更好理解
访问内容超出本站范围,不能确定是否安全
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:12-08 12:13, Total 0.160338(s) query 10,
Gzip enabled&

我要回帖

更多关于 单片机6位数码管时钟 的文章

 

随机推荐