历史上的今天
返回首页

历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2021年10月25日 | #单片机#一个小型的单片机控制系统——智能窗帘控制系统

2021-10-25 来源:eefocus

介绍

涉及模块:


1.LCD1602液晶屏


2.DS18B20温度传感器


3.ADC0832数模转换芯片


4.TORCH_LDR光照度控件


5.步进电机


实现功能:


1.在LCD上显示实时温度与窗帘状态。


2.温度在15~25℃范围内开窗帘,范围外关窗帘。


3.光线强时关窗帘,光线弱时开窗帘。


4.可通过按钮手动开关窗帘。


仿真图

窗帘系统Proteus仿真图:

代码

项目由以下6个文件组成 :


main.c

define.h

delay.h

DS18B20.h

LCD1602.h

ADC0832.h

main.c

#include

#include

#include "define.h"

#include "delay.h"

#include "LCD1602.h"

#include "DS18B20.h"

#include "ADC0832.h"


void main()

{

//开启T0中断

EA = 1;

ET0 = 1;

ET1 = 1;

//设置T0

TMOD = 0X01;

TH0 = 0XFFED;

TL0 = 0XFFFF;

TR0 = 1;


LCD_init();

while(1)

{

DS_read_temperature();

display_temperature();

LightIntensity(ADC0832());

// LCD_write_data(Temp_AD);//在LCD上显示光照强度的数值

if(flag)

{

//关窗

if(status==0||Temp_AD<=Standard) 

{

for(;i {

P2 = Run[i];

delayms(RunSpeed);

}

}

//开窗

else

{

for(;i>0;i--)

{

P2 = Run[i];

delayms(RunSpeed);

}

}

}

}  

}


//定时器0中断服务

void InterruptTimer() interrupt 1

{

TH0 = 0XFFED;

TL0 = 0XFFFF;


if (key1==0)

{    //顺时钟

flag=0;

for(;i {

P2 = Run[i];

delayms(RunSpeed);

}

if (key2==0)

{   //逆时钟

flag=0;

for(;i>0;i--)

{

P2 = Run[i];

delayms(RunSpeed);

}

}

}


define.h

#ifndef _DEFINE_H_

#define _DEFINE_H_


#define uchar unsigned char

#define uint unsigned int


sbit RS=P2^6;

sbit RW=P2^5;

sbit EN=P2^7;

sbit DQ=P3^3;

sbit CLK=P3^1;

sbit CS=P3^0;

sbit DO=P3^2;

bit DS_OK=1;

sbit key1 = P1^0; //开关开窗帘

sbit key2 = P1^1; //开关关窗帘    

uchar code Run[]={

0x00,0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09,0xff};

uchar RunSpeed = 60;

uchar status=0;

uchar i=0;

uchar Temp_AD=0;//现在的光照强度

uchar Standard='F';//光照强弱临界值

bit flag=1; //手动模式/自动模式的标志

uchar CurtainStatu[]={"  STATE :                  "};

uchar buffer_line2[]={"  Temp:       C            "};

uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

uchar current=0;

uchar display_digit[]={0,0,0,0};

uchar temp_value[]={0x00,0x00};

uchar back_temp_value[]={0x00,0x00};

char alarm_HL[]={70,-10};

char sign_temp;

bit LO_alarm=0;

bit HI_alarm=0;


#endif


delay.h

#ifndef _DELAY_H_

#define _DELAY_H_


void delay(uint z)

{

uint x;

while(z--)

for(x=50;x>0;x--);

}


void delay0(uint z)

{

uint x,y;

for(x=z;x>0;x--)

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

}


void delay1(uint y)

{

uint x;

while(y--)

for(x=4500;x>0;x--);

}


void delayms(uchar x)

{

int i,j;

for(i=x;i>0;i--)

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

}

void delay_us()

{_nop_();_nop_();

_nop_();_nop_();}

void delay_1us(uint x) //延时

{

while(--x);

}


#endif


DS18B20.h

#ifndef _DS18B20_H_

#define _DS18B20_H_

#include "define.h"

#include "DELAY.H"

#include "LCD1602.h"

#include

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

/************全局都要精确延时************************/

uchar DS_init()

{

uchar state;    

DQ=1;

delay_1us(8);

DQ=0;

delay_1us(80); //精确延时大于4800US

DQ=1;

delay_1us(8);

state=DQ;

delay(100); //延时

return state; //返回值为1时,初始化失败

}


void DS_write_byte(uchar dat)

{

uchar i;

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

{

if((dat&0x01)==0)  //写一

{

DQ=0;

delay_1us(5);

  DQ=1;   //精确延时,形成脉冲

}

else    //写0

{

DQ=0;

delay_1us(1);

DQ=1;

delay_1us(4);

}

dat>>=1;

}

}


uchar DS_read_byte()

{

uchar i,dat=0;

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

{

DQ=0;

dat>>=1;

DQ=1;

if(DQ==1)

dat|=0x80;

else

dat|=0x00;

delay_1us(30);

DQ=1;

}

return dat;

}


void DS_read_temperature()

{

if(DS_init()==1)    //返回值为1时

DS_OK=0;    //DS_ok=0代表失败

else

{

DS_init();

DS_write_byte(0xcc);//跳过序列号

DS_write_byte(0x44);  //启动温度转换

DS_init();

DS_write_byte(0xcc);

DS_write_byte(0xbe);//启动读取温度

temp_value[1]=DS_read_byte(); //先写低位在写高位

temp_value[0]=DS_read_byte();

DS_OK=1;

}

}


void display_temperature()

{

uchar flag=0;

if((temp_value[0]&0xf8)==0xf8)

{

flag=1;

temp_value[0]=~temp_value[0];

temp_value[1]=~temp_value[1]+1;

if(temp_value[1]==0x00)

temp_value[0]++;

}

display_digit[3]=df_tab[temp_value[1]&0x0f];//取小数

//取整数

current=((temp_value[0]&0x07)<<4)|((temp_value[1]&0xf0)>>4);

if(current<=25&¤t>=15)

status=1;//15~25°C开窗帘 

else

status=0;//范围之外关窗帘


//判断正负

sign_temp=flag?-current:current;

LO_alarm=sign_temp<=alarm_HL[1]?1:0;

HI_alarm=sign_temp>=alarm_HL[0]?1:0;


/*********分解整数*************************************/

display_digit[0]=current/100;

display_digit[1]=current%100/10;

display_digit[2]=current%10;

/****装入缓冲*********************************************/

buffer_line2[8]=display_digit[0]+'0';

buffer_line2[9]=display_digit[1]+'0';

buffer_line2[10]=display_digit[2]+'0';

buffer_line2[11]='.';

buffer_line2[12]=display_digit[3]+'0';

 /*********屏蔽高位不显示*******************************/

if(display_digit[0]==0)

buffer_line2[8]=' ';

if(display_digit[0]==0&&display_digit[1]==0)

buffer_line2[9]=' ';

if(flag==1)

{

if(buffer_line2[9]==' ')

buffer_line2[9]='-';

else

{

if(buffer_line2[8]==' ')

buffer_line2[8]='-';

else

buffer_line2[7]='-';

}

}

if (i==0)

strcpy(CurtainStatu,"  STATE : OPEN             ");

else if(i==sizeof(Run))

strcpy(CurtainStatu,"  STATE : CLOSE            ");

LCD_write_cmd(0x00);

LCD_display(0x00,CurtainStatu);

LCD_display(0x40,buffer_line2);

LCD_write_cmd(0x80+0x4d);

LCD_write_data(0x00);

LCD_write_cmd(0x80+0x4e);

LCD_write_data('C');  

}


#endif


LCD1602.h

#ifndef _LCD1602_H_

#define _LCD1602_H_


uchar LCD_check_busy()

{

uchar state;

RS=0;

RW=1;

delay(2);

EN=1;

state=P0;

delay(2);

EN=0;

delay(2);

return state;

}

void LCD_write_cmd(uchar cmd)

{

while((LCD_check_busy()&0x80)==0x80);

RS=0;

RW=0;

delay(2);

EN=1;

P0=cmd;

delay(2);

EN=0;

delay(2);

}

void LCD_write_data(uchar dat)

{

while((LCD_check_busy()&0x80)==0x80);

RS=1;

RW=0;

delay(2);

EN=1;

P0=dat;

delay(2);

EN=0;

delay(2);

}

void LCD_display(uchar position,uchar *s)

{

uchar i;

LCD_write_cmd(0x80+position);

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

{

LCD_write_data(s[i]);

}

}


void LCD_init()

{

LCD_write_cmd(0x38);

LCD_write_cmd(0x0c);

LCD_write_cmd(0x06);

LCD_write_cmd(0x01);

}


#endif


ADC0832.h

#ifndef _ADC0832_H_

#define _ADC0832_H_


uchar ADC0832()

{

uchar i,temp;

CLK=0;

CS=0;//选中AD芯片

delay0(1);

DO=1;//发送bit1 说明开始转换

CLK=1;//一个上升沿 将开始位输出ADC0832

delay0(1);

CLK=0;

DO=1;

delay0(1);

CLK=1;

delay0(1);

CLK=0;

DO=0;

delay0(1);

CLK=1;

delay0(1);

CLK=0;

DO=1;

for(i=8;i>0;i--)

{

CLK = 1;

delay(1);

CLK=0;

delay(1);

temp|=DO;

if(DO)

temp++;

temp<<1;

}

CS=1;//释放芯片

return temp;//返回读回来的数值

}


void  LightIntensity(unsigned char num1)

{

//ad在光度强的时候采集回来的电压是小的数值

//为了方便显示用255将其取反,为光度越强的时候数值越大

//保留实际ad的数值 比如ad50的时候对应80

//转换为更100有关的高度

num1=num1/2.55;

Temp_AD=100-num1;

}

推荐阅读

史海拾趣

AKM [Asahi Kasei Microsystems]公司的发展小趣事
  1. 成立与发展: Asahi Kasei Microsystems(AKM)成立于1983年,是日本旭化成集团旗下的一家子公司,总部位于东京。该公司主要致力于集成电路和半导体解决方案的研发和生产。AKM的创始目标是为市场提供高质量、高性能的模拟芯片和数字芯片,以满足消费电子、通信、汽车和工业等行业的需求。

  2. 产品创新: AKM在模拟和数字领域取得了一系列创新成果。其中,其声音处理技术尤为突出,涵盖了高保真音频、语音识别和声音传感器等领域。AKM的音频解决方案在高端音响、耳机、智能手机和汽车音响系统中得到广泛应用,为用户带来出色的听觉体验。

  3. 市场扩展: 随着技术的不断创新和产品线的拓展,AKM逐渐在全球范围内建立了广泛的客户群体。除了日本市场外,其产品远销亚洲、欧洲和美洲等地区。AKM的产品在全球范围内备受认可,并赢得了众多合作伙伴的信任与支持。

  4. 技术合作: 为了保持在市场上的竞争优势,AKM积极寻求与其他公司和机构的技术合作。通过与声学专家、电子设备制造商和汽车制造商等行业领先企业的合作,AKM不断吸收和借鉴先进的技术理念,推动产品创新和技术进步。

  5. 未来展望: 面对日益激烈的市场竞争和技术变革,AKM将继续加强研发投入,不断提升产品质量和技术水平。同时,AKM将积极应对全球经济形势和市场需求的变化,拓展新的业务领域,为客户提供更加全面和专业的解决方案。

Elektron公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,Elektron公司不断进行技术创新和产品升级。公司成功开发出适用于船上使用的单点和多点焊接整流器以及弧光灯的电影整流器等产品,进一步扩大了市场份额。同时,Elektron还注重产品质量和性能的提升,通过引进先进的生产设备和工艺,不断提高产品的可靠性和耐用性。

Hamamatsu公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,Elektron公司不断进行技术创新和产品升级。公司成功开发出适用于船上使用的单点和多点焊接整流器以及弧光灯的电影整流器等产品,进一步扩大了市场份额。同时,Elektron还注重产品质量和性能的提升,通过引进先进的生产设备和工艺,不断提高产品的可靠性和耐用性。

Hi-Tron Semiconductor Corp公司的发展小趣事

随着环保意识的不断提高和可持续发展理念的普及,Elektron公司开始注重环保和可持续发展方面的工作。公司积极采用环保材料和节能技术,降低产品制造过程中的能耗和排放。同时,Elektron还加强了对废弃物的处理和回收工作,努力实现资源的循环利用和环境的可持续发展。这些措施不仅有助于公司降低成本和提高效率,也符合社会和消费者对环保和可持续发展的期望和要求。

以上五个故事分别从不同角度概述了Elektron公司的发展过程,包括创立与初期发展、技术创新与产品多样化、全球扩张与市场领导地位、技术突破与行业引领以及环保理念与可持续发展等方面。这些故事共同构成了Elektron公司丰富多彩的发展历程和辉煌成就。

Hanghsing Enterprise Co Ltd公司的发展小趣事

Elektron公司的故事始于1942年,由威利·科伯以Elektron物理技术设备工厂Kerber的名称成立。当时,该公司主要生产基于汞蒸气整流器的固定电池电源和船用电池充电器。这些产品在市场上取得了良好的反响,为公司的发展奠定了坚实的基础。在随后的几年里,Elektron不断扩大产品范围,开始涉足汽车行业的电池充电器以及焊接和切割工艺的电源等领域。

ELDECO公司的发展小趣事

在激烈的市场竞争中,ELDECO公司始终坚持质量至上的原则。公司建立了严格的质量管理体系和检测机制,确保每一台出厂的ELD产品都符合高质量标准。同时,公司还注重售后服务体系建设,为客户提供及时、专业的技术支持和解决方案。正是凭借过硬的产品质量和优质的售后服务,ELDECO公司的ELD产品赢得了客户的广泛认可和信赖。

问答坊 | AI 解惑

急需!!! 汽车电子方案!!!

急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 ...…

查看全部问答>

TI关于DC-DC电源芯片有哪些呀

TI关于DC-DC电源芯片有哪些呀 还能提供一些完整的资料吗    集思广益 谢谢大家…

查看全部问答>

问大家关于串口通讯的问题

我做一个232的通讯,希望传一个16进制数比如0XFE到PC,然后PC端通过DELPHI写的程序能读出这个16进制数.哪位有这个例子,PC端怎么读(是通过自己写程序,还是有现成的调试工具)我到现在还不知道呢,哪位讲下啊…

查看全部问答>

红、黄、绿灯的控制系统设计

控制一组红绿黄灯,通过反复检测开关S1、S2,要求由S1、S2 的“闭合”和“断开”控制红、 绿、黄3灯的点亮。 当S1断,S2断时,黄灯亮; 当S1断,S2合时,绿灯亮; 当S1合,S2断时,红灯闪亮,闪烁周期为2s; 当S1合,S2合时,红灯亮。 要求:1 ...…

查看全部问答>

就我个人经历,大家在无线选型上常会有的一些误区:

就我个人经历,大家在无线选型上常会有的一些误区: 1,通信速率,比如很多公司是这样宣传的NRF2401速率是1MBPS,    但,实际上这只是发射速率,而实际真正完成一次发送速率需要涉及到具体的功能,因为功能越复杂,完成一次数据采集的 ...…

查看全部问答>

请教144脚FSMC的问题

我现在要接2片8位的SRAM,没有其他用外总线的器件,请问我现在的接法对不对 CPU                  SRAM1 D0-D7              ...…

查看全部问答>

想知道某些STMCU报价,有什么方法

                                 最近选型中,想知道一些型号的MCU报价,上哪找去?…

查看全部问答>

JX51开发板小批量喽 ~~~~~~~~~~~~~·

  所有板子的大集合,现在共有40多块,全部手工焊接哦。。   相关教程将会陆续发布 [ 本帖最后由 youki12345 于 2011-12-7 21:57 编辑 ]…

查看全部问答>

什么是自动化控制

什么是自动化控制系统呢?     准确来说是指在没有人直接参与的情况下,利用外加的设备或装置,使机器、设备或生产过程的某个工作状态或参数自动地按照预定的规律运行。自动控制是相对人工控制概念而言的。指的是在没人参与的情况下,利 ...…

查看全部问答>

AD15和谐故障

各位好,升级至AD15,但无法添加License。如图所示 …

查看全部问答>