0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么制作显示温度的时钟

454398 作者:工程师吴畏 2018-09-18 10:37 次阅读

一、。先发下制作完成的成品

手机拍的不是很清楚,但LCD上能看到显示的时间和温度值。

因为国庆忙,还没来加上设置按键和闹钟功能,后续一定补上!见谅!

二、开始制作了

材料清单:

1.万能电路板一块

2.ATmega16单片机一块

3.40DIP插座一块

4.1602LCD液晶显示屏一块

5.ds1820温度传感器一只

6.4.7K电阻一只

7.7.3728Mhz晶振一只

8.27P电容两只

9.排插和排坐若干

10.USB下载线

以上材料淘宝都可以买到,大概40元左右。

三、我设计的原理图

怎么制作显示温度的时钟

怎么制作显示温度的时钟

ds1820引脚图(用TO-92封装的)

LCD1602 引脚图

四、按图纸手工焊接,大家动手能力这么强,具体过程我就不写了。

五、程序编写(注:不懂得话可以直接跳过看下面的第六项)

软件使用ICCAVR软件,网上搜下很容易下载。

下面是我写的程序:

#include

#include

#include “delay.h”

#include “1602.h”

unsigned long int j=0;

unsigned int s,t,h;

unsigned char display[9]={0,0,0,0,0,0,0,0,0};//显示数据

typedef unsigned char uint8;/* 定义可移植的无符号8位整数关键字 */

typedef signed char int8;/* 定义可移植的有符号8位整数关键字 */

typedef unsigned int uint16;/* 定义可移植的无符号16位整数关键字 */

typedef signed int int16;/* 定义可移植的有符号16位整数关键字 */

typedef unsigned long uint32;/* 定义可移植的无符号32位整数关键字 */

typedef signed long int32;/* 定义可移植的有符号32位整数关键字 */

extern unsigned char wmh,wml; //全局变量

extern unsigned char count,count1;

#define CLR_DIR_1WIRE DDRD&=~BIT(4) //只要修改这里的参数就可以了!呵呵!

#define SET_DIR_1WIRE DDRD|=BIT(4) //里面什么都不用该!

#define CLR_OP_1WIRE PORTD&=~BIT(4)

#define SET_OP_1WIRE PORTD|=BIT(4)

#define CHECK_IP_1WIRE (PIND & 0x10) //检测 pD4

void init_1820(void);

void write_1820(unsigned char x);

unsigned char read_1820(void);

/*************************************************

** 读取温度值

** 更改全局变量 wmh,wml; 温度的高低位

*************************************************/

extern void gettemp(void);

unsigned char count,count1,flag; //flag温度为负标志,count为实际温度

void init_1820(void)

{

SET_DIR_1WIRE; //设置PC2 为输出

SET_OP_1WIRE;

CLR_OP_1WIRE;

delay_nus(480); //480us以上

SET_OP_1WIRE;

CLR_DIR_1WIRE;

delay_nus(20); //15~60us

while(CHECK_IP_1WIRE);

SET_DIR_1WIRE;

SET_OP_1WIRE;

delay_nus(140); //60~240us

}

void write_1820(unsigned char x)

{

unsigned char m;

for(m=0;m《8;m++)

{

CLR_OP_1WIRE;

if(x&(1《

SET_OP_1WIRE;

else

{CLR_OP_1WIRE;}

delay_nus(40); //15~60us

SET_OP_1WIRE;

}

SET_OP_1WIRE;

}

unsigned char read_1820(void)

{

unsigned char temp,k,n;

temp=0;

for(n=0;n《8;n++)

{

CLR_OP_1WIRE;

SET_OP_1WIRE;

CLR_DIR_1WIRE;

k=(CHECK_IP_1WIRE); //读数据,从低位开始

if(k)

temp|=(1《

else

temp&=~(1《

delay_nus(50); //60~120us

SET_DIR_1WIRE;

}

return (temp);

}

void gettemp(void) //读取温度值

{

unsigned char temh,teml,wm0,wm1,wm2,wm3;

init_1820(); //复位18b20

write_1820(0xcc); // 发出转换命令

write_1820(0x44);

delay_nms(800); //不延时也好使,不知道怎么回事!

init_1820();

write_1820(0xcc); //发出读命令

write_1820(0xbe);

teml=read_1820(); //读数据

temh=read_1820();

wm0=teml》》4; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!

wm1=temh《《4;

j=(temh*256+teml)*5; //计算具体温度

display[1]=j/100%10+0x30;

display[2]=j/10%10+0x30;

display[3]=j%10+0x30;

LCD_write_char(5,1,display[1]);

LCD_write_char(6,1,display[2]);

LCD_write_char(7,1,‘。’);

LCD_write_char(8,1,display[3]);

LCD_write_char(9,1,‘C’);

}

//TIMER1 initialize - prescale:1024

// WGM: 0) Normal, TOP=0xFFFF

// desired value: 1Sec

// actual value: 1.000Sec (0.0%)

void timer1_init(void)

{

TCCR1B = 0x00; //stop

TCNT1H = 0xE3; //setup

TCNT1L = 0xE1;

OCR1AH = 0x1C;

OCR1AL = 0x1F;

OCR1BH = 0x1C;

OCR1BL = 0x1F;

ICR1H = 0x1C;

ICR1L = 0x1F;

TCCR1A = 0x00;

TCCR1B = 0x05; //start Timer

}

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

timer1_init();

MCUCR = 0x00;

GICR = 0x00;

TIMSK = 0x1C; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

#pragma interrupt_handler timer1_ovf_isr:9

void timer1_ovf_isr(void)

{

//TIMER1 has overflowed

TCNT1H = 0xE3; //reload counter high value

TCNT1L = 0xE1; //reload counter low value

if(s++ == 59)

{s=0;

if(t++ == 59)

{t=0;

if(h++ == 24)

{h=1;

}

}

}

}

void dis(void)

{

display[4]=s/10+0x30;

display[5]=s%10+0x30;

display[6]=t/10+0x30;

display[7]=t%10+0x30;

display[8]=h/10+0x30;

display[9]=h%10+0x30;

LCD_write_char(10,0,display[5]);

LCD_write_char(9,0,display[4]);

LCD_write_char(8,0,‘:’);

LCD_write_char(7,0,display[7]);

LCD_write_char(6,0,display[6]);

LCD_write_char(5,0,‘:’);

LCD_write_char(4,0,display[9]);

LCD_write_char(3,0,display[8]);

delay_nms(50);

}

void main(void)

{h=24;

t=59;

s=55;

init_devices();

LCD_init();

delay_nms(50);

while(1)

{

gettemp();

dis();

delay_nms(500);

}

}

经过ICCAVR编译后生成的 hex 就是我们下载到单片机需要的文件。

六。下载 time.hex 到单片机

1.先下载 time.hex 文件

2.把USB下载线插在ISP接口上。

3.运行 AVR_fighter 软件(买USB下载线送的配套软件)

按图红圈先选择 ATMEGA16,再设置好熔丝位,最后点击写入。

4.

点击 装FLASH 按钮选择 time.hex 文件后,点击 编程

几秒后你就会看到液晶显示出时间和温度值,因为因为国庆忙,还没来加上设置按键和闹钟功能,后续加下,见谅!

不过聪明的你一定看出来了,只要提前设定好 s,t,h(时、分、秒)编译后下载,时钟就能按你的要求工作了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43970

    浏览量

    620786
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130304
收藏 人收藏

    评论

    相关推荐

    [热]单片机仿真——时钟温度计和频率计

    ;b. 当按下键盘上的温度显示按键时将实时温度信息显示在LED显示器上,当按下键盘上的时钟
    发表于 08-22 11:32

    以VB程序显示温度传感器制作

    以VB 程序显示温度传感器制作这次专题主要利用温度感测组件Pt102 与OP 转换电路所完成的温度感测装置。此外,我们将
    发表于 11-20 16:25 104次下载

    制作液晶显示温度计的方法

    制作液晶显示温度计的方法 本文介绍一种用DSl8820测温、用SMCl602A液晶来显示的新型温度计。该
    发表于 03-09 16:58 3362次阅读
    <b class='flag-5'>制作</b>液晶<b class='flag-5'>显示</b><b class='flag-5'>温度</b>计的方法

    基于51单片机的时钟+温控系统的小制作

    该作品是基于51单片机的时钟+温控系统的小制作,能够显示时钟温度
    发表于 11-17 10:19 37次下载

    带日历时钟温度显示的电子万年历

    温度显示日历时钟温度显示的电子万年历,带电路图+PCB+源程序
    发表于 12-07 14:35 86次下载

    单片机数字时钟温度计闹钟计算器制作

    单片机数字时钟温度计闹钟 计算器制作,感兴趣的小伙伴们可以看一看。
    发表于 09-12 16:55 0次下载

    DS1302时钟电子表闹钟 旋转LED显示 创意时钟DIY 温度显示报警设计

    DS1302时钟电子表闹钟 旋转LED显示 创意时钟DIY 温度显示报警
    发表于 01-12 16:48 42次下载

    如何制作一个多功能便携时钟

    在2012年世界末日的最后一个情人节里,给大家展示一款纯手工打造的便携时钟,同样也会像以前一样配上详细的制作过程。有时钟温度、秒表等功能。当初制作
    的头像 发表于 08-10 17:29 5444次阅读
    如何<b class='flag-5'>制作</b>一个多功能便携<b class='flag-5'>时钟</b>?

    Arduino天气时钟制作教程

    在本文中,我们将制作Arduino天气时钟,它将告诉我们时间,日期和温度。 LM35传感器将为我们提供温度,DS3231将告诉我们日期和时间,我们将使用OLED
    的头像 发表于 08-01 11:13 7693次阅读

    如何制作一个带有温度和湿度显示的木质时钟

    你差不多了完成了!您要做的就是将温度湿度传感器和墙壁热粘合。以及前面大孔的显示和侧孔的充电端口!
    的头像 发表于 08-23 16:33 3946次阅读
    如何<b class='flag-5'>制作</b>一个带有<b class='flag-5'>温度</b>和湿度<b class='flag-5'>显示</b>的木质<b class='flag-5'>时钟</b>

    51单片机实现显示显示日历与时钟温度的设计

    温度传感器采用18B20日历与时钟温度分时切换显示,采用8位共阳数码管数据输出P1, 位码驱动P2也可以采用12864LCD显示,该程序暂
    发表于 10-29 16:25 4875次阅读

    基于51单片机1602温度显示时钟

    基于51单片机1602带温度显示的电子时钟要在1602上显示时间和温度先要了解1602是如何工作的
    发表于 11-05 14:50 33次下载
    基于51单片机1602<b class='flag-5'>温度</b><b class='flag-5'>显示</b><b class='flag-5'>时钟</b>

    RTX51tiny 复杂应用---时钟温度显示、按键解析

    RTX51tiny 复杂应用---时钟温度显示、按键解析
    发表于 11-21 13:06 25次下载
    RTX51tiny 复杂应用---<b class='flag-5'>时钟</b>、<b class='flag-5'>温度</b><b class='flag-5'>显示</b>、按键解析

    使用实时时钟IC DS1307制作精确时钟的方法

    如何使用实时时钟 IC DS1307 制作准确的时钟。时间将显示在液晶显示屏上。
    的头像 发表于 04-26 17:23 5637次阅读
    使用实时<b class='flag-5'>时钟</b>IC DS1307<b class='flag-5'>制作</b>精确<b class='flag-5'>时钟</b>的方法

    POV时钟/显示制作

    方案介绍在这个项目中,我们将介绍如何以一种简单的方式制作酷的POV时钟。硬件部件:Arduino Nano R3    ×    1个    9V电池(通用)    ×    1个    线性稳压器(7805)    ×    1个   &
    发表于 12-29 10:06 0次下载