微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用AVR实现网络调时

用AVR实现网络调时

时间:10-02 整理:3721RD 点击:
单片机:ATMEGA16A-PU,WIFI模块:ESP8266,LCD1602液晶 实现网络调时,IDE是用CVAVR;后端是在Linux平台上开发的!,后端是从网上复制下来的,稍作些修改!
还有许多不完整的地方!希望大神们给出建议!


main.c

  1. #include "lcd.h"
  2. #include "mcu.h"
  3. #include <delay.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. /******************±?á??¨ò? start*****************************/
  8. typedef struct Time{
  9.     unsigned char sec;
  10.     unsigned char min;
  11.     unsigned char hour;
  12.     unsigned char buf[8];     //′??úêy?Y′?′¢
  13.     long int tm;
  14. } Time;

  15. Time t1 = {0, 0, 0, 0, 0};       //3?ê??ˉ?á11ì?
  16. /*
  17. * status ±íê???ê?×′ì?
  18. * 1£o×?·?′??óêüíê±?
  19. * 2£oWiFi?aê?·¢?í
  20. */
  21. static int status = 0;             //×′ì?
  22. /******************±?á??¨ò? end*****************************/

  23. /******************oˉêy?¨ò? start*****************************/
  24. void DisPlay(void){
  25.     DisChar(2, 4, t1.hour/10 + 0x30);
  26.     DisChar(2, 5, t1.hour%10 + 0x30);
  27.     DisChar(2, 6, ':');
  28.     DisChar(2, 7, t1.min/10 + 0x30);
  29.     DisChar(2, 8, t1.min%10 + 0x30);
  30.     DisChar(2, 9, ':');
  31.     DisChar(2, 10, t1.sec/10 + 0x30);
  32.     DisChar(2, 11, t1.sec%10 + 0x30);
  33. }

  34. void Connect(void){
  35.     SREG = 0X00;            //?D??1?±?
  36.     printf("AT+RST\n");     //WiFi????
  37.     delay_ms(5000);         //?óê±5s
  38.     printf("AT+CWJAP=\"CHINA_NET\",\"wulian&CKKJ123\"\n"); //á′?ó??óòí?
  39.     delay_ms(10000);                                        //?óê±5s
  40.     printf("AT+CIPSTART=\"TCP\",\"192.168.0.102\",8086\n");//á′?ó·t???÷
  41.     //delay_ms(500);
  42.     delay_ms(500);                                        //?óê±5s
  43.     SREG = 0X80;            //?D???a??
  44. }

  45. /******************oˉêy?¨ò? end*****************************/

  46. void main(void){
  47.     delay_ms(500);          //μè′yμ??′?è?¨
  48.     McuInit();
  49.     TIMSK = 0X04;           //?aê???ê±
  50.     LcdInit();
  51.     SREG = 0X80;            //è????D??

  52.     while(1){
  53.         DisString(1, 3, "The time is");
  54.         if(status == 0){
  55.             DisPlay();
  56.         }

  57.         if(status == 1){
  58.             /* ′|àí′??ú′?à′μ?êy?μ 101010*/
  59.             t1.tm = atol(t1.buf);
  60.             t1.hour = (unsigned char)(t1.tm / 10000);        //10
  61.             t1.min = (unsigned char)(t1.tm % 10000 / 100);
  62.             t1.sec = (unsigned char)(t1.tm % 10000 % 100);
  63.             status = 0;
  64.         }

  65.         if(status == 2){
  66.             Connect();
  67.             status = 0;
  68.         }
  69.     }
  70. }

  71. //ía2??D??
  72. interrupt [EXT_INT0] void Int0Server(void){
  73.     status = 2;
  74. }

  75. //?¨ê±?÷1?D??·t??oˉêy ?¨ê±1s
  76. interrupt [TIM1_OVF] void TimeServer(void){
  77.     SREG = 0X80;
  78.     TCNT1   = 0xe17b;
  79.     if(++t1.sec == 60){
  80.         t1.sec = 0;
  81.         if(++t1.min == 60){
  82.             t1.min = 0;
  83.             if(++t1.hour == 24){
  84.                 t1.hour = 0;
  85.             }
  86.         }
  87.     }
  88. }

  89. //′??ú?D??oˉêy£??óêü′??úêy?Y
  90. interrupt [USART_RXC] void UartServer(void){
  91.     unsigned char tmp = UDR;        //′??ú′?′¢êy?Y
  92.     static int i = 0, flag = 0;
  93.     SREG = 0X00;
  94.     if(tmp != '\r' && tmp != '\n' && i<7 && flag == 1){
  95.         t1.buf[i] = tmp;
  96.         i++;
  97.     }else{
  98. /*        if(tmp == '\r'){
  99.             t1.buf[i] = '\0';
  100.         }
  101.         if(tmp == '\n'){
  102.             i = 0;
  103.             status = 1;
  104.             LcdInit();
  105.             flag = 0;
  106.         }*/
  107.         if( i == 7 ){
  108.             t1.buf[i] = '\0';
  109.             i = 0;
  110.             status = 1;
  111.             LcdInit();
  112.             flag = 0;
  113.         }
  114.     }
  115.     if(tmp == ':') flag = 1;
  116.     SREG = 0X80;
  117. }

复制代码

lcd.c

  1. #include "lcd.h"
  2. #include <delay.h>

  3. void write_com(unsigned char com){
  4.     RESETBIT(PORTA,1);
  5.     PORTC   = com;
  6.     delay_ms(5);
  7.     SETBIT(PORTA,0);
  8.     delay_ms(5);
  9.     RESETBIT(PORTA,0);
  10. }

  11. void write_data(unsigned char Data){
  12.     SETBIT(PORTA,1);
  13.     PORTC   = Data;
  14.     delay_ms(5);
  15.     SETBIT(PORTA,0);
  16.     delay_ms(5);
  17.     RESETBIT(PORTA,0);
  18. }

  19. void DisChar(unsigned char Row, unsigned char Col, unsigned char Ch){
  20.     switch(Row){
  21.         case 1: write_com(0x80 + Col); break;     //μúò?DD
  22.         case 2: write_com(0xc0 + Col); break;     //μú?tDD
  23.     }
  24.     write_data(Ch);
  25.     delay_ms(2);
  26. }

  27. void DisString(unsigned char Row, unsigned char Col, unsigned char *Str){
  28.    unsigned char i = 0;

  29.     for( i=0; Str[i]!='\0'; i++, Col++ ){
  30.         switch(Row){
  31.             case 1: write_com(0x80 + Col); break;     //μúò?DD
  32.             case 2: write_com(0xc0 + Col); break;     //μú?tDD
  33.         }
  34.         write_data(Str[i]);
  35.         delay_ms(2);
  36.     }
  37. }

  38. void LcdInit(void){
  39.     RESETBIT(PORTA,0);
  40.     write_com(0x38);
  41.     write_com(0x0c);
  42.     write_com(0x06);
  43.     write_com(0x01);
  44. }

复制代码


lcd.h

  1. #ifndef _LCD_H_
  2. #define _LCD_H_

  3. #include <mega16.h>
  4. #define SETBIT(A,B)     A|=(1<<B)
  5. #define RESETBIT(A,B)   A&=~(1<<B)

  6. void write_com(unsigned char);

  7. void write_data(unsigned char );

  8. void LcdInit(void);

  9. void DisChar(unsigned char , unsigned char , unsigned char );

  10. void DisString(unsigned char , unsigned char , unsigned char *);

  11. #endif

复制代码


mcu.c

  1. #include <mega16.h>

  2. void PortInit(void){
  3.     DDRA    = 0XFF;
  4.     PORTA   = 0XFF;
  5.     DDRC    = 0XFF;
  6.     PORTC   = 0XFF;
  7.     DDRD    = 0X02;
  8.     PORTD   = 0XFF;
  9. }

  10. void T0Init(void){
  11.     TCCR1B    = 0X05;     //1024·??μ
  12.     TCNT1   = 0xe17b;   //?óê±1s
  13. }

  14. void UartInit(void){
  15.     UCSRB = 0X00;        //???1·¢?íó??óê?
  16.     UCSRA = 0X82;        //±??ù
  17.     UCSRC = 0X06;        //8??êy?Y??
  18.     UBRRL = 0X67;        //2¨ì??ê9600
  19.     UBRRH = 0X00;
  20.     UCSRB = 0X98;
  21. }

  22. void Ex0Init(void){
  23.     MCUCR |= 0x02;    // INT0 ???μ??′¥·¢
  24.     GICR  |= 0X40;
  25. }

  26. void McuInit(void){
  27.     PortInit();
  28.     T0Init();
  29.     UartInit();
  30.     Ex0Init();
  31. }

复制代码


mcu.h

  1. #ifndef _MCU_INIT_H_
  2. #define _MCU_INIT_H_

  3. void PortInit(void);

  4. void T0Init(void);

  5. void UartInit(void);

  6. void Ex0Init(void);

  7. void McuInit(void);

  8. #endif

复制代码


服务器代码:

  1. /*************************************
  2. 文件名: server.c  
  3. linux 下socket网络编程简例  - 服务端程序
  4. 服务器端口设为 0x8888   (端口和地址可根据实际情况更改,或者使用参数传入)
  5. 服务器地址设为 192.168.1.104
  6. 作者:kikilizhm#163.com (将#换为@)
  7. */  
  8.   
  9. #include <stdlib.h>  
  10. #include <sys/types.h>  
  11. #include <stdio.h>
  12. #include <time.h>
  13. #include <sys/socket.h>  
  14. #include <cygwin/in.h>  
  15. #include <string.h>  
  16.   
  17. int main()  
  18. {  
  19.         int sfp,nfp; /* 定义两个描述符 */  
  20.         struct sockaddr_in s_add,c_add;  
  21.         int sin_size;
  22.         time_t nowtime;
  23.         struct tm *timeinfo;
  24.         int hour, min, sec;
  25.         char buf[7];  
  26.         unsigned short portnum=8086; /* 服务端使用端口 */  
  27.           
  28.         sfp = socket(AF_INET, SOCK_STREAM, 0);  
  29.         if(-1 == sfp)  
  30.         {  
  31.             printf("socket fail ! \r\n");  
  32.             return -1;  
  33.         }  
  34.         //printf("socket ok !\r\n");  
  35.           
  36.         /* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */  
  37.         bzero(&s_add,sizeof(struct sockaddr_in));  
  38.         s_add.sin_family=AF_INET;  
  39.         s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */  
  40.         s_add.sin_port=htons(portnum);  
  41.         /* 使用bind进行绑定端口 */  
  42.         if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))  
  43.         {  
  44.             printf("bind fail !\r\n");  
  45.             return -1;  
  46.         }  
  47.         //printf("bind ok !\r\n");  
  48.         /* 开始监听相应的端口 */  
  49.         if(-1 == listen(sfp,5))  
  50.         {  
  51.             printf("listen fail !\r\n");  
  52.             return -1;  
  53.         }  
  54.         //printf("listen ok\r\n");  
  55.           
  56.         while(1)  
  57.         {  
  58.         sin_size = sizeof(struct sockaddr_in);  
  59.         /* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,
  60.            不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。
  61.            此处accept的第二个参数用于获取客户端的端口和地址信息。
  62.             */  
  63.         nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);  
  64.         if(-1 == nfp)  
  65.         {  
  66.             printf("accept fail !\r\n");  
  67.             return -1;  
  68.         }  
  69.         //printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));  
  70.         printf("有人链接了!\n");
  71.         sleep(8);
  72.         time( &nowtime );
  73.         timeinfo = localtime( &nowtime );
  74.         hour = timeinfo->tm_hour;
  75.         min = timeinfo->tm_min;
  76.         sec = timeinfo->tm_sec;
  77.         sprintf(buf, "%d%d%d", hour, min, sec);

  78.         /* 这里使用write向客户端发送信息,也可以尝试使用其他函数实现 */  
  79.         if(-1 == write(nfp,buf,sizeof(buf)))  
  80.         {  
  81.             printf("write fail!\r\n");  
  82.             return -1;  
  83.         }  
  84.         printf("write ok!\r\n");  
  85.         close(nfp);  
  86.           
  87.         }  
  88.         close(sfp);  
  89.         return 0;  
  90. }

复制代码


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top