——基于STC高性能单片机温度采集控制器设计

目录

1. 课程设计目的

2. 硬件设计

3. 软件设计

4. 安装调试

5. 结果分析

6. 体会

7. 参考文献

(一)课程设计目的

通过基于STC高性能单片机温度采集控制器 的硬件设计和软件编程,了解STC单片机硬 件电路设计的一般方法和软件编程的思路及 方法,巩固单片机课程的理论知识,提高单片机小系统设计和调试的技巧,增强对基于 项目的课题设计的本领。

(二)硬件设计

???????????????

(一)软件设计

#include"reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

#include"lcd.h"

#include"temp.h"

#include

typedef unsigned int u16;  //对数据类型进行声明定义

typedef unsigned char u8;

sbit beep=P1^5;

void LcdDisplay(int);

void UsartConfiguration();

u8 Disp[]="170030153WELCOME";

u8 Disp_1[]="  ZHAOZIQIANG  ";

u8 CNCHAR[6] = "摄氏度";

void Lcdprint()//显示姓名,学号

{

u16 i;

for(i=0;i<16;i++)

{

LcdWriteData(Disp[i]);

}

}

void Lcdprint_1()//只显示学号

{

u16 i;

for(i=0;i<16;i++)

{

LcdWriteData(Disp_1[i]);

}

}

void delay(u16 i)//延时

{

u16 j;

for(j=0;j<10;j++)

{

while(i--);

}

}

void main(void)

{

LcdInit();

Lcdprint_1(); //第1次,第一行显示姓名

delay(150000);//延时

UsartConfiguration();

LcdInit(); //初始化LCD1602

LcdWriteCom(0x00+0x80);//写地址 80表示初始地址

Lcdprint();  //第2次,第一行显示学号,和欢迎

LcdWriteCom(0x40+0x87);

LcdWriteData('C'); //第2次,第二行显示温度

while(1)

{

LcdDisplay(Ds18b20ReadTemp());

Delay1ms(1);//1s钟刷一次

//调整延时时间得到不同频率的响声

}

}

void LcdDisplay(int temp)  //lcd显示

{

unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组

float tp;

if(temp< 0)//当温度值为负数

{

LcdWriteCom(0x80+0x40);//写地址 80表示初始地址

SBUF='-';//将接收到的数据放入到发送寄存器

while(!TI);         //等待发送数据完成

TI=0; //清除发送完成标志位

LcdWriteData('-');  //显示负

//因为读取的温度是实际温度的补码,所以减1,再取反求出原码

temp=temp-1;

temp=~temp;

tp=temp;

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算由?.5,还是在小数点后面。

}

else

{

LcdWriteCom(0x80+0x40);//写地址 80表示初始地址

LcdWriteData('+'); //显示正

SBUF='+';//将接收到的数据放入到发送寄存器

while(!TI);         //等待发送数据完成

TI=0; //清除发送完成标志位

tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

}

datas[0] = temp / 10000;

datas[1] = temp % 10000 / 1000;

datas[2] = temp % 1000 / 100;

datas[3] = temp % 100 / 10;

datas[4] = temp % 10;

LcdWriteCom(0x81+0x40);  //写地址 80表示初始地址

LcdWriteData('0'+datas[0]); //百位

SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器

while (!TI);         //等待发送数据完成

TI = 0;

LcdWriteCom(0x82+0x40); //写地址 80表示初始地址

LcdWriteData('0'+datas[1]); //十位

SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器

while (!TI);         //等待发送数据完成

TI = 0;

LcdWriteCom(0x83+0x40);//写地址 80表示初始地址

LcdWriteData('0'+datas[2]); //个位

SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器

while (!TI);         //等待发送数据完成

TI = 0;

LcdWriteCom(0x84+0x40);//写地址 80表示初始地址

LcdWriteData('.'); //显示 ‘.’

SBUF = '.';//将接收到的数据放入到发送寄存器

while (!TI);         //等待发送数据完成

TI = 0;

LcdWriteCom(0x85+0x40); //写地址 80表示初始地址

LcdWriteData('0'+datas[3]); //显示小数点

SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器

while (!TI);         //等待发送数据完成

TI = 0;

LcdWriteCom(0x86+0x40); //写地址 80表示初始地址

LcdWriteData('0'+datas[4]); //显示小数点

SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器

while (!TI);         //等待发送数据完成

TI = 0;

for(i=0; i<6; i++)

{

SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器

while (!TI);         //等待发送数据完成

TI = 0;

}

}

void UsartConfiguration()//函 数 名         :UsartConfiguration()函数功能   :设置串口

{

SCON=0X50;//设置为工作方式1

TMOD=0X20;//设置计数器工作方式2

PCON=0X80;//波特率加倍

TH1=0XF3;//计数器初始值设置,注意波特率是4800的

TL1=0XF3;

//ES=1;//打开接收中断

//EA=1;//打开总中断

TR1=1;//打开计数器

}

!!!!!!!!!!!!!!!!!!

上面是主函数,temp.c也进行了更改,不懂的直接复制进去就好。

int Ds18b20ReadTemp()

{ float fmq=0;

int temp = 0;

uchar tmh, tml;

Ds18b20ChangTemp(); //先写入转换命令

Ds18b20ReadTempCom();//然后等待转换完后发送读取温度命令

tml = Ds18b20ReadByte();//读取温度值共16位,先读低字节

tmh = Ds18b20ReadByte();//再读高字节

temp = tmh;

temp <<= 8;

temp |= tml;

fmq=temp*0.0625*100+0.5;

if( fmq>=2600)

{

beep=~beep;

}

return temp;

}

(四)安装调试

将普中科技开发板与电脑相连,并将lcd正确插入开发板里,利用烧录软件将程序烧录进芯片里即可观察到现象。Lcd显示屏首先显示ZHAOZIQIANG字符串6秒,随后lcd第一行显示170030153WELCOME字符串,第二行显示实时温度。当温度升至26.00°c时,蜂鸣器发出报警声。(五)结果分析正确输出了实时温度,当温度超出26°c发出滴滴的报警声。程序无报错,实验现象符合预期。

(六)体会

开始我想用数码管进行显示,但没有办法显示我姓名,数码管只能显示0-F,只能换用lcd1602,拿到普中科技lcd1602源程序后,将程序研究后更改显示内容,成功显示出170030153,或者zhaoziqiang字符串,但是只可以显示一行,没办法在第二行显示,查找之后发现第一行地址为0x80,第二行地址为0x80+0x40,虽然找到了入口地址,但怎末调用函数进行显示成了难题。

因为lcd1602源程序并没有写第一行入口地址,直接就是初始化,写入命令。经过漫长的对比查找后,大概3个小时吧,才发现调用入口地址函数在lcd.h里,至此,成功的在第二行显示出了内容。

可以在第二行显示内容后,接下来就是将DS18B20温度传感器采集的内容传到显示屏显示即可。一开始我想把读到的温度拆成位后读出来像字符串一样进行显示,但无论如何都没办法显示出内容。后来研究了普中科技的代码,他的是串口接受温度,把得到的位一位一位的通过发送寄存器发出去,,,没有理解,但不妨碍我借用,果然出结果了,真神奇啊!

项目进入尾声,只差报警函数了,只有一个蜂鸣器能出声,led能闪瞎眼,果断弃用,就决定是你了,蜂鸣器!将蜂鸣器函数放在主函数里,处理的温度转了2轮才到蜂鸣器,这样太慢了,请小伙伴和我一起改进吧,将蜂鸣器函数放在温度处理函数里,这样就可以立即判断温度是否超标。缺点就是响的频率与lcd刷新频率也有关系了。

最后优化了lcd 刷新频率,使得蜂鸣器也可以清脆的哒哒哒哒哒哒哒哒,项目结束。

(7)参考资料普中科技,实验17:DS18B20温度传感器源程序普中科技,实验23:LCD12864液晶源程序普中科技,中级实验7. LCD1602显示温度+串口接收温度源程序

单片机原理及应用pdf_单片机原理及应用课程设计相关推荐

  1. 单片机串口中断控制流水灯c语言,基于单片机AT89C51控制的中断控制流水灯_课程设计报告...

    <基于单片机AT89C51控制的中断控制流水灯_课程设计报告>由会员分享,可在线阅读,更多相关<基于单片机AT89C51控制的中断控制流水灯_课程设计报告(25页珍藏版)>请在 ...

  2. android课程设计时钟,单片机制作的电子钟(含闹钟功能)课程设计报告

    #include #include unsigned char code displaywelcome[]={" Welcome To My Lcd Timer"};//欢迎界面 ...

  3. 数字模拟电路课程设计multisim仿真源文件和设计原理

    multisim仿真源文件和设计原理含核心的卡诺图化简过程 字节智控 https://zijiezhikong.taobao.com/ 五人表决器multisim数字电路课程设计(含设计原理) 简易出 ...

  4. 2psk系统的仿真课程设计matlab,通信原理课程设计-基于MATLAB-Simulink的2PSK仿真

    <通信原理课程设计-基于MATLAB-Simulink的2PSK仿真>由会员分享,可在线阅读,更多相关<通信原理课程设计-基于MATLAB-Simulink的2PSK仿真(17页珍藏 ...

  5. 基于51单片机的课程设计(毕业设计)——电子贺卡

    本篇文章将介绍一个基于51单片机的电子贺卡,本作品可用于课程设计.毕业设计的参考.其所用到的外设硬件以及程序的代码量都是相对较少的,对于51单片机的初学者,通过本设计熟悉51单片机的使用是非常好的选择 ...

  6. 丁向荣单片机pdf_单片机原理与应用(C语言版)——基于STC15W201S系列单片机 丁向荣 纺著 9787121246357...

    第1章 STC15W201S单片机结构与工作原理 1.1 微型计算机结构与单片机 1.1.1 微型计算机的基本结构与工作原理 1.1.2 单片机概述 1.2 STC15W201S单片机结构与工作原理 ...

  7. 单片机中存储器扩展位地址线怎么算_51单片机CPU结构各部件的原理详细分析

    一. 51单片机串行口工作原理 MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD(P3.0)和TXD(P3.1)可与外设电路进行全双工的串行异步通信. 1.串行端口的基本特点 8031单 ...

  8. 51单片机并行I/O口工作原理

    51单片机并行I/O口工作原理 51单片机并行I/O口工作原理 P1: 仅作为双向I/O口 P3: 做为双向I/O口,同时还有第二功能 P2: 双向I/O口和高8位地址线,与P1的结构相比多了一个数据 ...

  9. 51单片机之定时器\计数器的工作原理

    51单片机之定时器\计数器的工作原理 定时器/计数器的结构: 何时处于计数器方式?何时处于定时器方式? TCON和TMOD特殊功能寄存器: 定时器/计数器工作方式: 方式0:13位的定时器/计数器 方 ...

最新文章

  1. 后端程序员必备的Linux基础知识
  2. 值更新事件(触发带基础属性到指定字段)
  3. 在EditPlus中配置PHP调试
  4. R语言使用strsplit函数遇到non-character argument怎么解决
  5. Linux 命令(13)—— cut 命令
  6. oracle和timesten整合,Timesten与Oracle SQL执行时间对比
  7. 深度linux操作系统怎么样,深度Deepin国产操作系统使用体验报告!
  8. 数据结构与算法(总结)
  9. java 比较日期大小(方法之一compare to 备忘)
  10. php投影,投影效果怎么做?PS制作逼真的投影效果
  11. 垃圾纸盒的叠法-超级实用
  12. 赵小楼《天道》《遥远的救世主》深度解析(16)丁元英停止私募基金不可言说的原因
  13. 赏金猎人:德州堕胎法案 | 经济学人早报精选20210902
  14. USB通信协议与供电协议全解
  15. 和风天气预报AndroidAPP-安卓(包含功能:天气预报-备忘录-高德地图定位-日历)
  16. 网络安全能力认证CCSC技术Ⅰ级认证培训
  17. 企业管理者谦虚_为什么谦虚是优秀开发者最重要的特征
  18. [OpenCV] CV_32F与CV_8U之间的数据类型转换
  19. 【智能制造】当数据智能遇上工业制造
  20. 关于武汉蔡甸•九真山第三届登山节活动临时暂停致歉全体参赛及相关工作人员的一封信!

热门文章

  1. MySQL高级知识(十六)——小表驱动大表
  2. C# 列表中查找大小比较
  3. SQL Server 2017 新功能分享
  4. 十一章--软件设计与实现
  5. jquery编写插件的三种方法
  6. 大数据量表的优化查询
  7. C++中的内存分配new()
  8. jQuery html5Validate基于HTML5表单验证插件
  9. 微信小程序 一些要点
  10. 每周更新学习进度表--第九周