打印

IOT设计!

[复制链接]
1473|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Diyer2015|  楼主 | 2016-12-18 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Diyer2015|  楼主 | 2016-12-18 11:37 | 只看该作者
原理图

QQ截图20161218113205.jpg (283.93 KB )

QQ截图20161218113205.jpg

使用特权

评论回复
板凳
Diyer2015|  楼主 | 2016-12-18 11:45 | 只看该作者
原理图PDF

Sheet1.pdf

347.96 KB

使用特权

评论回复
地板
Diyer2015|  楼主 | 2016-12-18 11:46 | 只看该作者
截图 LAYOUT

1.jpg (191.16 KB )

1.jpg

使用特权

评论回复
5
Diyer2015|  楼主 | 2016-12-18 11:46 | 只看该作者
layout

2.jpg (177.46 KB )

2.jpg

使用特权

评论回复
6
Diyer2015|  楼主 | 2016-12-18 11:50 | 只看该作者
上面是硬件资料

下面续传一下 PCB 的PDF

使用特权

评论回复
7
Diyer2015|  楼主 | 2016-12-18 11:51 | 只看该作者
#ifndef AT24C64_H
#define AT24C64_H
//
#include <Driver\DrvI2C.H>
#include "MYFUN\MYFUN.H"

//写数值到24C64
void Write_24LC64(uint32_t address, uint8_t data)
    {
    uint32_t u32HCLK, m;
    u32HCLK = DrvSYS_GetHCLK() * 1000;

    //Open I2C0 and set clock = 50Kbps
    DrvI2C_Open(I2C_PORT0, u32HCLK, 20000);

    //send i2c start
    DrvI2C_Ctrl(I2C_PORT0, 1, 0, 0, 0); //set start
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send writer command
    I2C0->DATA = 0XA0; //send writer command
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); //clr si flag
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send address high
    I2C0->DATA = (address >> 8) & 0XFF;
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); //clr si and set ack
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send address low
    I2C0->DATA = address & 0XFF;
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); //clr si and set ack
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send data
    I2C0->DATA = data; //write data to
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); //clr si and set ack
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send i2c stop
    DrvI2C_Ctrl(I2C_PORT0, 0, 1, 1, 0); //send stop

    //while( I2C0->CON.SI == 0 );
    for (m = 0; m < 60; m++)
        ;
    DrvI2C_Close(I2C_PORT0);
    for (m = 0; m < 6000; m++)
        ;
    }

//读数值到24C64
uint8_t Read_24LC64(uint32_t address)
    {
    uint8_t TEMP;
    uint32_t u32HCLK;

    //Open I2C0 and set clock = 50Kbps
    u32HCLK = DrvSYS_GetHCLK() * 1000;
    DrvI2C_Open(I2C_PORT0, u32HCLK,10000);

    //send i2c start
    DrvI2C_Ctrl(I2C_PORT0, 1, 0, 1, 0); //set start
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send writer command
    I2C0->DATA = 0XA0;
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); //clr si
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send address high
    I2C0->DATA = (address >> 8) & 0XFF;
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); //clr si and set ack
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send address low
    I2C0->DATA = address & 0XFF;
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); //clr si        and set ack
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send start flag
    DrvI2C_Ctrl(I2C_PORT0, 1, 0, 1, 0); //clr si and send start
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //send read command
    I2C0->DATA = 0XA1;
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); //clr si
    while (I2C0->CON.SI == 0)
        ; //poll si flag

    //resive data
    I2C0->DATA = 0XFF;
    DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); //clr si
    while (I2C0->CON.SI == 0)
        ; //poll si flag
    TEMP = I2C0->DATA;

    //send i2c stop
    DrvI2C_Ctrl(I2C_PORT0, 0, 1, 1, 0); //clr si and set stop

    DrvI2C_Close(I2C_PORT0);
    return TEMP;
    }

//写连续地址uint32型数值
void Write_24LC64L(uint32_t address, int32_t lng)
    {
    uint8_t chr[3];
    uint32_t Lng;
    if (lng < 0)
        {
        Lng = ~lng + 1;
        Write_24LC64(address + 0, 111);
        }
    if (lng >= 0)
        {
        Lng = lng;
        Write_24LC64(address + 0, 222);
        }
    chr[1] = Lng / 10000 % 100;
    chr[2] = Lng / 100 % 100;
    chr[3] = Lng / 1 % 100;
    Write_24LC64(address + 1, chr[1]);
    Write_24LC64(address + 2, chr[2]);
    Write_24LC64(address + 3, chr[3]);
    }
//读连续地址uint32型数值
int32_t Read_24LC64L(uint32_t address)
    {
    int32_t lng;
    uint8_t chr[4];

    chr[1] = Read_24LC64(address + 0);
    chr[2] = Read_24LC64(address + 1);
    chr[3] = Read_24LC64(address + 2);
    chr[4] = Read_24LC64(address + 3);
    if (chr[1] == 222)
        {
        lng = chr[2] * 10000 + chr[3] * 100 + chr[4];
        }
    if (chr[1] == 111)
        {
        lng = ~(chr[2] * 10000 + chr[3] * 100 + chr[4]) + 1;
        }
    return lng;
    }
//写连续地址浮点型数值
void Write_24LC64F(uint32_t address, float a)
    {
    uint8_t i, *px;
    uint8_t x[4];
    void *pf;
    px = x;
    pf = &a;
    for (i = 0; i < 4; i++)
        {
        *(px + i) = *((char *) pf + i);
        }

    Write_24LC64(address + 0, x[0]);
    Write_24LC64(address + 1, x[1]);
    Write_24LC64(address + 2, x[2]);
    Write_24LC64(address + 3, x[3]);
    }
//读连续地址浮点型数值
float Read_24LC64F(uint32_t address)
    {
    float a;
    uint8_t i, *px;
    uint8_t x[4];
    x[0] = Read_24LC64(address + 0);
    x[1] = Read_24LC64(address + 1);
    x[2] = Read_24LC64(address + 2);
    x[3] = Read_24LC64(address + 3);

    void *pf;
    px = x;
    pf = &a;
    for (i = 0; i < 4; i++)
        {
        *((char *) pf + i) = *(px + i);
        }
    return a;
    }
//
#endif

使用特权

评论回复
8
Diyer2015|  楼主 | 2016-12-18 11:52 | 只看该作者
#ifndef _BIANLIANGBIAO_H_
#define _BIANLIANGBIAO_H_
//宏
#define Y  1
#define N  0
//定时器转换标志位
uint8_t TIM_FLAG1=0;
//模拟量数据转换
uint32_t ADC1_RESULT = 0;
double ADC1_FLOAT = 0.0;
unsigned char ADC1_STR[100];
//全局状态机
uint32_t STEP = 0;
//定时器1中断标志
uint8_t T1_FLAG = 0;
//模拟量转换标志置位
#define Hi_Data 1.5//加热检测
#define Lo_Data 1.0//保温检测
unsigned char STATE = 0;
//
#endif

使用特权

评论回复
9
Diyer2015|  楼主 | 2016-12-18 11:53 | 只看该作者
#ifndef _IO_H_
#define _IO_H_
//LEDָʾ
#define RUN_ON                  GPIOB->DOUT&=~(1<<9)
#define RUN_OFF                  GPIOB->DOUT|=1<<9
#define ERR_ON        GPIOB->DOUT&=~(1<<10)
#define ERR_OFF                  GPIOB->DOUT|=1<<10
#define HOT_ON                  GPIOB->DOUT&=~(1<<11)
#define HOT_OFF       GPIOB->DOUT|=1<<11
#define COOL_ON                  GPIOE->DOUT&=~(1<<5)
#define COOL_OFF      GPIOE->DOUT|=1<<5
#define BEEP_ON                  GPIOD->DOUT&=~(1<<7)
#define BEEP_OFF      GPIOD->DOUT|=1<<7
//

#endif

使用特权

评论回复
10
Diyer2015|  楼主 | 2016-12-18 11:53 | 只看该作者
#ifndef _MYFUN_H_
#define _MYFUN_H_
//
#include <stdio.h>
//
#include "math.h"
//
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvI2C.H"
#include "Driver\DrvTimer.h"
#include "Driver\DrvUART.h"
#include "Driver\DrvADC.h"
//
#include "MYFUN\BIANLIANGBIAO.H"
#include "MYFUN\IO.H"
#include "MYFUN\AT24C64.H"
#include "MYFUN\TIMINIT.H"
#include "MYFUN\UART_INIT.H"
#include "MYFUN\TASK.H"
//延时函数
void DELAYUS(uint32_t us)
    {
    SysTick->LOAD = us * 22; /* Assume the internal 22MHz RC used */
    SysTick->VAL = (0x00);
    SysTick->CTRL = (1 << 2) | (1 << 0);
    /* Waiting for down-count to zero */
    while ((SysTick->CTRL & (1 << 16)) == 0)
        ;
    }
//延时函数
void DELAY(uint32_t COUNT)
    {

    while (COUNT--)
        {
        __NOP();
        }
    }
//系统初始化
void SYSinit()
    {
    //定义时钟
    UNLOCKREG();
    SYSCLK->PLLCON.OE = 1;
    SYSCLK->PWRCON.XTL12M_EN = 1;
    DrvSYS_SetPLLPowerDown(0);
    DrvSYS_SetHCLKSource(2);
    SystemFrequency = 50000000;
    }
//GPIO初始化
void GPIOinit()
    {
    DrvGPIO_InitFunction(FUNC_I2C0);
    DrvGPIO_InitFunction(FUNC_I2C1);
    DrvGPIO_Open(GPB, 9, IO_OUTPUT);
    DrvGPIO_Open(GPB, 10, IO_OUTPUT);
    DrvGPIO_Open(GPB, 11, IO_OUTPUT);
    DrvGPIO_Open(GPE, 5, IO_OUTPUT);
    }
//关闭所有输出
void ALL_CLOSE()
    {
    RUN_OFF;
    ERR_OFF;
    HOT_OFF;
    COOL_OFF;
    }
//启动转换
void STAR_ADC()
    {
    /* default setting: single end input, single operation mode, all channel disable, ADC clock frequency = 12MHz/(5+1) */
    DrvADC_Open(ADC_SINGLE_END, ADC_SINGLE_OP, 0x03, EXT_12MHZ, 5);
    /* Set the ADC operation mode as single cycle mode */
    DrvADC_SetAdcOperationMode(ADC_CONTINUOUS_OP);

    /* Set the ADC input mode */
    DrvADC_SetAdcInputMode(ADC_SINGLE_END);

    /* Set the ADC channel 0 */
    DrvADC_SetAdcChannel(0x03, ADC_SINGLE_END);

    /* Start A/D conversion */
    DrvADC_StartConvert();

    }
//IO口初始化
void LED_BEEP_INIT()
    {
    uint32_t i = 0;
    BEEP_ON;
    RUN_ON;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_OFF;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_ON;
    ERR_ON;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_OFF;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_ON;
    HOT_ON;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_OFF;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_ON;
    COOL_ON;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_OFF;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_ON;
    RUN_OFF;
    ERR_OFF;
    HOT_OFF;
    COOL_OFF;
    for (i = 0; i < 30000; i++)
        ;
    BEEP_OFF;
    }
#endif

使用特权

评论回复
11
Diyer2015|  楼主 | 2016-12-18 11:54 | 只看该作者
#ifndef _TASK_H_
#define _TASK_H_
//总任务
void MAIN_TASK(uint32_t CASE)
    {
    switch (CASE)
        {
    case 0://欢迎界面
        RUN_ON;
        STEP = 1;
        break;
    case 1://检测
        STEP = 2;
        break;
    case 2://加热
        COOL_ON;
        HOT_OFF;
        break;
    case 3://检测
        STEP = 4;
        break;
    case 4://保温
        HOT_ON;
        COOL_OFF;
        break;
    default:
        break;
        }
    }

//
#endif

使用特权

评论回复
12
Diyer2015|  楼主 | 2016-12-18 11:54 | 只看该作者
#ifndef _TIMINIT_H
#define _TIMINIT_H
//
#include"MYFUN\MYFUN.H"
//
void TimerInit(void)
    {
    uint32_t timerClkSrc;
    TIMER_TCSR_T tcsr =
        {
        0
        };
    /* Configure GCR to reset Timer */
    SYS->IPRSTC2.TMR0_RST = 1;
    SYS->IPRSTC2.TMR0_RST = 0;
    SYS->IPRSTC2.TMR1_RST = 1;
    SYS->IPRSTC2.TMR1_RST = 0;
    SYS->IPRSTC2.TMR2_RST = 1;
    SYS->IPRSTC2.TMR2_RST = 0;
    SYS->IPRSTC2.TMR3_RST = 1;
    SYS->IPRSTC2.TMR3_RST = 0;

    /* Enable Timer clock */
    SYSCLK->APBCLK.TMR0_EN = 1;
    SYSCLK->APBCLK.TMR1_EN = 1;
    SYSCLK->APBCLK.TMR2_EN = 1;
    SYSCLK->APBCLK.TMR3_EN = 1;

    /* Select Timer clock source */
    SYSCLK->CLKSEL1.TMR0_S = 0;
    SYSCLK->CLKSEL1.TMR1_S = 0;
    SYSCLK->CLKSEL1.TMR2_S = 0;
    SYSCLK->CLKSEL1.TMR3_S = 0; /* 22Mhz clock source */

    timerClkSrc = 12000000;

    /* Timer reload value */
    TIMER0->TCMPR = timerClkSrc / 1;
    TIMER1->TCMPR = timerClkSrc / 1000;
    TIMER2->TCMPR = timerClkSrc / 1000;
    TIMER3->TCMPR = timerClkSrc / 1000;

    /* Start timer */
    tcsr.nDBGACK_EN = 1;
    tcsr.IE = 1;
    tcsr.CACT = 1;
    tcsr.CRST = 1;
    tcsr.CEN = 1;
    tcsr.PRESCALE = 0;
    tcsr.TDR_EN = 1;
    tcsr.MODE = 1;
    REGCOPY(TIMER0->TCSR, tcsr);
    REGCOPY(TIMER1->TCSR, tcsr);
    REGCOPY(TIMER2->TCSR, tcsr);
    REGCOPY(TIMER3->TCSR, tcsr);

    NVIC_SetPriority(TMR0_IRQn, (1 << __NVIC_PRIO_BITS) - 2);
    NVIC_SetPriority(TMR1_IRQn, (1 << __NVIC_PRIO_BITS) - 2);
    NVIC_SetPriority(TMR2_IRQn, (1 << __NVIC_PRIO_BITS) - 2);
    NVIC_SetPriority(TMR3_IRQn, (1 << __NVIC_PRIO_BITS) - 2);

    NVIC_EnableIRQ(TMR0_IRQn);
    NVIC_DisableIRQ(TMR1_IRQn);
    NVIC_DisableIRQ(TMR2_IRQn);
    NVIC_DisableIRQ(TMR3_IRQn);
    }
//定时器0中断
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine
    {
    TIMER0->TISR.TIF = 1;
    T1_FLAG++;
    }
void TMR1_IRQHandler(void)
    {
    TIMER1->TISR.TIF = 1;
    }
void TMR2_IRQHandler(void)
    {
    TIMER2->TISR.TIF = 1;
    }
void TMR3_IRQHandler(void)
    {
    TIMER3->TISR.TIF = 1;
    }
//发送数据
void SEND_VULE(uint8_t s)
    {
    if (T1_FLAG > s)
        {
        T1_FLAG = 0;
        TIM_FLAG1 = 1;
        }
    }
//中断N秒的标志
void TIM_TASK1()
    {
    if (TIM_FLAG1 == 1)
        {
        TIM_FLAG1 = 0;
        if (STATE == 1)
            {
            SendChar("--保温中--");
            }
        if (STATE == 0)
            {
            SendChar("--加热中--");
            }
        SendChar("传感器电压:");
        SendChar(ADC1_STR);
        }
    }
#endif

使用特权

评论回复
13
Diyer2015|  楼主 | 2016-12-18 11:55 | 只看该作者
#ifndef _UART_INIT_H_
#define _UART_INIT_H_

#include"MYFUN\MYFUN.H"
//配置串口0
void RS232_1_init();//初始化串口0
void SendChar_1(char *s);//发送一个字节
void SendChar(char *ch);//发送一个字节
char GetChar_1(void);//接受一个字节
void UART0_INT_HANDLE(uint32_t u32IntStatus);//UART0中断
void Serial_Decode_1(void); //解析数据
//配置串口0
void RS232_1_init()//初始化串口0
    {
    STR_UART_T UARTInitStructure;
    SYS->GPBMFP.UART0_RX = 1;
    SYS->GPBMFP.UART0_TX = 1;
    UART0->FCR.RFR = 1;
    UARTInitStructure.u32BaudRate = 19200;
    UARTInitStructure.u8cDataBits = DRVUART_DATABITS_8;
    UARTInitStructure.u8cStopBits = DRVUART_STOPBITS_1;
    UARTInitStructure.u8cParity = DRVUART_PARITY_NONE;
    UARTInitStructure.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES;
    UARTInitStructure.u8TimeOut = 0;
    DrvUART_Open(UART_PORT0, &UARTInitStructure);
    DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT, UART0_INT_HANDLE);
    }
//发送一个字节
void SendChar_1(char *ch)
    {
    NVIC_DisableIRQ(UART0_IRQn);
    DrvUART_DisableInt(UART_PORT0, DRVUART_RDAINT);
    UART0->DATA = *ch;
    DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT, UART0_INT_HANDLE);
    NVIC_EnableIRQ(UART0_IRQn);
    }
void SendChar_ch(char ch)
    {
    NVIC_DisableIRQ(UART0_IRQn);
    DrvUART_DisableInt(UART_PORT0, DRVUART_RDAINT);
    UART0->DATA = ch;
    DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT, UART0_INT_HANDLE);
    NVIC_EnableIRQ(UART0_IRQn);
    }

void SendChar(char *ch)
    {
//    NVIC_DisableIRQ(UART0_IRQn);
//    DrvUART_DisableInt(UART_PORT0, DRVUART_RDAINT);
    while (*ch != '\0')
        {
        DELAY(100);
        UART0->DATA = *ch;
        ch++;
        DELAY(100);
        }
//    DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT, UART0_INT_HANDLE);
//    NVIC_EnableIRQ(UART0_IRQn);
    }
//发送回车
void UART_Send_Enter()
    {
    UART0->DATA = 0x0d;
    UART0->DATA = 0x0a;
    }
//接受一个字节
char GetChar_1(void)
    {
    while (1)
        {
        return (UART0->DATA);
        }
    }
//串口0中断
void UART0_INT_HANDLE(uint32_t u32IntStatus)
    {

    }
//串口0数据解析
void DATA_CH1()
    {

    }

#endif

使用特权

评论回复
14
Diyer2015|  楼主 | 2016-12-18 11:55 | 只看该作者
24c64

AT24C64.zip

1.13 KB

使用特权

评论回复
15
Diyer2015|  楼主 | 2016-12-18 11:56 | 只看该作者
变量表

BIANLIANGBIAO.zip

449 Bytes

使用特权

评论回复
16
Diyer2015|  楼主 | 2016-12-18 11:57 | 只看该作者
IO口分配

IO.zip

323 Bytes

使用特权

评论回复
17
Diyer2015|  楼主 | 2016-12-18 11:57 | 只看该作者
任务、定时器、串口

TASK.zip

374 Bytes

使用特权

评论回复
18
Diyer2015|  楼主 | 2016-12-18 11:59 | 只看该作者
时钟 定时器

TIMINIT.zip

945 Bytes

使用特权

评论回复
19
engineerDC| | 2016-12-18 21:21 | 只看该作者
IOT 物联网的设计吗?

请问 这个是做啥用的?

使用特权

评论回复
20
wt.liu| | 2016-12-19 08:24 | 只看该作者
应该先给个介绍,说明用途和功能。这样就更好了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

1615

帖子

13

粉丝