STM32实时时钟RTC按键修改时间

2019-07-30 12:57

User文件夹下main.c #include \#include \ #include \ #include \ #include \#include \#include \#include \#include \#include \

#include \ #include \#include \ #include \#include \#include \#include \#include \ #include \ #include \ #include \

//Mini STM32开发板扩展实验21 //ENC28J60网络模块 实验 //正点原子@ALIENTEK

//技术论坛:www.openedv.com //广州市星翼电子科技有限公司 void uip_polling(void); void Display_Time(void); void received_date(u8 *str);

u16 Process_date(u8 q,u8 b,u8 s,u8 g);

#define BUF ((struct uip_eth_hdr *)&uip_buf[0]) u8 t,Addres_1=10,Addres_2=1,Addres_3=168,Addres_4=192; int main(void) { Stm32_Clock_Init(9); //系统时钟设置 //usart_init(72,9600); //串口初始化为9600 USART3_Init(36,9600); USART2_Init(36,9600); delay_init(72); //延时初始化 LED_Init(); //初始化与LED连接的硬件接口 LCD12864_InitPort(); //初始化LCD LCD12864_Init();

//KEY_Init(); //初始化按键 RTC_Init(); //初始化RTC // usmart_dev.init(72); //初始化USMART EXTIX_Init();

while(tapdev_init()) //初始化ENC28J60错误 { LCD_ShowString(3,0,\ delay_ms(200); LCD12864_Clr();//清除之前显示 }; uip_init(); //uIP初始化

uip_ipaddr(ipaddr, 192,168,1,10); //设置本地设置IP地址 uip_sethostaddr(ipaddr);

uip_ipaddr(ipaddr, 192,168,1,1); //设置网关IP地址(其实就是你路由器的IP地址) uip_setdraddr(ipaddr); uip_ipaddr(ipaddr, 255,255,254,0); //设置网络掩码 uip_setnetmask(ipaddr); uip_listen(HTONS(1200)); //监听1200端口,用于TCP Server uip_listen(HTONS(80)); //监听80端口,用于Web Server tcp_client_reconnect(); //尝试连接到TCP Server端,用于TCP Client while (1) { Display_Time(); uip_polling(); //处理uip事件,必须插入到用户程序的循环体中 // key=KEY_Scan(); if(tcp_client_tsta!=tcp_client_sta)//TCP Client状态改变 { if(tcp_client_sta&(1<<7)) { LCD_ShowString(3,0,\接收数据:\ disp_IP(); } else

{ LCD_ShowString(3,0,\已断开! \ disp_IP(); } if(tcp_client_sta&(1<<6)) //收到新数据 { //LCD12864_Clr(); //清除之前显示 received_date(tcp_client_databuf); tcp_client_sta&=~(1<<6); } tcp_client_tsta=tcp_client_sta; }

delay_ms(1);

usart3_Receive_Process(); } }

//uip事件处理函数

//必须将该函数插入用户主循环,循环调用. void uip_polling(void) { u8 i; static struct timer periodic_timer, arp_timer; static u8 timer_ok=0; if(timer_ok==0)//仅初始化一次 { timer_ok = 1; timer_set(&periodic_timer,CLOCK_SECOND/2); //创建1个0.5秒的定时器 timer_set(&arp_timer,CLOCK_SECOND*10); //创建1个10秒的定时器 } uip_len=tapdev_read(); //从网络设备读取一个IP包,得到数据长度.uip_len在uip.c中定义 if(uip_len>0) //有数据 { //处理IP数据包(只有校验通过的IP包才会被接收) if(BUF->type == htons(UIP_ETHTYPE_IP))//是否是IP包? { uip_arp_ipin(); //去除以太网头结构,更新ARP表 uip_input(); //IP包处理 //当上面的函数执行后,如果需要发送数据,则全局变量 uip_len > 0 //需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量) if(uip_len>0)//需要回应数据 { uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求 tapdev_send();//发送数据到以太网 } }else if (BUF->type==htons(UIP_ETHTYPE_ARP))//处理arp报文,是否是ARP请求包? { uip_arp_arpin(); //当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0 //需要发送的数据在uip_buf, 长度是uip_len(这是2个全局变量) if(uip_len>0)tapdev_send();//需要发送数据,则通过tapdev_send发送 } }else if(timer_expired(&periodic_timer)) //0.5秒定时器超时 { timer_reset(&periodic_timer); //复位0.5秒定时器

//轮流处理每个TCP连接, UIP_CONNS缺省是40个 for(i=0;i0 //需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量) if(uip_len>0) { uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求 tapdev_send();//发送数据到以太网 } }

#if UIP_UDP //UIP_UDP //轮流处理每个UDP连接, UIP_UDP_CONNS缺省是10个 for(i=0;i0 //需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量) if(uip_len > 0) { uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求 tapdev_send();//发送数据到以太网 } } #endif //每隔10秒调用1次ARP定时器函数 用于定期ARP处理,ARP表10秒更新一次,旧的条目会被抛弃 if(timer_expired(&arp_timer)) { timer_reset(&arp_timer); uip_arp_timer(); } } }

void Display_Time(void) { if(t!=timer.sec) { t=timer.sec; LCD_ShowString(1,5,\星期\ LCD_ShowString(0,3,\ LCD_Shownum(0,4,(timer.w_year0)); LCD12684_Wdat(0x2d); LCD_Shownum1(timer.w_month); LCD12684_Wdat(0x2d);

LCD_Shownum1(timer.w_date); switch(timer.week) { case 0:LCD_ShowString(1,7,\日\ case 1:LCD_ShowString(1,7,\一\ case 2:LCD_ShowString(1,7,\二\ case 3:LCD_ShowString(1,7,\三\ case 4:LCD_ShowString(1,7,\四\ case 5:LCD_ShowString(1,7,\五\ case 6:LCD_ShowString(1,7,\六\ } LCD_Shownum(1,0,timer.hour); LCD12684_Wdat(0x3a); LCD_Shownum1(timer.min); LCD12684_Wdat(0x3a); LCD_Shownum1(timer.sec); } }

void received_date(u8 *str) { u8 len; len=(u8)strlen(str); switch(len) { case 13: Addres_4= (u8)Process_date(0,(str[0]-0x30),str[1],str[2]); Addres_3= (u8)Process_date(0,(str[4]-0x30),str[5],str[6]); Addres_2=(u8)Process_date(0,0,str[8],str[9]); Addres_1=(u8)Process_date(0,0,str[11],str[12]); uip_ipaddr(ipaddr, Addres_4,Addres_3,Addres_2,Addres_1); //设置本地设置IP地址 uip_sethostaddr(ipaddr); tcp_client_reconnect(); disp_IP(); break; case 19:RTC->CRH&=~(0X01);

while(!(RTC->CRL&(1<<5))); //等待RTC寄存器操作完成

timer.w_year=(s16)Process_date(str[0]-0x30,str[1]-0x30,str[2],str[3]); timer.w_month=(s8)Process_date(0,0,str[5],str[6]); timer.w_date=(s8)Process_date(0,0,str[8],str[9]); timer.hour=(s8)Process_date(0,0,str[11],str[12]); timer.min=(s8)Process_date(0,0,str[14],str[15]); timer.sec=(s8)Process_date(0,0,str[17],str[18]);

RTC_Set(timer.w_year,timer.w_month,timer.w_date,timer.hour,timer.min,timer.sec); //设置时间


STM32实时时钟RTC按键修改时间.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:北京理工大学882电路信号系统

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: