如何通过串口修改时钟的时间

请问大神们如何在这个程序里添加串口来改变时钟啊
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
//此表为 LED 的字模, 共阴数码管 0-9 -
uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
/*定义并初始化变量*/
uchar seconde=0;//秒
uchar minite=0;//分
uchar hour=12; //时
uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1
uchar shi=0;//闹铃功能
uchar fen=0;
uchar bjcs;//报警次数
sbit P1_0=P1^0; //second 调整定义
sbit P1_1=P1^1; //minite调整定义
sbit P1_2=P1^2; //hour调整定义
sbit P1_5=P3^0; //整点报时
sbit P1_3=P1^3; //闹铃功能,调整时间
sbit P1_6=P1^6; //调整时
sbit P1_7=P1^7; //调整分
sbit P1_4=P1^4; //关闭闹铃

/*函数声明*/
void delay(uint k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序

/*延时子程序*/
void delay (uint k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}

/*时间处理子程序*/
void time_pro(void)
{
if(seconde==60)
{
seconde=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
/*显示子程序*/
void display(void)
{
if(P1_3==1)
{
P2=0XFE;
P0=dispcode[seconde%10];//秒个位
delay(1);
P2=0XFD;
P0=dispcode[seconde/10];//秒十位
delay(1);
P2=0XFB;
P0=dispcode[10];//间隔符 -
delay(1);
P2=0XF7;
P0=dispcode[minite%10];//分个位
delay(1);
P2=0XEF;
P0=dispcode[minite/10];//分十位
delay(1);
P2=0XDF;
P0=dispcode[10];//间隔符 -
delay(1);
P2=0XBF;
P0=dispcode[hour%10];//时个位
delay(1);
P2=0X7F;
P0=dispcode[hour/10];//时十位
delay(1);
}
}
/*键盘扫描子程序*/
void keyscan(void)
{
if(P1_0==0)//秒位的调整
{
delay(30);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{
seconde=0;
}
}
delay(250);
}
if(P1_1==0)//分位的调整
{
delay(30);
if(P1_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
}
delay(250);
}
if(P1_2==0)//时位的调整
{
delay(30);
if(P1_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
delay(250);
}
}
/*整点报警*/
void zhengdian (void)
{
if((seconde==0)&(minite==0))//整点报时
{
P1_5=0;
delay(1000);
P1_5=1;
}
}
/*定时闹钟*/
void dingshi(void)
{
if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
{
P2=0XFE;
P0=dispcode[0];//秒个位
delay(1);
P2=0XFD;
P0=dispcode[0];//秒十位
delay(1);
P2=0XFB;
P0=dispcode[10];//间隔符 -
delay(1);
P2=0XF7;
P0=dispcode[fen%10];//分个位
delay(1);
P2=0XEF;
P0=dispcode[fen/10];//分十位
delay(1);

P2=0XDF;
P0=dispcode[10];//间隔符 -
delay(1);

P2=0XBF;
P0=dispcode[shi%10];//时个位
delay(1);
P2=0X7F;
P0=dispcode[shi/10];//时十位
delay(1);
}
if(P1_6==0)//设定时
{
delay(30);
if(P1_6==0)
{
shi++;
if(shi==24)
{
shi=0;
}
}
delay(250);
}
if(P1_7==0)//设定分
{
delay(30);
if(P1_7==0)
{
fen++;
if(fen==60)
{
fen=0;
}
}
delay(250);
}
if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警六十次。
{
for(bjcs=0;bjcs<60;bjcs++)
{
P1_5=0;
delay(500);
P1_5=1;
delay(500);
}
}
}
/*主函数*/
void main(void)
{
P1=0XFF;
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值,50ms
TL0=0xb0;
EA=1; //总中断开
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while (1)
{

keyscan(); //按键扫描
dingshi();//定时闹钟
zhengdian();//整点报时
display(); //显示时间
}
}

void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次
{
TH0=0x3c; //手动加载计数脉冲次数
TL0=0xb0;
TMOD=0x11;
mstcnt++; //用于计算时间,每隔50ms加1
if(mstcnt==20)//mstcnt满20即为一秒
{
seconde++;//秒+1
time_pro( ); //时间处理
mstcnt=0; //对计数单元的清零,重新开始计数
}

}

0

3个回答

1

你定义了几个系统变量
uchar seconde=0;//秒
uchar minite=0;//分
uchar hour=12; //时
通过串口修改这些变量,就可以达到你要的目的。
首先,你得编写串口初始化,使能串口,规定串口硬件协议内容如波特率、数据位停止位、奇偶校验,这个必须串口双方一致。
其次,你得自己做一个数据传输协议,类似传统的串口AT命令集,比如规定字符串“ho”前缀为调整hour,“se”前缀为调整seconde----,并确定每次传输的字节数,这个可以通过你定义的前缀字符串和被调整目标单元字长确定。这里比如定义了前缀为2个char.目标单元为一个char,校验补数为一个char。那么每次约定的传输就是4个字节。
为了保险,最好有一个约定的校验,比如校验和=0只有控制符+目标数据+校验补数的校验和=0,才是合法数据,等等。
单片机打开串口接受中断,在收到字符串后,进行上述判断校验后,直接可以控制时分秒目标单位的值就可以了,

1

首先你这个一看就知道是51单片机的程序,你得要先考虑掉电保持这个功能,可以外接一个eeprom来保存数据(通常是i2c)保存数据,你可以通过。
还有51单片机如果要用来做时钟的话,最后在外部家一个rtc时钟模块,这样连eeprom都不需要了。
假如你都不想用,也是有办法的:
可以将芯片内部rom空间开辟一些空间出来存储时钟数据。然后不断的更新那个地方的数据。你串口接受到的时钟数据修改运行时读取的内存数据便可

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
时钟五:用串口发送时间,实现闹钟
主文件函数: #include #include "./delay/delay.h" #define PORTLEN P0 #define KEYPORT P1 sbit bit_select = P2^0; sbit seg_select = P2^1; sbit beem = P3^2; unsigned char code SONG_TONE[]={239,239,212,189
【单片机】串口修改数码管时间
串口修改数码管时间
用串口UART0显示时钟
#include #define rled P1_0 #define gled P1_1 /*变量定义和赋值*******************************/ char time[3]={10,44,55};    //时间初值 char recdata[10];           //串口接收到的数据 char senddata[10]="00:00:00  "
uboot中串口时钟频率及波特率的设置
本人使用的uboot版本为uboot2012,采用的串口是NS16550,在include/configs/***.h(即板子对应的config文件)中,添加了以下配置选项: /*NS16550 Configuration*/ #define CONFIG_SYS_NS16550 #define CONFIG_SYS_NS16550_SERIAL #define CONFIG_SYS_NS
迪文DGUS屏如何实现显示上电运行时间和总运行时间
DGUS1的屏有一个上电运行时间的寄存器,占用4个字节空间,这个寄存器里面的时间是BCB编码, 我们屏上面显示的时候可以用时间变量,也是就是16进制变量直接调取出来显示,这样直接就能调用 这个程序是怎么显示上电运行时间,和将总运行时间保存到数据的写法。 因为数据擦写寿命限制,理论寿命10万次, 经过本人几次测试某段地址的擦写情况,实际寿命只有5-8万次,运气不好可能3万次左右, 我们这里...
51单片机数码管时钟 并可以通过串口修改接收时间
可以通过独立按键修改时钟 也可以通过串口通讯修改接收时间 已经测试并且成功
ds1302显示时间(通过串口调试助手)
ds1302显示时间(通过串口调试助手)内容讲解的很详细,如果有疑问或是发现错误,希望可以告诉我,谢谢
arm-linux内核中串口时钟频率及波特率的设置
本人使用的内核版本为linux-2.6.32,采用的ARM处理器为cortex-A8,采用的串口为NS16550。串口的驱动直接编译在内核中,当需要修改串口的时钟频率和波特率的时候, 需要修改以下地方。 1、在板子平台目录下平台相关的头文件路径下串口的头文件中,即arch/arm/mach-***/include/mach/ns16550.h中修改以下宏定义即可修改串口的时钟频率 #defin
ds1302显示时间(通过串口调试助手)---C语言版本
ds1302显示时间(通过串口调试助手--C语言版本详细内容请下载地址:http://download.csdn.net/detail/chenqiai0/4488523 /*ds1302显示时间(通过串口调试助手)*/ #include #include typedef unsigned char uint8; typedef unsigned int uint16; sbit SD
基于stm32f103的lcd按键可修改时间闹钟
LCD显示 按键修改实时时间 stm32F103 keil5
nRF51822外设时钟之串口时钟
在使用串口配置的时候吗,发现前辈们并没有像STM32那样配置GPIO引脚的速度,甚是奇怪,找到参考手册关于时钟管理的,发现并没有关于串口时钟的配置要求,然后就翻到数据手册,OMG,终于真身现形了,原来串口外设要使用HFCLK,即高频时钟,即外接的高频晶振时钟,而51822的外接高频晶振时钟只能是16M或者32M,这里本人使用16M,那么显然UART使用的16M的时钟源! 在 nRF51_
基于arm的电子相册
功能:电子现相册,rtc时钟显示,通过串口修改照片切换时间,通过按键修改rtc时钟 文字的打印使用字库实现
系统时钟与URAT(串口)实验
系统时钟,台式机CPU可以跑:1GB 、2GB的赫兹的频率,而我们买的内存跑的频率可能只有133MB赫兹;同样的道理,对于2440的开发板的CPU可以达到400M HZ,而SDRAM的频率范围为:100M-133M HZ,而URAR的频率为 50M HZ; CPU、SDRAM、UART的频率的分别叫:FCLK、HCLK、PCLK;2440的结构是一个SOC(System on chip)的结构;整
为何串口通信中接收端采样时钟频率是传输的波特率的16倍
为何串口通信中接收端采样时钟频率是传输的波特率的16倍? 增强抗干扰是原因之一 标准UART可以选16倍采样,也可以选64倍采样,个人觉得应该是方便分频设计. 标准UART的RXD前端有一个"1到0跳变检测器",当其连续接受到8个RXD上的地电平时,该检测器就认为RXD线出现了起始位,进入接受数据状态.在接受状态,接受控制器对数据位7,8,9三个脉冲采样,并遵从三中取二的原则确定最终值.
移植uboot第三步:修改时钟
这个步骤弄死我了,弄了一宿,有很多原因,老是这里那里有问题。 因为是基于s3c2410改的boot,2410和2440在使用上区别不大,所以暂时修改不大。 1.还是从start.S依次往下看。 a.设置管理模式的代码都没有条件编译,肯定差不多,跳过。 b.关闭看门狗的条件编译是CONFIG_S3C24X0,都一样的,跳过 c.设置分频,这里需要改,2410和2440有区别。(先做个标记)
ZigBee切换系统高频时钟+串口的使用
1,ZigBee切换系统高频时钟步骤     一,让2个高频时钟源启振     二,等待目标时钟源震荡稳定     三,延时63us以上     四,设置输出分频(一般不分频)     五,选中目标高频时钟源作为系统主时钟     六,确认一下当前工作的系统时钟是不是所选的高频时钟 知道这些之后我们就来认识一下涉及到的寄存器 好了,有了以上寄存器我们就可以配置时钟了...
迪文的DGUS屏-如何在屏幕上显示时间
迪文的DGUS屏-如何在屏幕上显示时间
stm32修改系统时钟经验
在使用stm32开发的过程中,有时需要手动修改系统时钟参数,使板子上的晶振和目标系统时钟匹配。在此记录一下对时钟配置代码的理解。 1.需要修改的文件:system_stm32f0xx.c、stm32f0xx.h 2.system_stm32f0xx.c文件里面,如果有PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */这种宏定义参数(例如F...
DS1307实时时钟的51单片机驱动程序(串口显示)
51单片机IO口模拟IIC驱动DS1307实时时钟,时钟数据通过串口打印。本人自用代码,非网络下载,保证100%可用!
RTC时间在LCD上显示需注意的问题
unsigned char displayTime[2]; rtc->day= ReadRtc(); displayTime[0]=0x30+(rtc->day/16); displayTime[1]=0x30+(rtc->day%16); DisPlayTime(1,0,displayTime); BCD码转十进制:rtc->day/16; 十进制转ASCII码:0x30+(rtc->day%1
时钟一:51单片机用替换的方法在数码管上显示时钟
主文件clock.c: #include #include "./delay/delay.h"#define PORTLEN P0sbit bit_select = P2^0;sbit seg_select = P2^1;unsigned char src[8] = {0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f};unsigned char qrc[8] =
stm32f103和时钟芯片ds1302
stm32f103控制时钟芯片ds1302,通过串口显示时间........................................................................................................................................................................................................................................
单片机时钟可通过矩阵键盘或串口修改时间
单片机时钟可通过矩阵键盘或串口修改时间
树莓派修改时间
sudo dpkg-reconfigure tzdata选择亚洲-&amp;gt;选择上海data查看时间
单片机现可以通过独立按键调整时间的数字钟
用汇编语言实现,包含了LED显示模块,LCD显示模块,时钟芯片1302使用,通过独立按键调整时间等功能
02-JZ2440裸机学习之系统时钟和UART串口实验
1、S3C2440的系统时钟 笔记本CPU可以 1G 2G ,内存133M等 2440CPU:400MHz -------FCLK SDRAM:100M/133M----- HCLK 串口IIC: -------------------PCLK 定时器:---------------------PCLK   通过设置时钟寄存器(称为PLL),把晶振频率变为其他频率,12变为400MH
STM32 UART/USART初始化时钟使能
在学习STM32的过程中,我们通常会遇到使能时钟。例如在uart_init()的函数中,我们要使能串口: RCC->APB2ENR|=1RCC->AHB1ENR|=1 //使能porta的时钟 简而言之,就是让串口1和PA口工作。但是为什么使能之后就能工作了呢,我们可以查看手册,扎到STM32的系统框架图(原子哥的资料里有) AHB (Advanced High performanc
使用DS3231SN制作数字时钟
DS3231SN
配置 Windows 时间服务以使用内部硬件时钟
我们强烈建议您将权威时间 服务器配置为从硬件源中获取时间。当您将权威时间服务器配置为与 Internet 时间源同步时,不会有任何身份验证。要配置 Windows 时间服务以使用内部硬件时钟,请按照下列步骤操作:单击“开始”,单击“运行”,键入 regedit, 然后单击“确定”。找到并单击下面的注册表子项:HKEY LOCAL MACHINE/SYSTEM/CurrentCo
ARM基本接口之实时时钟+看门狗实验
  实验名称:看门狗实验(结合实时时钟)实验目的和内容:1. 了解实时时钟,实现每秒显示实时时钟和每分钟的第n秒告警(结合中断)2. 了解看门狗,在保证系统正常运行,一旦出现系统瘫痪等问题时,恢复系统的正常运行。设系统程序完整运行一周期时间为Tp(喂狗时间),看门狗的定时周期(狗粮能吃的时间)为Ti,则必须满足Ti&amp;gt;Tp。  实验过程(含步骤):1.新建工程:参照watchdog设置,在C/...
关于STM32F1系列的时钟配置和自定义BootLoader升级的问题
    对于STM32F1的V3.5的固件库,单片机在上电的时候,会在启动文件中自动调用系统初始化函数,即在启动文件中会有这样一段代码    Reset_Handler   PROC    EXPORT  Reset_Handler             [WEAK]    IMPORT  __main    IMPORT  SystemInit    LDR     R0, =SystemIn...
自制一个串口带时钟的加密狗
首先是器件选型问题:MCU    选一个 STC12C5A16S2 LQFP 44       其实就是51单片机,如果你没有玩过51单片机,就把它理解成一台超微型的电脑主机就可以了,里面有Flash存储器(可以理解成PC的硬盘,不过空间不大),还有RAM(可以理解成PC的内存,当然空间也不大)等等。至于为什么选STC这个品牌呢,因为烧写程序接口容易定义,直接用串口就可以进行程序的烧写了,所以选择用STC。为什么用12C5A系列呢,因为它的速度要比89C系列快,还有12T的模式,为什么要选16S2型号呢,因
迪文DGUS屏利用os实现RTC的星期换成中文的改进版os
; DWIN OS LDBR R10,0,16 MOVDR 23H,R13,1 ;DGUS屏的23寄存器给到os寄存器R13放星期0-6表示 日、一、二、。。。六 LDWR R16,2 ;乘以2,这里用乘法是用查表的字节 MAC R10,R14,R18 ;乘积放入了os寄存器8个 18 19 20 21 22 23 24 25 LDADR TAB2 ...
关于RTC时钟修改设置时间日期后,时间修改了,日期修改不生效的情况(附解决方法)
一开始找了很久,以为是设置时间的时候,时间写进去,而日期没写进去,一直在找没有写进去的原因,后来通过看数据,才发现数据是写进去了,但是读不出来,然后给它又读了一次,结果就正常读出来了,原因不详,网上也没找到原因. 找到问题了@note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values ,在...
ESP32 各种时钟参数值设置
头文件:esp-idf/components/soc/esp32/inclued/soc/soc.h //Periheral Clock {{ #define APB_CLK_FREQ_ROM ( 26*1000000 ) #define CPU_CLK_FREQ_ROM APB_CL...
Linux时钟介绍和修改系统时间
http://www.itpub.net/thread-233738-1-1.html http://blog.itpub.net/post/5700/493847
STM32之RTC实时时钟
RTC实时时钟简介: STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运行来看,它是STM32中唯一一个具有这个功能功能的外设.(RTC外设的复杂之处不在于它的定时,而在于它掉电还可以继续运行的特性) 所谓掉电,是指电源Vpp断开的情况下,为了RTC外设掉电可以
串口屏动态实时显示时间
stm32F103开启内部RTC功能,将时间实时上传串口屏实现机屏同步功能。。
时钟七:在LCD1602上显示时钟,并且用按键修改时间
主函数文件: #include #include "./delay/delay.h" sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; sbit beem = P3^2; #define LCDPORT P0 #define KEYPORT P1 #define LCD_WRITE_DATA 1 #define LCD_WRITE_COM 0
linux下hwclock不能同步时间到硬件时钟
问题:        linux(redhat6.5)下hwclock不能同步时间到硬件时钟 修改原因:        硬件时钟是存储在CMOS里的时钟,关机后该时钟依然运行,主板的电池为它供电。那个时钟依照主板石英晶体振荡器频率工作,在启动系统后,系统从该时钟读取时间信息,之后独立运行。当调整系统时钟或与internet同步后,不会改变硬件时钟,下次启动又会变成硬件时钟的时间。 操作记录: ...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 如何通过源码学习java python电子时钟教程