(代码在文末)

工程文件和代码下载链接如下(求求下载前点个赞支持一下吧QAQ,博主自己做出来这个也hin累的)

链接: https://pan.baidu.com/s/1-aRZjyRZodzLcw83yx64kA  密码: og0w

一、实验目的

设计实现一个简易数字温度计,利用 Mega16 控制 DS18B20 获取室内环境温度,并显示。

若温度达到设定阈值,即可报警提醒。

二、实验项目与具体要求

(1) 实验项目:简易数字温度计。

(2) 具体要求:

1.液晶屏(

LCD1602/ LCD12864)或数码管显示当前的温度;

2.利用按键设置温度上限;

3.当温度超过上限时,进行报警。

4.通过 PC 机“串口助手软件”向单片机发送命令字符串,控制报警蜂鸣器的关闭。

三、实验方案设计

1. 实验的方案的论述和分析

①在 proteus 中搭建电路图。

选择 mega16 单片机,液晶屏显示器,PC 机,RN1 排阻,温度传感器,蜂鸣器,三极管,电

阻若干,按键若干,并连接硬件图。其中 PC 机的 RXD 和 TXD 接口分别接在单片机的 PD

接口;单片机的 PA 口为输出端口直接与显示器相连,PC 口设置为输入端口与按键区相连;

三极管基极通过电阻连接单片机 PD 口,发射极接地,集电极连接蜂鸣器,以放大电流,达

到报警效果。

②在 ICCV7 中建立新程序、文件,编写程序。首先对在代码中经常需要调用的命令进行简化,

将命令语句定义为简单的语句。然后对通信端口和部分功能进行初始化,以便后续功能使用。

然后分别对 DS18B20、LCD1602 等功能元件编写自定义函数指令,方便后续调用的逻辑清晰

和正确性。最后将其总结在 main 函数中,使用 while 语句进行语句的循环执行。

2.硬件电路原理图(proteus 仿真图)

3.软件流程图、重要数据结构、重要控制参数设计等

①软件流程图:

完整代码如下

#include<iom16v.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define rs_h (PORTB|=0x01)
#define rs_l (PORTB&=0xfe)
#define rs_o (DDRB|=0x01)
#define rw_h (PORTB|=0x02)
#define rw_l (PORTB&=0xfd)
#define rw_o (DDRB|=0x02)
#define en_h (PORTB|=0x04)
#define en_l (PORTB&=0xfb)
#define en_o (DDRB|=0x04)
#define temp_h (PORTB|=0x08)
#define temp_l (PORTB&=0xf7)
#define LCD PORTA
#define tmp (PINB&0x08)
#define temp_o (DDRB|=0x08)
#define temp_i (DDRB&=0xf7)
uchar dat1,dat2;//保存读出的温度
#define led_o (DDRB|=0x10)
#define led_l (PORTB&=0xef)
#define led_h (PORTB|=0x10)unsigned char f=0;
unsigned char c=0;
int threshold=25;
unsigned char cah=0;
int date;#include <macros.h>
unsigned char Rev_data=0;
#pragma interrupt_handler uart_Rev_int:iv_USART_RXC//串口接收中断
void uart_Rev_int(void)
{Rev_data = UDR;while(!Rev_data);if (Rev_data == 0xA1){f=1;}if(Rev_data == 0xA2){f=0;}while(!(UCSRA & (1<<UDRE)));UDR = Rev_data+0x10;Rev_data = 0;
}uchar chg=0;
void delayms();
#pragma interrupt_handler int0_isr:2//外部中断 CHANGE按钮
void int0_isr(void)
{delayms(200);cah=1;
}void initcom(void)//初始化端口
{DDRD = 0x0A;PORTD=0x04;GICR |=(1<<INT0);SREG|=0x80;UBRRL = 25;UCSRC = 0x86;UCSRB = 0x98;           //接收发送控制位,打开串口10011000SEI();DDRC=0x0f;PORTC=0x00;}unsigned long int dat=0;
uchar flag=0;
void delayms(uint z)      //8M晶振下,延时1ms
{uint x,y;for(x=z; x>0; x--)for(y=1333; y>0; y--);
}void Ds18b20_reset(void)//DS18B20温度传感器初始化
{uint count;uint i=60000;temp_o;temp_l;for(count=700; count>0; count--); //延时480ustemp_h;temp_i;//不须配置PORT内部上拉电阻,MCU输入输出自动切换while((tmp==0x08));//&&(i>0)) i--;led_o;led_l;//开指示灯for(count=700; count>0; count--); //延时480us
}
void Ds18b20_write(uchar dat)//向DS18B20写一个字节
{uchar count;uchar i;temp_o;for(i=8; i>0; i--){temp_l;for(count=2; count>0; count--);//temp_h;//不能有此语句if(dat&0x01==0x01)temp_h;elsetemp_l;for(count=120; count>0; count--); //延时60ustemp_h;dat>>=1;}
}
uchar Ds18b20_read(void)//从DS18B20读一个字节
{uchar i,datt;uchar count;for(i=8; i>0; i--){datt>>=1;temp_o;temp_l;for(count=2; count>0; count--);temp_h;//此语句必须有,参考datasheet的P15for(count=1; count>0; count--);temp_i;if(tmp==0x08)datt|=0x80;for(count=120; count>0; count--);}return datt;
}
void lcd_com(uchar com)//向LCD1602写命令
{rs_o;rw_o;en_o;DDRA=0xff;rs_l;rw_l;LCD=com;delayms(1);en_h;delayms(1);en_l;
}
void lcd_dat(uchar dat)//向LCD1602写数据
{rs_o;rw_o;DDRA=0xff;en_o;rs_h;rw_l;LCD=dat;delayms(1);en_h;delayms(1);en_l;
}
void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据
{lcd_com(0x80+0x40*c+r);lcd_dat(dat);delayms(1);
}
void lcd_init(void)//LCD1602初始化,初始化后第一行显示temperature:,第二行显示.C
{DDRA=0xff;DDRB|=0x17;lcd_com(0x38);lcd_com(0x0c);lcd_com(0x06);lcd_write(0,2,0x54);lcd_write(0,3,0x65);lcd_write(0,4,0x6d);lcd_write(0,5,0x70);lcd_write(0,6,0x65);lcd_write(0,7,0x72);lcd_write(0,8,0x61);lcd_write(0,9,0x74);lcd_write(0,10,0x75);lcd_write(0,11,0x72);lcd_write(0,12,0x65);lcd_write(0,13,0x3a);lcd_write(1,11,0xdf);lcd_write(1,12,0x43);
}
void show(void)//把温度值送LCD1602显示
{if(dat2>=240)//遗留问题,温度为25时读出dat1=144,dat2=1正确,但却进入if(dat2&0xf8==0xf8)分支;{dat=(~(dat2*256+dat1)+1)*(0.0625*10);//取反加一,保留一位小数flag=1;}else{dat=(dat2*256+dat1)*(0.0625*10);flag=0;};if(flag==1)//负温度显示{lcd_write(1,10,0x30+dat%10);lcd_write(1,9,0xa5);lcd_write(1,8,0x30+dat%100/10);lcd_write(1,7,0x30+dat%1000/100);lcd_write(1,6,0x30+dat/1000);lcd_write(1,5,0x2d);}if(flag==0)//正温度显示{lcd_write(1,10,0x30+dat%10);lcd_write(1,9,0xa5);lcd_write(1,8,0x30+dat%100/10);lcd_write(1,7,0x30+dat%1000/100);lcd_write(1,6,0x30+dat/1000);lcd_write(1,5,0x20);//显示空格,把之前显示屏上可能存在的负号替换成空格}
}unsigned int Num_key[3][3]= {{1,2,3},{4,5,6},{7,8,9}};int scan(void)//用扫描的方式读取一个键盘上的输入
{while(1){uint i,j,ff=0;//I用于确定列,j用于确定行uchar ii=1,jj=1; //ii和jj分别用于和PORTC做与运算,改变或取得PORTC 0〜3位和PORTC 4〜7位中需要位置的电平信息if((PINC&0x80)!=0){delayms(5);if((PINC&0x80)!=0)//如果按下的是“ENTER”按钮{while((PINC&0x80)!=0);return -3;}}for(i=0; i<3; i++){PORTC=ii;jj=1;for(j=0; j<3; j++){if((PINC&(jj*16))!=0){delayms(5);//延时等待电压稳定,防抖if((PINC&(jj*16))!=0){while((PINC&(jj*16))!=0);return Num_key[j][I];返回该位置按钮对应的数值}}jj*=2;//指向下一个引脚delayms(5);}if((PINC&(jj*16))!=0){delayms(5);if((PINC&(jj*16))!=0){if(i==1)//如果按下的是0{while((PINC&(jj*16))!=0);return 0;}else if(i==0)//如果按下的是负号“-”{while((PINC&(jj*16))!=0);return -1;}}}delayms(5);PORTC=0x00;ii*=2;}}
}void main(void)
{lcd_init();initcom();while(1){dat1=0x00;dat2=0x00;Ds18b20_reset();//温度传感器初始化Ds18b20_write(0xcc);Ds18b20_write(0x44);//发送温度转换命令delayms(1000);//延时1s,等待温度转换完成Ds18b20_reset();Ds18b20_write(0xcc);Ds18b20_write(0xbe);//发送读温度寄存器命令dat1=Ds18b20_read();dat2=Ds18b20_read();show();if(cah){int sum=0,symb=1;delayms(200);while(1){int inp=scan();if(inp==-3)//如果按下ENTER键,代表温度输入完成{threshold=sum*symb;break;}else if(inp==-1)//如果按下负号键,则符号symb赋值为-1{symb=-1;}else//若输入其他数字,则将原油总额*10+当前获取的数字{sum=sum*10+inp;}}cah=0;PORTC=0;}if(flag)//如果是负数{date=-dat;}else//如果是正数{date=dat;}if(date>=(threshold*10)&&f==0&&c==0)//threshold是报警阈值,date是当前温度*10,因为要有一位小数,而date是整型变量,因此*10后成为整数保存。f代表的是串口是否发送指令关闭了报警功能。c代表此时是否正在报警。{c=1;PORTD+=8;}else if((date<(threshold*10)||f==1)&&c==1){c=0;PORTD-=8;}led_h;//关指示灯delayms(1000);}
}//串口通信速率我记得好像是18200
//时钟为内部的8M晶振
//在按键盘进行阈值更改时,务必按键时间长一点(比如1s),不然可能检测不到

【Proteus仿真】数字温度计,利用 Mega16 控制 DS18B20 ,若温度达到设定阈值,即可报警提醒(用串口控制停止报警、用键盘输入改变报警阈值)相关推荐

  1. 【Proteus仿真】51单片机汇编实现DS18B20+LCD1602显示

    [Proteus仿真]51单片机汇编实现DS18B20+LCD1602显示 Proteus仿真 汇编代码(.asm) ;**************************************** ...

  2. Proteus仿真数字钟表电路实验报告(可下载工程文件)

    Proteus仿真数字钟表电路实验报告(可下载工程文件) 实验目的 实验器件 实验步骤 1. 选择合适的Proteus器件中的译码器和数值显示器件能够对4位二进制数进行正常的数值显示 2. 组成模值为 ...

  3. 求Sn = a+aa+aaa+...+aaaaaa(n个a),其中a是一个数字,n代表a的位数,例如 2+22+222+2222+22222(此时n=5),n由键盘输入。

    求Sn = a+aa+aaa+...+aaaaaa(n个a),其中a是一个数字,n代表a的位数,例如 2+22+222+2222+22222(此时n=5),n由键盘输入. #include<st ...

  4. 公民身份号码是一种由18位数字组成的特征组合码,其排列顺序从左至右依次为:6位数字地址码、8位数字出生日期码,3位数字顺序码和1位数字校验码(校验码若为10则用字符X来表示)。编写程序从键盘输入一个

    #include <stdio.h> int main() {int add,year,month,day;/*定义地址码,年月日*/int shunxuma;/*定义顺序码*/char ...

  5. [MicroPython]stm32f407控制DS18B20检测温度

    2019独角兽企业重金招聘Python工程师标准>>> 1.实验目的 1. 学习在PC机系统中扩展简单I/O 接口的方法.     2. 进一步学习编制数据输出程序的设计方法.   ...

  6. micopython 18b20_[MicroPython]stm32f407控制DS18B20检测温度

    1.实验目的 1. 学习在PC机系统中扩展简单I/O 接口的方法. 2. 进一步学习编制数据输出程序的设计方法. 3. 学习DS18B20的接线方法,并利用DS18B20检测当前温度. 2.所需元器件 ...

  7. 基于单片机控制的数字温度计课程设计c语言,基于单片机的数字温度计课程设计.doc...

    基于单片机的数字温度计课程设计.doc 目录1 绪论 .11.1 设计背景 .11.2 设计要求 .11.3 设计思路 .12 系统硬件设计 12.1 设计总框图 12.2 各模块功能 .22.3 设 ...

  8. 单片机实例35——DS18B20数字温度计使用(硬件电路图+C语言程序)

    35. DS18B20数字温度计使用 1.DS18B20基本知识 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点.因此用它来组成一个测温系统,具 ...

  9. 基于数字温度传感器的数字温度计 华氏度和摄氏度

    课程设计题三十一:  基于数字温度传感器的数字温度计 (1) 设计要求: 利用数字温度传感器DS18B20与单片机结合来测量温度.利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显 ...

最新文章

  1. 计算机组原理ppt,计算机组原理第三章.ppt
  2. 几何着色器与细分(镶嵌)着色器
  3. VTK:Points之DensifyPoints
  4. pytorch教程龙曲良11-15
  5. html嵌入war_WAR文件与具有嵌入式服务器的Java应用程序
  6. leetcode122. 买卖股票的最佳时机 II
  7. diskgenius 数据迁移_活见鬼,明明删除了数据,空间却没减少! - *IT界农民工*
  8. SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理...
  9. 洛谷——P2433 【深基1-2】小学数学 N 合一
  10. Python 学习---------Day4
  11. JAVA 如何将String进行大小写转换
  12. ABBYY FineReader添加盖章戳记
  13. CodeSmith(C#)简单示例及相关小知识
  14. Android仿IOS屏幕亮度调节-自定义view系列(5)
  15. dts同步常见问题_阿里云DTS数据同步常见问题(一)
  16. 学习python记录2
  17. 无人机灯光秀,用到了哪些关键技术?
  18. 运算放大器基本原理与参数解读
  19. Python 股票分析入门
  20. 怎样成为优秀的前端_如何成为优秀的在线社区会员

热门文章

  1. Minecraft 1.19.2 Forge模组开发 07.拼图建筑(jigsaw)
  2. python setup.py install与python setup.py develop的区别
  3. 网络爬虫讲解(附java实现的实例)
  4. 2017cad光标大小怎么调_cad光标设置,详细教您CAD的十字光标如何设置大小
  5. 三星性能测试软件,三星T7 性能测试
  6. C++ fabs和abs区别
  7. Atitit.论图片类型 垃圾文件的识别与清理  流程与设计原则 与api概要设计 v2 pbj...
  8. SDI视频数据流格式简介(频率、速率、YUV、EAV、SAV)
  9. 微信文件撤回时间多长_微信消息怎么撤回?撤回时间限制是多久?
  10. airtest常用按键