本实验主要是将DS18b20与1602LCD显示屏、步进电机的联合调用。
实验原理:
本实验是一个便利项目小实验,用于完成单片机的课程设计,原理也比较简单主要是将步进电机用温度来进行控制,通过ds18b20对温度的感知,来完成对步进电机速度的控制,并且在1602上显示温度和步进电机的速度,为了方便我将步进电机直接插入main.c函数中并未单独列出。

实验原理图

实验仿真图

main.c

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "18b20.h"
#include "1602.h"
#include "delay.h"#define RS_CLR RS=0
#define RS_SET RS=1#define RW_CLR RW=0
#define RW_SET RW=1 #define EN_CLR EN=0
#define EN_SET EN=1#define DataPort P0sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电bit ReadTempFlag;//定义读时间标志void Init_Timer0(void);//定时器初始化
/*------------------------------------------------串口通讯初始化
------------------------------------------------*/
void UART_Init(void)
{SCON  = 0x50;             // SCON: 模式 1, 8-bit UART, 使能接收  TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  TR1   = 1;                  // TR1:  timer 1 打开                         TI=1;
}
/*------------------------------------------------主函数------------------------------------------------*/float Speed=0; char dianji[16];//定义显示区域临时存储数组int temp;
float temperature;
char displaytemp[16];void main (void)
{//定义显示区域临时存储数组LCD_Init();           //初始化液晶
DelayMs(20);          //延时有助于稳定
LCD_Clear();          //清屏
Init_Timer0();
UART_Init();
Lcd_User_Chr();       //写入自定义字符
LCD_Write_Char(13,1,0x01);//写入温度右上角点
LCD_Write_Char(14,1,'C'); //写入字符CLCD_Init();
//  LCD_Clear();//清屏while (1)         //主循环{if(ReadTempFlag==1){ReadTempFlag=0;temp=ReadTemperature();temperature=(float)temp*0.0625;if(temperature<28)
{Speed=7;}
else if((temperature>=28)&&(temperature<30))
{Speed=5;}
else
{Speed=3;}sprintf(dianji,"Speed  % 7.3f",Speed);//打印温度值LCD_Write_String(0,0,dianji);//显示第二行sprintf(displaytemp,"Temp  % 7.3f",temperature);//打印温度值LCD_Write_String(0,1,displaytemp);//显示第二行}Coil_A1                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替DelayMs(Speed);         //改变这个参数可以调整电机转速 ,//数字越小,转速越大,力矩越小Coil_B1DelayMs(Speed);Coil_C1DelayMs(Speed);Coil_D1DelayMs(Speed);  }}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响          //TH0=0x00;         //给定初值//TL0=0x00;EA=1;            //总中断打开ET0=1;           //定时器中断打开TR0=1;           //定时器开关打开
}
/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{static unsigned int num;TH0=(65536-2000)/256;       //重新赋值 2msTL0=(65536-2000)%256;num++;if(num==300)        //{num=0;ReadTempFlag=1; //读标志位置1}
}

18b20.c

#include"delay.h"
#include"18b20.h"
/*------------------------------------------------18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{bit dat=0;DQ = 1;    //DQ复位DelayUs2x(5);   //稍做延时DQ = 0;         //单片机将DQ拉低DelayUs2x(200); //精确延时 大于 480us 小于960usDelayUs2x(200);DQ = 1;        //拉高总线DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲dat=DQ;        //如果x=0则初始化成功, x=1则初始化失败DelayUs2x(25); //稍作延时返回return dat;
}/*------------------------------------------------读取一个字节
------------------------------------------------*/
unsigned char ReadOneChar(void)
{unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;DelayUs2x(25);}return(dat);
}
/*------------------------------------------------写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;DelayUs2x(25);DQ = 1;dat>>=1;}
DelayUs2x(25);
}/*------------------------------------------------读取温度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位b<<=8;
t=a+b;return(t);
}

1602.c

 名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------*/
#include "1602.h"
#include "delay.h"sbit RS = P2^4;   //定义端口
sbit RW = P2^5;
sbit EN = P2^6;#define RS_CLR RS=0
#define RS_SET RS=1#define RW_CLR RW=0
#define RW_SET RW=1 #define EN_CLR EN=0
#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数
------------------------------------------------*/bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;return (bit)(DataPort & 0x80);}
/*------------------------------------------------写入命令函数
------------------------------------------------*/void LCD_Write_Com(unsigned char com) {
// while(LCD_Check_Busy()); //忙则等待DelayMs(5);RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR;}
/*------------------------------------------------写入数据函数
------------------------------------------------*/void LCD_Write_Data(unsigned char Data) { //while(LCD_Check_Busy()); //忙则等待DelayMs(5);RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_();EN_CLR;}/*------------------------------------------------清屏函数
------------------------------------------------*/void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5);}
/*------------------------------------------------写入字符串函数
------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {     if (y == 0) {     LCD_Write_Com(0x80 + x);     //表示第一行}else {      LCD_Write_Com(0xC0 + x);      //表示第二行}        while (*s) {     LCD_Write_Data( *s);     s ++;     }}
/*------------------------------------------------写入字符函数
------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {     if (y == 0) {     LCD_Write_Com(0x80 + x);     }    else {     LCD_Write_Com(0xC0 + x);     }        LCD_Write_Data( Data);  }
/*------------------------------------------------初始化函数
------------------------------------------------*/void LCD_Init(void) {LCD_Write_Com(0x38);    /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38);  LCD_Write_Com(0x08);    /*显示关闭*/ LCD_Write_Com(0x01);    /*显示清屏*/ LCD_Write_Com(0x06);    /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C);    /*显示开及光标设置*/}
/*------------------------------------------------
设定二个自定义字符,LCD1602中自定义字符的地址为0x00--0x07,
即可定义8个字符
这里我们设定把一个自定义字符放在0x00位置(000),
另一个放在0x01位子(001)
------------------------------------------------*/void Lcd_User_Chr(void)
{ //第一个自定义字符LCD_Write_Com(0x40); //"01 000 000"  第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))LCD_Write_Data(0x00); //"XXX 11111" 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)LCD_Write_Com(0x41); //"01 000 001"  第2行地址LCD_Write_Data(0x04); //"XXX 10001" 第2行数据LCD_Write_Com(0x42); //"01 000 010"  第3行地址LCD_Write_Data(0x0e); //"XXX 10101" 第3行数据LCD_Write_Com(0x43); //"01 000 011"  第4行地址LCD_Write_Data(0x0e); //"XXX 10001" 第4行数据LCD_Write_Com(0x44); //"01 000 100"  第5行地址LCD_Write_Data(0x0e); //"XXX 11111" 第5行数据LCD_Write_Com(0x45); //"01 000 101"  第6行地址LCD_Write_Data(0x1f); //"XXX 01010" 第6行数据LCD_Write_Com(0x46); //"01 000 110"  第7行地址LCD_Write_Data(0x04); //"XXX 11111" 第7行数据LCD_Write_Com(0x47); //"01 000 111"  第8行地址LCD_Write_Data(0x00); //"XXX 00000" 第8行数据 //第二个自定义字符LCD_Write_Com(0x48); //"01 001 000"  第1行地址  LCD_Write_Data(0x03); //"XXX 00001" 第1行数据 LCD_Write_Com(0x49); //"01 001 001"  第2行地址LCD_Write_Data(0x03); //"XXX 11011" 第2行数据LCD_Write_Com(0x4a); //"01 001 010"  第3行地址LCD_Write_Data(0x00); //"XXX 11101" 第3行数据LCD_Write_Com(0x4b); //"01 001 011"  第4行地址LCD_Write_Data(0x00); //"XXX 11001" 第4行数据LCD_Write_Com(0x4c); //"01 001 100"  第5行地址LCD_Write_Data(0x00); //"XXX 11101" 第5行数据LCD_Write_Com(0x4d); //"01 001 101"  第6行地址LCD_Write_Data(0x00); //"XXX 11011" 第6行数据LCD_Write_Com(0x4e); //"01 001 110"  第7行地址LCD_Write_Data(0x00); //"XXX 00001" 第7行数据LCD_Write_Com(0x4f); //"01 001 111"  第8行地址LCD_Write_Data(0x00); //"XXX 00000" 第8行数据 }

delay.c

#include "delay.h"
/*------------------------------------------------------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   while(--t);
}
/*------------------------------------------------------------------------------------------------*/
void DelayMs(unsigned char t)
{while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}
}

51单片机下的温控智能小风扇相关推荐

  1. 51单片机WIFI手机APP智能窗户窗帘控制系统手动自动定时

    实践制作DIY- GC0045(2)-WIFI手机APP智能窗户窗帘控制系统 一.功能说明: 基于51单片机设计-WIFI手机APP智能窗户窗帘控制系统 功能介绍: STC89C52(AT89C52) ...

  2. 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】

    630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...

  3. 【51毕设案例】基于51单片机-定时喂食供氧智能鱼缸

    目录 功能介绍: 整体功能简述: 硬件框图: 软件流程图: 原理图: 仿真图: 元器件清单: 主要部分代码展示:void main() 工程管理展示: 下载内容展示: 更详细代码视频讲解及代码下载请看 ...

  4. 基于51单片机与ESP8266的智能台灯设计

    一.硬件设计 1. 硬件选型 主控芯片:选用STC89C52RC,单片机通过串口与EPS866模块通信. LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117- ...

  5. 基于51单片机的RFID RC522智能钱包

    RFID RC522智能钱包 基于51单片机的RFID RC522智能钱包,这个程序主要演示的是RFID RC522智能钱包中的设置及扣款功能,相信会扣款那么充值也就改一个数字的事,具体的功能要自己根 ...

  6. 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)

    前言 该智能家居系统以 STC89C52单片机为控制核心,结合 LCD1602 液晶显示屏.L298N电机驱动模块.光敏电阻,ESP8266WiFi模块,DS18B20温度计设计并实现了自动感光窗帘与 ...

  7. 基于51单片机的多功能智能语音循迹避障小车

    目录 一.功能介绍及硬件准备 二.电机控制及调速 三.小车循迹方案 四.跟随功能实现 五.测速功能实现 六.OLED显示车速 七.摇头避障功能实现 八.SU-03T语音模块介绍 九.语音切换小车模式+ ...

  8. 100、基于51单片机数码管温控 温度控制风扇系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Protues仿真 七.程序 八.资料包括 摘要 在炎热的夏天人们用电风 ...

  9. 35、基于51单片机自动灭火避障智能小车 消防灭火小车系统设计

    摘要 智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途.智能小车就是其中的一个体现,本次设计的多功能智能灭火避障小车 ...

  10. 安卓app+esp8266+51单片机+光敏电阻+lcd1602实现智能照明系统

    本文是本人51单片机和物联网的期末课程设计,没学过打板焊接,只用面包板和公母线实现. 安卓和esp8266控灯主要参考Android Studio设计APP实现与51单片机通过WIFI模块(ESP82 ...

最新文章

  1. 《javascript语言精粹》读书笔记(一)
  2. 某面试官吐槽:面试某大龄程序员,问HTTPS的加密过程,对方却答不出来!网友:这个问题毫无意义!...
  3. Java网络编程笔记3
  4. 使用Github+Hexo框架搭建部署自己的博客
  5. Angulary应用依赖里的platform-browser
  6. Linux 文件系统初探
  7. 索引原理及几种索引类型区别
  8. 最强阿里面试126题:数据结构+并发编程+Redis+设计模式+微服务
  9. AI ProCon倒计时6天:60+业内技术专家,探秘9大核心技术专题
  10. Win7 局域网内访问Sql2005
  11. EasyPoi 的样式使用及其自定义
  12. 设计模式之单例模式8种实现方式,其二:饿汉式-静态代码块饿汉式
  13. Hibernate---简介
  14. linux 单网卡 双ip,Linux操作系统单网卡双IP的设置
  15. itchat微信助手,kaggle 电影数据集分析,基于内容的电影推荐
  16. MATLAB读取图片时报错:“错误使用 fopen 找不到文件,确保文件存在且路径” 的原因及解决方法
  17. 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家...
  18. android checkbox分页问题分析
  19. Lint-staged自动修复格式错误及小结
  20. 8Manage PPM,助力北京测威提升项目运营效益

热门文章

  1. MDK5与Keil C51安装、合并、pack支持包的安装、STC芯片选型头文件的添加、界面美化(保姆级教程)
  2. linux添加phoenix引导,Phoenix OS安装方法
  3. 三种不同的梯度下降算法和正则方程的线性回归预测结果对比
  4. 自顶向下与自底向上编程思想的对比
  5. .net视频觉得做得最好的是天轰穿
  6. 浏览器全屏fullScreen
  7. GeoNet: Deep Geodesic Networks for Point Cloud Analysis
  8. 户籍化管理系统 c语言,全国各地消防户籍化管理系统
  9. 腾讯地图和百度地图经纬度的相互转换
  10. 软件架构师的12项修炼——关系技能修炼(2)