目前共有35篇帖子。
【单片机实际应用】开机时在MySQL数据库中自动记录开机时间和室内温度(由DS18B20通过串口提供)
1樓 巨大八爪鱼 2015-6-28 11:31
最终效果:
2樓 巨大八爪鱼 2015-6-28 11:32
数据表结构图:
3樓 巨大八爪鱼 2015-6-28 11:34
数据表结构:
CREATE TABLE IF NOT EXISTS `PowerLog` (
  `LogID` int(11) NOT NULL,
  `LogTime` datetime NOT NULL,
  `LogFlag` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'TEST',
  `LogTimeZone` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'UTC+8',
  `ComputerIP` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '192.168.0.4',
  `Temperature` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'NO DATA'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
4樓 巨大八爪鱼 2015-6-28 11:35
我使用的操作系统:Fedora Linux 22
单片机型号:AVR ATMega16
5樓 巨大八爪鱼 2015-6-28 11:39
单片机所用晶振:7.3728MHz
串口线:USB转串口线(设备地址:/dev/ttyUSB0)
6樓 巨大八爪鱼 2015-6-28 11:42
下面公布程序源代码。
【单片机部分】
[文件列表]
delay.c
delay.h
DS18B20.c
DS18B20.h
IR.c
IR.h
pce.c
UART.c
UART.h
7樓 巨大八爪鱼 2015-6-28 11:43
[delay.c]
#include "delay.h"

//延时n毫秒
void delay(unsigned int n)
{
    unsigned int i;
    while (n--)
        for (i=0;i<1140;i++); //1ms基准延时
}

void delay_us(unsigned int n)
{
    if (n==0)
        return;
    while (--n);
}

//延时0.5ms
void delay500us(void)
{
    unsigned int i;
    for (i=0;i<570;i++); //1140*0.5=570
}

//延迟0.56ms
void delay560us(void)
{
    unsigned int i;
    for (i=0;i<638;i++); //1140*0.56=638.4
}
8樓 巨大八爪鱼 2015-6-28 11:43
[delay.h]
void delay(unsigned int n);
void delay_us(unsigned int n);
void delay500us(void);
void delay560us(void);
9樓 巨大八爪鱼 2015-6-28 11:44
[DS18B20.c]
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#include "DS18B20.h"

unsigned char DSFlags=0xff;
unsigned char DSTN,DSTD;

void DS18B20_Init(void)
{
    DQ_OUT;
    DQ_1;
    delay_us(6);
    DQ_0;
    delay_us(600);
    DQ_1;
    delay_us(120);
    if (DQ)
        DSFlags|=BIT(DSERR);
    else
        DSFlags&=~BIT(DSERR);
    delay_us(620);
}

void DS18B20_Read(unsigned char* dat)
{
    unsigned char i;
    for (i=0;i<8;i++)
    {
        DQ_OUT;
        DQ_1;
        delay_us(2);
        DQ_0;
        delay_us(4);
        DQ_1;
        delay_us(6);
        *dat>>=1;

        if (DQ)
            *dat|=0x80;
        else
            *dat&=0x7f;
        delay_us(60);
    }
}

void DS18B20_Write(unsigned char dat)
{
    unsigned char i;
    for (i=0;i<8;i++)
    {
        DQ_OUT;
        DQ_1;
        delay_us(2);
        DQ_0;
        if (dat&0x01)
            DQ_IN;
        else
            DQ_OUT;
        delay_us(30);
        DQ_1;
        delay_us(3);
        dat>>=1;
    }
    delay_us(10);
}

void DS18B20_ReadyReadTemp(void)
{
    DS18B20_Init();
    DS18B20_Write(0xcc);
    DS18B20_Write(0x44);
    delay_us(20);

    DS18B20_Init();
    DS18B20_Write(0xcc);
    DS18B20_Write(0xbe);
}

void DS18B20_Measure(void)
{
    unsigned char tl,th,tltemp;
    DS18B20_ReadyReadTemp();
    DS18B20_Read(&tl);
    DS18B20_Read(&th);

    if ((th&0xf8)!=0x00)
    {
        DSFlags|=BIT(DSNEG);
        tl=~tl;
        th=~th;
        tltemp=tl+1;
        tl=tltemp;
        if (tltemp>=255)
            th++;
    }
    else
        DSFlags&=~BIT(DSNEG);

    DSTN=th*16+tl/16;
    DSTD=(tl&0x0f)*625/100; //*6.25
}
10樓 巨大八爪鱼 2015-6-28 11:44
[DS18B20.h]
#define DSNEG 4
#define DSERR 6

#define DQ (PINB&BIT(1))
#define DQ_0 PORTB&=~BIT(1)
#define DQ_1 PORTB|=BIT(1)
#define DQ_IN DDRB&=~BIT(1) //write
#define DQ_OUT DDRB|=BIT(1) //read

extern unsigned char DSFlags;
extern unsigned char DSTN;
extern unsigned char DSTD;

void DS18B20_Init(void);
void DS18B20_Read(unsigned char* dat);
void DS18B20_Write(unsigned char dat);
void DS18B20_ReadyReadTemp(void);
void DS18B20_Measure(void);

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。