网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月30日漏签0天
单片机吧 关注:212,026贴子:1,047,295
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 21回复贴,共2页
  • ,跳到 页  
<<返回单片机吧
>0< 加载中...

DIY一个温度记录器

  • 取消只看楼主
  • 收藏

  • 回复
  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
要说为啥想做这么个东西呢,其实事情是这样的,夏天又来了,这么热的天,在家热,出门热,坐在车里更热,夏天中午,开车门都做不进去。但是都说热,到底有多热,什么时候最热,不知道,于是萌发了一个做个温度记录器的念头。
要说这做个温度记录器啊,很简单,用个18B20传感器就好了,记录一下最高温度,然后数码管或者液晶显示就好了么,好简单的对不对。你太naive了,这种简单的东西,怎么可以满足我这种变态的好奇心,必须连续记录多组数据,画出曲线啊。


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
真的好久没来贴吧发帖了。
言归正传,要满足上述要求,必须要有一个温度传感器,要有一个时钟模块,要有一个记录模块啊,对吧,不然这么多数据怎么保存呢?(废话,不然怎么知道什么时候温度多少)
相信贴吧的各位看到上述要求,已近忍不住要用18B20、1302这种组合开始搞起来了,navie 我怎么会用这种渣渣的组合,呵呵呵,必须高精度,必须自己打板子,怎么可以用洞洞板替代呢。
让我上淘宝看看存储器先。。。嗯?24C128+1307+18B20集成在一个板子上?。。。居然有这种神奇的组合,价格也很和谐啊,加个MCU就满足我条件了,都不用焊啥原件,反正要买零件,顺带弄一块板子吧,省的我画板子打样,高精度。。。算了吧,忘了那些事吧,好用就行了,就这么愉快的决定了


2025-07-30 19:05:10
广告
不感兴趣
开通SVIP免广告
  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
所以,我的外围芯片就确定为单总线18B20温度传感器+IIC接口的DS1307时钟芯片+IIC接口的24c系列EEPROM,板子带的是24C128,这个东西,带备用电池,卖10块钱,感觉还好,不算坑爹。
然后主控,我已经彻底投入AVR的怀抱了,就用了M48,这是个增强型的MEGA系列AVR单片机
其实,AVR新的IDE atmel studio不支持国产山寨仿真器了,原厂的600一台,太贵了,就开发来讲,不如旧的AVRstudio好用,不过VS编译环境真的很舒适。STM8倒是不错,不过丫的手里没有合适的直插片片。
线路板就洞洞板了,果然啪啪打脸。
下面说一下上面的芯片吧,1307和1302差不多的东西,区别就是接口一个是IIC一个是SPI,然后寄存器有点区别,
24C128是128K容量的存储器,但是这个容量是bit,不是Byte,所以实际容量是要除以8的,也就是实际16K字节的存储空间,
然后,我一条记录,按照年月日,时分秒,温度,需要8byte,按照一分钟一条记录,秒不写,单条记录7byte,一天24小时,就有1440条记录,需要10080字节,也够用了,考虑到不必要年月日,,实际就存储时分和温度(都是原始数据)也就4字节,一天占用5760字节,16k的24c128全部容量可以存储2.84天的数据,我就24小时,不用担心数据溢出。


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
程序的主要思想是:设定3个状态,1等待开始工作,2工作中,3终止工作,数据发送给上位机。
等待开始工作时,通过读取按键,选择是工作还是发送数据,
工作中,读取按键,选择终止工作,进行数据发送。
发送过程中,按键无效
然后设置串口用于发送数据和接受命令,嗯,可以直接用过串口终止工作,执行发送数据


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
其他硬件包括一个LED灯和一个按键
LED灯用于指示当前工作状态,不然没指示我怎么知道现在单片机在干嘛,在什么状态
等待状态不亮灯,工作开始快速闪烁两次,随后,18B20读取一次闪烁一次,发送状态,开始时常亮2秒,结束后常亮1秒
按键只有一个,因此必须复用按键,可以使用按键状态机,或者在不同的工作状态定义不同的功能,
不懂什么叫状态机的童鞋,自己百度一下


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
开发环境AS7.0
IIC总线做了个库
然后1307 24C128也用这个库写了另两个库
18B20单独一个文件


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
库的代码先给出
全部调试过,可用


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#ifndef __IIC_H__
#define __IIC_H__
#include <avr/io.h>
#include "mytype.h"
//#define TWI
// Define I/O pins
#define IIC_PORT PORTC
#define IIC_DIR DDRC
#define IIC_IN PINC
#define IIC_SCL PC5//串行时钟线
#define IIC_SDA PC4 // 串行数据线
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(void);
void IIC_Send_Ack(void);
void IIC_Send_Not_Ack(void);
void IIC_Clock(void);
uchar IIC_Send(uchar IIC_data) ;
uchar IIC_Receive(void);
#endif
#include <avr/io.h>
#include"IIC.h"
#include "mytype.h"
#include<util/delay.h>
//SDA SCL设置上拉,SDA输出为0,用方向寄存器实现0和1
//名称:void IIC_init(void);
//入口:无
//出口:无
//功能:I2C总线初始化。在main( void ) 函数中应首先调用本函数, 然后再调用其它函数
//描述:
void IIC_Init( void )
{
#ifdef TWI
PORTD&=~0x80;
DDRC|=(1<<6);
PORTC&=~(1<<6); //WP 使能
TWBR=0x0f ; //速率=16M/(16+2*16)=33.3k
TWAR=0x00;
TWSR=0x00 ; //分频因子=4
#else
Clr_Bit(IIC_PORT,IIC_SDA);//SDA PORT=0
Set_Bit(IIC_DIR,IIC_SCL);//SCL out
Clr_Bit(IIC_PORT,IIC_SCL);//SCL=0
IIC_Stop();
#endif
}
//名称:void IIC_start(void);
//入口:无
//出口:无
//功能:提供I2C总线工作时序中的起始位。
//描述:
void IIC_Start( void )
{
#ifdef TWI
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
#else
Clr_Bit(IIC_DIR,IIC_SDA);//SDA=1
_delay_us(4);
Set_Bit(IIC_PORT,IIC_SCL);//SCL=1
_delay_us(4);
Set_Bit(IIC_DIR,IIC_SDA);//输出为0 设定输出,SDA=0
_delay_us(4);
Clr_Bit(IIC_PORT,IIC_SCL);//SCL=0
_delay_us(4);
#endif
}
//名称:void IIC_Stop(void);
//入口:无
//出口:无
//功能:提供I2C总线工作时序中的停止位。
//描述:
void IIC_Stop( void )
{
#ifdef TWI
TWCR=0x94 ;
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
#else
Set_Bit(IIC_DIR,IIC_SDA);//端口为0 设定输出,SDA=0
_delay_us(4);
Clr_Bit(IIC_PORT,IIC_SCL);//SCL=0
_delay_us(4);
Set_Bit(IIC_PORT,IIC_SCL);//SCL=1
_delay_us(4);
Clr_Bit(IIC_DIR,IIC_SDA);//端口为0 设定输入,SDA=1
_delay_us(4);
#endif
}
//名称:void IIC_Ack(void);
//入口:无
//出口:无
//功能:接受应答。
//描述:
void IIC_Ack(void)
{
#ifdef TWI
#else
unsigned char errtime=20;
Clr_Bit(IIC_DIR,IIC_SDA);//SDA=1
Set_Bit(IIC_PORT,IIC_SCL);//SCL=1
_delay_us(4);
while(Get_Bit(IIC_IN,IIC_SDA))
{
errtime--;
if(!errtime)
{
IIC_Stop() ;
Set_Bit(IIC_DIR,IIC_SDA);
}
}
Clr_Bit(IIC_PORT,IIC_SCL);//SCL=0
_delay_us(4);
Clr_Bit(IIC_DIR,IIC_SDA);//SDA=1
#endif
}
//名称:void IIC_Send_Ack( void ) ;
//入口:无
//出口:无
//功能:发送应答。
//描述:
void IIC_Send_Ack( void )
{
#ifdef TWI
#else
Set_Bit(IIC_DIR,IIC_SDA);//端口为0 设定输出,SDA=0
IIC_Clock() ;
Clr_Bit(IIC_DIR,IIC_SDA);
#endif
}
//名称:void SendNotAck_I2C( void ) ;
//入口:无
//出口:无
//功能:发送无应答。
//描述:
void IIC_Send_Not_Ack(void)
{
#ifdef TWI
#else
Clr_Bit(IIC_DIR,IIC_SDA);//数据线保持高,时钟线发生一次从高低的跳变 没有应答
IIC_Clock();
#endif
}
//名称:void IIC_Clock( void );
//入口:无
//出口:无
//功能:提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状态。本函数可用于数据发送, 也可用于数据接收。
//描述:
void IIC_Clock(void)
{
#ifdef TWI
#else
Set_Bit(IIC_PORT,IIC_SCL);//SCL=1
_delay_us(4);
Clr_Bit(IIC_PORT,IIC_SCL);//SCL=0
_delay_us(4);
#endif
}
//名称:uchar IIC_Send(uchar IIC_data);
//入口:无
//出口:无
//功能:向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答则返回0, 否则返回1(方便后续判断)
//描述:
uchar IIC_Send( uchar IIC_data )
{
uchar i,ack=0;
#ifdef TWI
TWDR=(i2c_data);
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
#else
/* 发送8位数据 */
for ( i=0 ; i<8 ; i++ )
{
if(IIC_data & 0x80 ) Clr_Bit(IIC_DIR,IIC_SDA);//端口为0 设定输入,SDA=1
else Set_Bit(IIC_DIR,IIC_SDA);//端口为0 设定输出,SDA=0
IIC_data = IIC_data << 1 ;
IIC_Clock();
}
/* 请求应答信号ACK */
IIC_Ack();
Clr_Bit(IIC_DIR,IIC_SDA);//端口为0 设定输入,SDA=1
#endif
return ack;
}
//名称:uchar IIC_Receive(void);
//入口:无
//出口:无
//功能:从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信号线处于浮置状态。
//描述:
uchar IIC_Receive( void )
{
uchar i,dat = 0 ;
#ifdef TWI
#else
for(i=0;i<8;i++)
{
Set_Bit(IIC_PORT,IIC_SCL);//IIC总线在SCL上升沿读入数据 SCL=1
_delay_us(4);
dat<<=1;
if(Get_Bit(IIC_IN,IIC_SDA)) dat++;
Clr_Bit(IIC_PORT,IIC_SCL);//SCL=0
_delay_us(4);
}
//Clr_Bit(IIC_PORT,IIC_SCL);//SCL=0
#endif
return dat;
}


2025-07-30 18:59:10
广告
不感兴趣
开通SVIP免广告
  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#ifndef __DS1307_H_
#define __DS1307_H_
#include"mytype.h"
//#define IIC
/*
#define second0x00
#define minute0x01
#define hour0x02
#define week0x03
#define day0x04
#define mounth0x05
#define year0x06
#define CTRL0x07
*/
uchar Write_Address_1307(uchar addr,uchar dat);//写地址
uchar Read_Addrress_1307(uchar addr);//读地址
uchar Set_Date(uchar bcdy,uchar bcdm,uchar bcdd);//设置日期
uchar Set_Time(uchar bcdh,uchar bcdm,uchar bcds);//设置时间
uchar Set_Week(uchar bcdw);//设置星期
void Read_Date(void);//读日期
void Read_Time(void);//读时钟
void Read_Week(void);//读星期
void Write_Time_Burst(uchar *ptr);//时钟突发写
void Read_Time_Burst(uchar *ptr);//时钟突发读
void Write_Ram_Burst(uchar *ptr);//RAM突发写
void Read_Ram_Burst(uchar *ptr);//RAM突发读
#endif


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <avr/io.h>
#include <util/delay.h>
#include <avr/common.h>
#include "DS1307.H"
#include "IIC.h"
unsigned char time_buf[7];
uchar Write_Address_1307(uchar addr,uchar dat)//写地址
{
uchar result=0;
IIC_Start(); //启动总线
IIC_Send(0xd0); //呼叫芯片D1307,并定义为 写 动作
IIC_Send(addr); //发送地址
IIC_Send(dat); //发送数据
IIC_Stop(); //停止总线
return result;
}
uchar Read_Addrress_1307(uchar addr)//读地址
{
uchar dat;
IIC_Start();//启动总线
IIC_Send(0xd0);//呼叫芯片D1307,并定义为 写 动作
IIC_Send(addr);//发送地址
IIC_Start();//启动总线
IIC_Send(0xd1);
dat=IIC_Receive(); //接受数据
IIC_Stop(); //停止总线
return dat;
}
uchar Set_Date(uchar bcdy,uchar bcdm,uchar bcdd)//设置日期
{
uchar result=0;
IIC_Start(); //启动总线
IIC_Send(0xd0); //呼叫芯片D1307,并定义为 写 动作
IIC_Send(0x04); //发送地址
IIC_Send(bcdd); //发送数据
IIC_Send(bcdm); //发送数据
IIC_Send(bcdy); //发送数据
IIC_Stop(); //停止总线
return result;
}
uchar Set_Time(uchar bcdh,uchar bcdm,uchar bcds)//设置时间
{
uchar result=0;
IIC_Start(); //启动总线
IIC_Send(0xd0); //呼叫芯片D1307,并定义为 写 动作
IIC_Send(0x00); //发送地址
IIC_Send(bcds); //发送数据
IIC_Send(bcdm); //发送数据
IIC_Send(bcdh); //发送数据
IIC_Stop(); //停止总线
return result;
}
uchar Set_Week(uchar bcdw)//设置星期
{
uchar result;
result = Write_Address_1307(0x03,bcdw);
return result;
}
void Read_Date(void)//读日期
{
time_buf[5]=Read_Addrress_1307(0x06);
time_buf[4]=Read_Addrress_1307(0x05);
time_buf[3]=Read_Addrress_1307(0x04);
}
void Read_Time(void)//读时钟
{
time_buf[2]=Read_Addrress_1307(0x02);
time_buf[1]=Read_Addrress_1307(0x01);
time_buf[0]=Read_Addrress_1307(0x00);
}
void Read_Week(void)//读星期
{
time_buf[6]=Read_Addrress_1307(0x03);
}
void Write_Time_Burst(uchar *ptr)//时钟突发写
{
uchar i;
IIC_Start(); //启动总线
IIC_Send(0xd0); //呼叫芯片D1307,并定义为 写 动作
IIC_Send(0x00); //发送地址
for(i=0;i<7;i++)
{
IIC_Send(*ptr);
ptr++;
}
IIC_Stop();
}
void Read_Time_Burst(uchar *ptr)//时钟突发读
{
uchar i;
IIC_Start();//启动总线
IIC_Send(0xd0);//呼叫芯片D1307,并定义为 写 动作
IIC_Send(0x00);//发送地址
IIC_Start();//启动总线
IIC_Send(0xd1); //呼叫芯片D1307,并定义为 读 动作
for(i=0;i<6;i++)
{
*ptr=IIC_Receive();
IIC_Send_Ack();
ptr++;
}
*ptr=IIC_Receive();
IIC_Stop();
}
void Write_Ram_Burst(uchar *ptr)//RAM突发写
{
uchar i;
IIC_Start(); //启动总线
IIC_Send(0xd0); //呼叫芯片D1307,并定义为 写 动作
IIC_Send(0x08); //发送地址
for(i=0;i<56;i++)
{
IIC_Send(*ptr);
ptr++;
}
IIC_Stop();
}
void Read_Ram_Burst(uchar *ptr)//RAM突发读
{
uchar i;
IIC_Start(); //启动总线
IIC_Send(0xd0); //呼叫芯片D1307,并定义为 写 动作
IIC_Send(0x08); //发送地址
IIC_Start(); //启动总线
IIC_Send(0xd1); //呼叫芯片D1307,并定义为 读 动作
for(i=0;i<53;i++)
{
*ptr=IIC_Receive();
IIC_Ack();
ptr++;
}
*ptr=IIC_Receive();
IIC_Stop();
}


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#ifndef __24CXX_H_
#define __24CXX_H_
//#define IIC
#define _24C128
void Write_Byte_24CXX(uint address,uchar data);
char Read_Byte_24CXX( uint address );
char Write_Block_24CXX(uint address,uchar *ptr,uchar lenth);
char Read_Block_24CXX(uint address,uchar *ptr,uchar lenth);
#endif


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <avr/io.h>
#include <avr/common.h>
#include<util/delay.h>
#include "mytype.h"
#include"24CXX.h"
#include "IIC.h"
#include "COMM.h"
#ifdef _24C01
#define BLOCK_SIZE 8
#endif
#if defined(_24C02)||defined(_24C04)||defined(_24C08)||defined(_24C16)
#define BLOCK_SIZE 16
#endif
#if defined(_24C32)||defined(_24C64)
#define BLOCK_SIZE 32
#endif
#if defined(_24C128)||defined (_24C256)
#define BLOCK_SIZE 64
#endif
//名称:Write_Byte_24CXX(uchar address,uchar data)
//入口:无
//出口:无
//功能:向24CXX写入器件地址和一个指定的字节地址。
//描述:
void Write_Byte_24CXX(uint address,uchar data)
{
uchar addressh,addressl;
addressh=(uchar)(address>>8);
addressl=address;
IIC_Start();
#if defined(_24C01)||defined(_24C02)||defined(_24C04)||defined(_24C08)||defined(_24C16)
IIC_Send(0xa0|addressh);//发送数据
#else
IIC_Send(0xa0);//发送数据
IIC_Send(addressh);//发送地址H
#endif
IIC_Send(addressl);//发送地址L
IIC_Send(data);//发送数据
IIC_Stop();
}
//名称:char Read_Byte_24CXX( uchar address )
//入口:无
//出口:无
//功能:向24CXX写入器件地址和一个指定的字节地址。
//描述:
char Read_Byte_24CXX( uint address )
{
uchar dat;
uchar addressh,addressl;
addressh=(uchar)(address>>8);
addressl=address;
IIC_Start();
#if defined(_24C01)||defined(_24C02)||defined(_24C04)||defined(_24C08)||defined(_24C16)
IIC_Send(0xa0|addressh);//发送数据
#else
IIC_Send(0xa0);//发送数据
IIC_Send(addressh);//发送地址H
#endif
IIC_Send(addressl);//发送地址L
IIC_Start();
IIC_Send(0xa1);//发送数据命令读数据
dat=IIC_Receive();//读数据
IIC_Stop();
return dat;
}
//名称:Write_Block_24CXX(uchar address)
//入口:无
//出口:无
//功能:从24CXX中读取BLOCK_SIZE个字节的数据并转存于外部RAM存储映象单元, 采用序列读操作方式从片内0地址开始连续读取数据。如果24CXX不接受指定的地址则返回0(FALSE)。
//描述:
char Write_Block_24CXX(uint address,uchar *ptr,uchar lenth)
{
uchar result;
uchar i ;
uchar addressh,addressl;
addressh=(uchar)(address>>8);
addressl=address;
if(lenth<=BLOCK_SIZE)
{
IIC_Start();//启动总线
#if defined(_24C01)||defined(_24C02)||defined(_24C04)||defined(_24C08)||defined(_24C16)
IIC_Send(0xa0|addressh);//发送数据
#else
IIC_Send(0xa0);//发送数据
IIC_Send(addressh);//发送地址H
#endif
IIC_Send(addressl);//发送地址L
for (i=0;i<=lenth; i++)
{
IIC_Send(*ptr);
ptr++;
}
IIC_Stop();
}
else result= 'E';
return result;
}
//名称:char Read_Block_24CXX(uchar address,uchar lenth)
//入口:无
//出口:无
//功能: 将外部RAM存储映象单元中的数据写入到24C04的头BLOCK_SIZE个字节。采用字节写操作方式, 每次写入时都需要指定片内地址。如果24CXX不接受指定的地址或某个传送的字节未收到应答信号ACK, 则返回0(FALSE)。
//描述:
char Read_Block_24CXX(uint address,uchar *ptr,uchar lenth)
{
uchar result;
uchar i ;
uchar addressh,addressl;
addressh=(uchar)(address>>8);
addressl=address;
if(lenth<=BLOCK_SIZE)
{
IIC_Start();//启动总线
#if defined(_24C01)||defined(_24C02)||defined(_24C04)||defined(_24C08)||defined(_24C16)
IIC_Send(0xa0|addressh);//发送数据
#else
IIC_Send(0xa0);//发送数据
IIC_Send(addressh);//发送地址H
#endif
IIC_Send(addressl);//发送地址L
IIC_Start();
IIC_Send(0xa1);//读数据
for (i=0;i<=lenth; i++)
{
}
}
else result= 'E';
return result;
}


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
串口通讯
#ifndef __COMM_H__
#define __COMM_H__
/* Private defines -----------------------------------------------------------*/
#define BAUD 4800
#ifndef F_CPU
# define F_CPU 1000000UL
#endif
/* Private function prototypes -----------------------------------------------*/
void Usart_Init(void);
void Send_Char(char data);
void Send_String(char *p);
#endif


  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
串口通讯程序
#include <avr/io.h>
#include <avr/common.h>
#include <avr/interrupt.h>
#include "COMM.h"
#include "mytype.h"
#include "24CXX.H"
#include "1820.h"
/* Private function variable -------------------------------------------------*/
extern uchar time_buf[7];
uchar Uart_Status=0;
uchar recive[14]={};
uchar receive_count=0;
/* Private functions ---------------------------------------------------------*/
extern void Serial_Time_Set(void);
/*****************************************************************
** 名称:void Init_Usart(void)
** 功能:atmega8 串口初始化
** 入口参数:无
** 出口参数:无
** 使用说明:查询发送,中断接收,8位数据位,1位停止位,9600波特率
*****************************************************************/
void Usart_Init(void)
{
//设置波特率
UBRR0H = (F_CPU / BAUD / 16 - 1) / 256;
UBRR0L = (F_CPU / BAUD / 16 - 1) % 256;
//接收中断使能,接收使能,发送使能
UCSR0B |= (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0);
}
/*****************************************************************
** 名称:void Send_Char(char data)
** 功能:atmega8 串口发送字符
** 入口参数:data 发送字符
** 出口参数:无
** 使用说明:查询发送
*****************************************************************/
void Send_Char(char data)
{
//查询方式发送
while(!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
}
void Send_String(char *p)
{
//查询方式发送
while(*p!='\0')
{
Send_Char(*p);
p++;
}
}
//串口接收中断
ISR(USART_RX_vect)
{
uchar rev_data;
rev_data = UDR0;
switch (Uart_Status)
{
case 0:
if(rev_data=='s') control_state = send;
if(rev_data=='w')
{
control_state = work;
Send_String("work");
}
if(rev_data=='t')
{
receive_count=0;
Uart_Status++;
}
break;
/*时间设定样板 t年月日周时分秒标志位,表示位0,24小时制,标记位1,12小时制*/
case 1:
if((rev_data-0x30)<10)
{
recive[receive_count]=rev_data-0x30;
receive_count++;
}
else Send_Char('E');
if(receive_count==14)
{
receive_count=0;
if (recive[13]==1) time_buf[2]=(recive[7]<<4)|recive[8]|0x60;//时
else time_buf[2]=(recive[7]<<4)|recive[8];//时
time_buf[0]=(recive[11]<<4)|recive[12];//秒
time_buf[1]=(recive[9]<<4)|recive[10];//分
time_buf[3]=recive[6];//周
time_buf[4]=(recive[4]<<4)|recive[5];//日
time_buf[5]=(recive[2]<<4)|recive[3];//月
time_buf[6]=(recive[0]<<4)|recive[1];//年
Serial_Time_Set();
Uart_Status=0;
}
break;
default:
Uart_Status=0;
break;
}
}


2025-07-30 18:53:10
广告
不感兴趣
开通SVIP免广告
  • 350386979
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#ifndef __MY_TYPE_H__
#define __MY_TYPE_H__
typedef unsigned char uchar;
typedef unsigned int uint;
#ifndef F_CPU
# define F_CPU 1000000UL
#endif
#define Set_Bit(val, bitn)(val |=(1<<(bitn)))
#define Clr_Bit(val, bitn)(val&=~(1<<(bitn)))
#define Get_Bit(val, bitn)(val &(1<<(bitn)))
#define IO_PORT PORTC
#defineIO_DIR DDRC
#define IO_IN PINC
#defineKEY PC0
#define LED PC1
#define key_n 0;
#define key_s 1;
#define key_d 2;
#define key_l 3;
#define key_second 100
#define long_seconds 200
enum
{
wait,//程序开始进入等待状态,
work,//工作状态,读取时间,在每分钟的整点读取温度并写入IIC
send//发送状态,发送IIC内的数据,发送完成后,重新进入等待状态
} control_state;
#endif


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 21回复贴,共2页
  • ,跳到 页  
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示