51单片机1602显示时钟数字时钟后为什么不能重新写入数据

后使用快捷导航没有帐号?
请完成以下验证码
查看: 5437|回复: 23
关于上位机发送数据给单片机改变当前1602的显示时间
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
大虾们!帮帮忙,我现在在学串口通信,我知道上位机发送一个字节的数据给单片机,然后让数码管显示发送的数据但是现在我想通过上位机发送一些数据给单片机,让1602显示的时间通过上位机发过来的数据进行改变,
该怎么发送呢
哪位大虾有这个程序没有?
贴出来好吗?
在线时间30 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
通过UART通信啊
关键是怎么处理中断服务程序,是同时接收吗?
还是一个字节中断一次呢?
你有这方面的程序没有,帮帮忙,好吗?大侠!&
在线时间750 小时
威望7599分
芯币6527枚
E金币269枚
TA的帖子TA的资源
上下位机需要配合的,还是要自己你设计。
大侠,你有这方面的中断服务程序没有?该怎么处理发送过来的多个字节的数据呢?
是中断一次吗?
还是一个字节中断一次呢?在此谢谢大侠了,帮帮我好吗?&
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
就是不知道多个数据是一次性发出去呢,还是要一个字节去发送,也就是说我在串口上填了四个十六进制数,
点击发送之后,下位机是怎么接受的,也是从第一个字节的数据接受产生中断后,又接受第二字节的数据在产生中断呢
还是只中断一次,
大虾谁有这方面的程序没有
发给我好吗?
上位机给下位机发送一串字符串我印象中好像做过,楼主你可以这样试下,如果你个串口助手在一串字符串的最后会加上换行符的话,那么就在单片机里面接收的时候判断是否收到换行符,如果收到,说明数据接收完毕,如果没&
在线时间1227 小时
威望11302分
芯币15474枚
E金币115枚
TA的帖子TA的资源
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
程序是有,可是跟你的不配套啊,估计你一时半会儿也弄不清楚,给你说一下思路。
首先,如果是一般单片机的话是没收到一个字节就产生一次中断的,有些单片机带FIFO,可以设置成接收多个字节之后再产生中断,你先按接收一个字节就产生一次中断来处理吧。
一般的通讯都有一个规约,也就是上位机和下位机之间交换数据的规则。一般来说一帧数据至少会包含一个帧头,这个可以由你自己决定,如果是标准规约这个帧头就是标准的了,还有就是会包含数据长度,用来表示到底有多少数据需要接受,因为数据里面有可能有和帧头一样的数据,加上数据长度判断就不会错误的把这个数据当成帧头了。再复杂一些的还有帧间隔时间、校验码等信息,这个你以后慢慢理解吧。
说一下你的应用的具体思路。因为你的功能比较单一,可以先做成死的,以后需要再做活。首先你的上位机发送数据的格式要定好了,要发几个数据,用什么软件发,发送的数据是什么格式?如果是普通的串口调试软件,一般格式就比较灵活了,自己定一下就行,如果自己做上位机,先读电脑的时间,再发给单片机的话也可以自己定格式,简单一点的话一帧完整的数据应该包含一个帧头和一定长度的数据,帧头告诉单片机什么时候开始接收数据。因为你只发时间,数据长度可以做成死的,比如年月日时分秒可以是个字节,还要发其他信息的话你再定。比如帧头设置成0x5A,你的单片机在中断里收到数据后先判断是不是0x5A,如果是,置一个标志,以后再进中断后接受到的数据按顺序放到一个全局变量数组里面,并对中断计数,等接收的长度达到规定值,说明数据接收完成了,把刚才那个标志清了,等待下一次中断后找帧头就可以了。数据接收完之后再置一个标志,告诉显示程序数据接收完了,显示程序更新显示数据就可以了。
谢谢大侠了,可否把程序发给我,我用的是51单片机,我只要单片机接受到数据后,中断程序是怎么处理由串口助手发过来的数据:
年月日时分秒的。串口助手发送这一串数据是按十六进制发送的,这些数据像这样&
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
程序是有,可是跟你的不配套啊,估计你一时半会儿也弄不清楚,给你说一下思路。
首先,如果是一般单片机的 ...
谢谢大侠了,可否把程序发给我,我用的是51单片机,我只要单片机接受到数据后,中断程序是怎么处理由串口助手发过来的数据:
年月日时分秒的。串口助手发送这一串数据是按十六进制发送的,这些数据像这样00写一串数据发送吗?
还是中间要空格什么之类。
谢谢大侠了,
程序给不了你,一个是程序是单位的,不好私下传播,再一个程序比较复杂,也不是在51上用的。估计你一时半会也移植不了。
在中断程序里先找帧头,比如你发的00,前面再加一个字符,比如A。发的就是A2014&
在线时间1227 小时
威望11302分
芯币15474枚
E金币115枚
TA的帖子TA的资源
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
谢谢大侠了,可否把程序发给我,我用的是51单片机,我只要单片机接受到数据后,中断程序是怎么处理由串口 ...
程序给不了你,一个是程序是单位的,不好私下传播,再一个程序比较复杂,也不是在51上用的。估计你一时半会也移植不了。
在中断程序里先找帧头,比如你发的00,前面再加一个字符,比如A。发的就是A00。你每次进中断后读出接收的数据,先判断是不是A,如果是的话,置一个标志,等下次进中断之后判断这个标志,如果这个标志置位了。就把接收到的数据放到一个预先设置好的全局变量数组里面,比如这个时候收到的应该是2,把2放到数组的第一个,下一次中断应该接受到0,放到数组的第二个元素里面。像上面的数里面有效的数据是14个,那么你进14次中中断之后就读完了,把刚才那个标志清了,以后进中断之后仍然判断是不是A就可以了。重复这样一个过程就行了。至于你发送的是ASCII码或者16进制数都无所谓,反正两边都是你做的,怎么方便怎么来呗
大侠谢谢你帮忙,看来只有大侠你能够帮我了,那个标志位是一个吗?
还是要好多个,我是初学者,不是用来移值的,大侠能否简单的写一下中断服务程序呢?
怎么接受那数据的,就写这几个数据吧?好不,谢谢大&
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
程序给不了你,一个是程序是单位的,不好私下传播,再一个程序比较复杂,也不是在51上用的。估计你一时半 ...
大侠谢谢你帮忙,看来只有大侠你能够帮我了,那个标志位是一个吗?
还是要好多个,我是初学者,不是用来移值的,大侠能否简单的写一下中断服务程序呢?
怎么接受那数据的,就写这几个数据吧?好不,谢谢大侠了!!!!!!!!!
在此非常非常的感谢你!
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
通过UART通信啊
关键是怎么处理中断服务程序,是同时接收吗?
还是一个字节中断一次呢?
你有这方面的程序没有,帮帮忙,好吗?大侠!
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
上下位机需要配合的,还是要自己你设计。
大侠,你有这方面的中断服务程序没有?该怎么处理发送过来的多个字节的数据呢?
是中断一次吗?
还是一个字节中断一次呢?在此谢谢大侠了,帮帮我好吗?
每个字节中断一次。手里没有现成的全局变量,uchar flag,array[14],
中断服务程序中
uchar temp;
temp = 串口数据寄存器名,忘了是什么了
if(flag==0)
在线时间1227 小时
威望11302分
芯币15474枚
E金币115枚
TA的帖子TA的资源
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
大侠,你有这方面的中断服务程序没有?该怎么处理发送过来的多个字节的数据呢?
是中断一次吗?
还是一 ...
每个字节中断一次。手里没有现成的全局变量,uchar flag,array[14],
中断服务程序中
uchar temp;
temp = 串口数据寄存器名,忘了是什么了
if(flag==0)
& && &if(temp==‘A’)
& && &&&flag =1;
& && &&&cnt = 0;
& & array[cnt++] =
& & if(cnt&14)
& && & cnt=0;
& && & flag = 0;
在主程序中
if(flag ==0)
显示的数据从array[]数组中转换成要显示的格式,并发给液晶。
大概思路及程序结构就这样了,具体的语句自己写吧。不自己写永远学不会
帮我看看这程序有什么问题没有?
我已经按了串口助手发送数据,但是时间不刷新不知道怎么回事!程序如下;
#include"DS1302.h"
#include"1602.h"
uchar flag=0;
void main()
SCON=0x50;//串口选&
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
每个字节中断一次。手里没有现成的全局变量,uchar flag,array[14],
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
每个字节中断一次。手里没有现成的全局变量,uchar flag,array[14],
帮我看看这程序有什么问题没有?
我已经按了串口助手发送数据,但是时间不刷新不知道怎么回事!程序如下;
#include&reg51.h&
#include&DS1302.h&
#include&1602.h&
uchar flag=0;
void main()
& & & & SCON=0x50;//串口选择工作方式为1;
& & & & TMOD=0x20;//选择定时器1工作方式2;
& & & & PCON=0x80;//波特率加倍;
& & & & TH1 =0xF3;
& & TL1 =0xF3;//设置定时器1初值,产生4800的波特率;
& & & & ES=1;/*打开串口中断*/
& & & & EA=1;/*打开总中断*/
& & & & TR1=1;//开启定时器1产生波特率;
& & & & LcdInit();
& & & & Ds1302Init();/*1302初始化时间0秒0分12时1日1月星期3,2014年*/
& & & & while(1)
& & & & & & & & if(flag==0)
& & & & & & & & {
& & & & & & & & & & & & Ds1302ReadTime();& & & & /*读取DS1302中的数据到全局变量数组TIME中*/& & & &
& & & & & & & & & & & & LcdWriteCom(0x80+0x40);
& & & & & & & & & & & & LcdWriteData('0'+TIME[2]/16);
& & & & & & & & & & & & LcdWriteData('0'+(TIME[2]&0x0f));
& & & & & & & & & & & & LcdWriteData('-');
& & & & & & & & & & & & LcdWriteData('0'+TIME[1]/16);
& & & & & & & & & & & & LcdWriteData('0'+(TIME[1]&0x0f));
& & & & & & & & & & & & LcdWriteData('-');
& & & & & & & & & & & & LcdWriteData('0'+TIME[0]/16);
& & & & & & & & & & & & LcdWriteData('0'+(TIME[0]&0x0f));
& & & & & & & & & & & & LcdWriteCom(0x80+0x49);
& & & & & & & & & & & & LcdWriteData('0'+(TIME[5]&0x07));
& & & & & & & & & & & & LcdWriteCom(0x80);
& & & & & & & & & & & & LcdWriteData('0'+2);
& & & & & & & & & & & & LcdWriteData('0'+0);
& & & & & & & & & & & & LcdWriteData('0'+TIME[6]/16);
& & & & & & & & & & & & LcdWriteData('0'+(TIME[6]&0x0f));
& & & & & & & & & & & & LcdWriteData('-');
& & & & & & & & & & & & LcdWriteData('0'+TIME[4]/16);
& & & & & & & & & & & & LcdWriteData('0'+(TIME[4]&0x0f));
& & & & & & & & & & & & LcdWriteData('-');
& & & & & & & & & & & & LcdWriteData('0'+TIME[3]/16);
& & & & & & & & & & & & LcdWriteData('0'+(TIME[3]&0x0f));
& & & & & & & & }
void usartconfiguration() interrupt 4
& & & & uchar temp,cnt=0;
& & & & temp=SBUF;
& & & & if(flag==0)
& & & && && & if(temp=='A')
& & & && && & {
& & & && && && &flag=1;
& & & && && && &cnt=0;
& & & && && &}
& & & & else
& & & && &&&TIME[cnt++]=
& & & && &&&if(cnt&6)
& & & && & {& &
& & & && & & & & & & & & & Ds1302Init()/*刷新发送过来的数据*/
& & & && && &&&cnt=0;
& & & && && &&&flag=0;
& & & & & & & && &
& & & && & }
& & & & RI=0;/*接收标志清0*/
在线时间1227 小时
威望11302分
芯币15474枚
E金币115枚
TA的帖子TA的资源
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
你接收完之后就初始化,重新显示初始值了,数据能刷新啊?
Ds1302Init();/*1302初始化时间0秒0分12时1日1月星期3,2014年*/
如果程序没有其他问题直接把这一句去了应该就可以吧
不是的,我这个程序发送数据后没有半点反应啊,Ds1302Init();这个函数是把接受到的数据写入到时钟寄存器里,这时1302才从现在接受到的数据起始变化,[/backcolor]然后数据显示是从[/backcolor]Ds1302ReadTime();函数&
在线时间630 小时
威望1107分
芯币7976枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1107, 距离下一级还需 93 积分
纯净的硅(中级), 积分 1107, 距离下一级还需 93 积分
就是不知道多个数据是一次性发出去呢,还是要一个字节去发送,也就是说我在串口上填了四个十六进制数,
上位机给下位机发送一串字符串我印象中好像做过,楼主你可以这样试下,如果你个串口助手在一串字符串的最后会加上换行符的话,那么就在单片机里面接收的时候判断是否收到换行符,如果收到,说明数据接收完毕,如果没有,就先把当前接收到的数据先保存起来
其实更简单的你可以规定发送字符串的长度
dj的世界一直很好
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
你接收完之后就初始化,重新显示初始值了,数据能刷新啊?
Ds1302Init();/*1302初始化时间0秒0分12时1日1 ...
不是的,我这个程序发送数据后没有半点反应啊,Ds1302Init();这个函数是把接受到的数据写入到时钟寄存器里,这时1302才从现在接受到的数据起始变化,然后数据显示是从Ds1302ReadTime();函数中读取,把他显示在1602液晶上面
在线时间1227 小时
威望11302分
芯币15474枚
E金币115枚
TA的帖子TA的资源
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
你接收数据和显示用同一个数组,肯定会有冲突。
不会的,我不用串口通 信的时候,可以正常的进行显示时间的&
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
你接收数据和显示用同一个数组,肯定会有冲突。
不会的,我不用串口通 信的时候,可以正常的进行显示时间的
冲突是什么意思明白吗?同时出现才叫冲突,其中一个不用当然不会有冲突。孺子不可教也&
在线时间1227 小时
威望11302分
芯币15474枚
E金币115枚
TA的帖子TA的资源
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
裸片初长成(初级), 积分 11302, 距离下一级还需 8698 积分
不会的,我不用串口通 信的时候,可以正常的进行显示时间的
冲突是什么意思明白吗?同时出现才叫冲突,其中一个不用当然不会有冲突。孺子不可教也
在线时间39 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
荣誉会员勋章
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWORLD 官方微信
Powered by查看: 4686|回复: 4
lcd1602通电后,应该显示数据的位置一直一闪闪的跳动,是什么原因呢?接触不良吗?
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间0 小时
lcd1602通电后,应该显示数据的位置一直一闪闪的跳动,是什么原因呢?接触不良吗?
主题帖子精华
在线时间361 小时
是不是设置了光标闪烁?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间0 小时
回复【2楼】Badu_Space:
---------------------------------
不是光标,程序没问题,用别人的lcd能显示,自己的第二行的第一个点阵模块一直在闪
主题帖子精华
在线时间361 小时
回复【3楼】YUNCHENGYU:
---------------------------------
难道LCD1206的问题
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
主题帖子精华
高级会员, 积分 632, 距离下一级还需 368 积分
在线时间0 小时
回复【3楼】YUNCHENGYU:
---------------------------------
贴上图片看看就好找出问题了
"原子哥”推荐 /1
资料包括正点原子开发板全套视频,源码,手册等。原子粉丝请关注公众号。
Powered by基于51单片机的四线接法的1602时钟显示_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于51单片机的四线接法的1602时钟显示
&&基于51单片机的四线接法的1602时钟显示
你可能喜欢已解决问题
自己根据51单片机和液晶屏1602的原理和相关电路图焊接了一个简单的电子时钟,不能正常显示
提问时间: 14:09:32
浏览次数:262
你是做基于单片机的温湿度采集系统吧?如果单纯要显示温湿度,用LCD1602就可以了的。我有一些类似的设计,不知道是否适合你,需要直接找我吧,在线等待,不在的话可以给我留言,看到后马上回复。#include &reg52.h& sbit LED=P1^0;//LED锁存器 sbit SEG=P1^1;//数码管段选锁存器 sbit DIG=P1^2;//数码管位选锁存器 sbit LCDRS=P2^7;//数据指令控制 sbit LCDRW=P2^6;//读写控制 sbit LCDEN=P2^5;//液晶屏使能控制 //**********延时函数,延时n*1ms********* void delay(unsigned char n) { int i, for (i=0; i&br/& //复位端 sbit LCD_RW = P2^5; //写数据端 sbit LCD_EP = P2^7; //使能端 添加读写以及初始化LCD的代码 /****************侧忙函数************************/ BOOL lcd_bz() { BOOL LCD_RS = 0; LCD_RW = 1; LCD_EP = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(P0 & 0x80); //检测P0最高位是否为1 LCD_EP = 0;//返回侧忙结果 } /****************写命令函数************************/ lcd_wcmd(BYTE cmd) { // 写入指令数据到LCD while(lcd_bz()); LCD_RS = 0; LCD_RW = 0; LCD_EP = 0; _nop_(); _nop_(); P0 = //将8位指令通过P0口传给1602 _nop_(); _nop_(); //用于产生一个脉冲宽度 _nop_(); _nop_(); LCD_EP = 1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EP = 0; } lcd_pos(BYTE pos) { //设定显示位置 lcd_wcmd(pos | 0x80); } /****************写数据函数************************/ lcd_wdat(BYTE dat) { //写入字符显示数据到LCD while(lcd_bz()); LCD_RS = 1; LCD_RW = 0; LCD_EP = 0; P0 = //将8位数据通过P0口传给1602 _nop_(); _nop_(); //用于产生一个脉冲宽度 _nop_(); _nop_(); LCD_EP = 1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EP = 0; } lcd_init() { //LCD初始化设定 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay(1); lcd_wcmd(0x0c); //显示开,关光标 delay(1); lcd_wcmd(0x06); //移动光标 delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); } 添加完之后在main函数中添加初始化LCD的函数 例如 void main(void) { BYTE lcd_init();// 初始化LCD delay(10); while(1) { lcd_wcmd(0x06);//向右移动光标 lcd_pos(0);//设置显示位置为第一行的第1个字符 i = 0; tt.XX.number = ? //这边问好表示你需要显示的数据,这样你应该明白怎么做了 //将你的数据赋值给number即可,然后让他显示dis的数据 while(tt.dis1[ i ] != '\0') { lcd_wdat(dis1[ i ]); i++; delay(30);//控制两字之间显示速度 } delay(500);//控制两字之间显示速度 lcd_wcmd(0x01);//清除LCD的显示内容 } } //程序的定义头文件下写这个,主要是省去数据转换这一环节,让自己代码更加快速转换 typedef union { unsigned char dis1[4]; struct { }XX; }TT; idata TT 不懂可继续追问,懒得去看你之前写的那些,就给你提供一下方法。你确定是将程序烧到单片机里面的而不是用keil硬件仿真的吗,如果是烧进去的就只能检测你的初始化程序有没有错误(你说了你的硬件电路没问题的);如果是硬件仿真的话就看看你的设置有没有问题,keil硬件仿真不要勾选串口引发中断,还有就是最好不要用到P3的引脚。
答案创立者
以企业身份回答&
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题基于51单片机定时器的1602液晶显示器时钟显示(带年月日)_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于51单片机定时器的1602液晶显示器时钟显示(带年月日)
&&基于51单片机定时器的1602液晶显示器时钟显示(带年月日)
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩10页未读,
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 单片机lcd1602时钟不动 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信