单片机课设-遥控器控制流水灯流速资料_第1页
单片机课设-遥控器控制流水灯流速资料_第2页
单片机课设-遥控器控制流水灯流速资料_第3页
单片机课设-遥控器控制流水灯流速资料_第4页
单片机课设-遥控器控制流水灯流速资料_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第一章设计任务及要求a)设计实现功能STC12C5A60S2(引脚排序及基本功能同AT89S51)作为主控芯片,设计利用LCD1602显示时间、温度和遥控接收电路,并使发光二级管循环点亮。一是扩展DS12C887外围电路,实现时间信息显示;二是DS18B20温度信息显示的设计;三是利用遥控器设置参数,控制发光二级管循环点亮的速度。b)原理图设计1.原理图设计要符合项目的工作原理,连线要正确。2.图中所使用的元器件要合理选用,电阻、电容等器件的参数要正确标明。c)程序调计1.根据要求,将总体功能分解成若干个子功能模块,每个功能模块完成一个特定的功能。2.根据总体要求及分解的功能模块,确定各功能模块之间的关系,设计出完整的程序流程图。d)程序调试1.编写相关程序,并进行仿真。2.将程序下载到单片机,进行运行调试。e)设计说明书1.原理图设计说明简要说明设计目的,原理图中所使用的元器件功能及在图中的作用,各器件的工作过程及顺序。2.程序设计说明对程序设计总体功能及结构进行说明,对各子模块的功能以及各子模块之间的关系作较详细的描述。3.画出工作原理图,程序流程图并给出相应的程序清单。1.2设计基本要求1.认真认识设计的意义,掌握设计工作程序,学会使用工具书和技术参考资料,并培养科学的设计思想和2.提高模型建立和设计能力,学会应用相关设计资料进行设计计算的方法。3.提高独立分析、解决问题的能力,逐步增强实际应用训练。通顺,电路图内容完整、清楚、规范。2第二章设计原理STC12C5A60S2是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU一种灵活性高且价廉的方案。STCCAS脚图3此作为输入时,P2口的管脚被外部拉低,P程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是PP3.0P3.1P3.2P3.3P4P3.5P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。4字符液晶有两种,一种显示的是绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的。本课题所用1602液晶模块,显示屏是蓝2468第3脚:VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高E1357952.2.31602字符液晶使用方法(1)基本操作时序EHD0~D7=状态字无EH写数据无(2)RAM有80个8位的RAM缓冲区,其地址和屏幕的对应关系如下图所示(3)1602字符液晶字库这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的显示出来,我们就能看到字母“A”。6SCDS12C887实时时钟芯片功能丰富,可以用来直接代替IBMPC上的时钟日历芯片DS12887,同时,它秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887自带有此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。72.3.2DS12C887引脚介绍换到内部自带的锂电池上,以保证内部的电路能够正常工作。 号的输出。AD0~AD7:复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0~AD7 (14)AS:地址选通输入脚,在进行读写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到 (17)DS/RD:数据选择或读输入脚,该引脚有两种工作模式。当MOT接VCC时,选用Motorola工作模CS输入,低电平有效。在掉电时,其内部控制寄存器不受影响。82.3.3DS12C887内部地址空间DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为±2°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。9GND:为电源地;DQ:为数字信号输入/输出端;VDD:为外接供电电源输入端(在寄生电源接线方式时接地)一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方便使用。在本系统中我们采用红外一体化接收头HS0038。HS0038黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗HS0038为直立侧面收光型。它接收红外信号频率为38kHz,周期约26µs,同时能对信号进行放大、检波、随着家用电器、视听产品的普及,自动化办公设备的广泛应用和网络化的不断发展,越来越多的产品具有了待机功能(如遥控开关、网络唤醒、定时开关、智能开关等)。产品的待机功能实现遥控操作,极大地方便了我们的生活。在家庭或工业控制现场,一些手动操作不太方便的场合,可以使用现有遥控器通过设置代替手动操作,比如可以利用家中现有的彩电遥控器,控制其它没有遥控功能的电器(如电灯、计GND:为电源地;Vs:为外接供电电源输入端OUT:为红外接收信号输出端;DS12C8DS12C8时信间息HS0038红外接收头遥信控息系统工作原理图DSDS18B20器温信度息时间温度遥控信息流速信息LCD1602液晶显示锁存器和流水灯示的亮度。5遥控接收模块电路设计CLS第四章软件设计4.1系统程序流程图是是否否定时器定时器0中断函数开始是否是否读回TH1的值是否按键按下流速变量的值/**********************************************************************************************定义及子程序的声明*********************************************************************************************************/#definewr_comXBYTE[0xC000]#definewr_dataXBYTE[0xC100]#definerd_comXBYTE[0xC200]#definerd_dataXBYTE[0xC300]//写命令//写数据//读命令//读数据/*子程序声明*/voidwrite_cmd(BYTEcmd);voidwrite_data(BYTEdat);voidwrite_string(BYTE*s);voidset_display_place(BYTEline,column);voidwrite_string_lcd(BYTEline,column,unsignedchar*string);voidwrite_data_lcd(BYTEline,column,dat);voidlcd_init(void);voidcrti(unsignedlongdat);voidcrt_r(floatx,unsignedcharN);voidDelay(WORDn);/************************************************************************Functionname:Descriptions:write_cmd************************************************************************/voidwrite_cmd(BYTEcmd){do{dl=rd_com;}while((dl&0x80)!=0);//判忙wr_com=cmd;}/**********************************************************************Functionname:Descriptions:write_data写入数据**********************************************************************/voidwrite_data(BYTEdat){do{dl=rd_com;}while((dl&0x80)!=0);//判忙wr_data=dat;}/***********************************************************************Functionname:Descriptions:write_string写入字符串***********************************************************************/voidwrite_string(BYTE*s){while(*s!='\0'){write_data(*s);}//'\0'为字符串结束标志}/**********************************************************************Functionname:Descriptions:set_display_place设置字符的显示位置**********************************************************************/voidset_display_place(BYTEline,column){essif(line==1){address=0x80+column;}elseif(line==2){address=0xc0+column;}write_cmd(address);}/*******************************************************************Functionname:Descriptions:将字符串写到指定的位置显示在lcd的特定位置*******************************************************************/voidwrite_string_lcd(BYTEline,column,unsignedchar*string){set_display_place(line,column);write_string(string);}/******************************************************************Functionname:Descriptions:将字符写到指定的位置显示在lcd的特定位置*******************************************************************/voidwrite_data_lcd(BYTEline,column,dat){set_display_place(line,column);write_data(dat);}/***************************************************************液晶模块初始化**********************************************************************************/voidlcd_init(void){write_cmd(0x38);//write_cmd(0x38);//write_cmd(0x06);//write_cmd(0x0c);//write_cmd(0x01);//}/***************************************************************显示长整型数据*******************************************************************************/voidcrti(unsignedlongdat){BYTEdhi,dli,ddi,dei;unsignedlongdatah;unsignedlongdatal;datahdat;hiif(datah>=10){{datah/=10;dhi+;}while(datah>=10);datahdat;ddi=dhi;for(dli=0;dli<dhi;dli++){atalfor(dei=0;dei<ddi;dei++){datal*=10;}datah=dat/datal;dat=dat%datal;datah+=0x30;write_data(datah);ddi--;}dat+=0x30;write_data(dat);}{dat=dat+0x30;write_data(dat);}}/***************************************************************浮点数显示**********************************************************************************/voidcrt_r(floatx,unsignedcharN){unsignedintdath;unsignedintdatl;unsignedintdat;if(x<0.0){dat=0x2d;write_data(dat);x=fabs(x);}dath=(int)x;crti(dath);{datxe;write_data(dat);for(dli=0;dli<N;dli++){dat*=10;}dath=(int)(x*dat)-dath*dat;for(dli=1;dli<N;dli++){dat/=10;datl=dath/dat;datl+=0x30;write_data(datl);dath%=dat;}crti(dath);}}/***************************************************************延迟函数**********************************************************************************/voidDelay(WORDn){WORDx;while(n--){x=500;while(x--);}}/**********************************************************************************************定义及子程序的声明*********************************************************************************************************//*DS12887口地址*/#define#define#define#define#define#define#define#define#define#defineDS_BSecondXBYTE[0x100A]XBYTE[0x100B]XBYTE[0x100C]XBYTE[0x1009]XBYTE[0x1008]XBYTE[0x1007]XBYTE[0x1006]XBYTE[0x1004]XBYTE[0x1002]XBYTE[0x1000]//寄存器A//寄存器B//寄存器C//年//月//日//星期//时//分//秒/*子程序声明*/voidDS_init();voidcrt_time(BYTEline);voidwrite_time();/***************************************************************DS12887初始化程序****************************************************************************/voidDS_init(){SAxDSBx12;}/***************************************************************显示时间*********************************************************************************/voidcrt_time(BYTEline){iset_display_place(line,0);dli=Month;dhi=dli&0xf0;dhi>>=4;dhi+=0x30;dli&=0x0f;dli+=0x30;write_data(dhi);write_data(dli);dli=0x2d;write_data(dli);iDaydhi=dli&0xf0;dhi>>=4;dhi+=0x30;dli&=0x0f;dli+=0x30;write_data(dhi);write_data(dli);dli=0x20;write_data(dli);write_data(dli);write_data(dli);dli=Hour;dhi=dli&0xf0;dhi>>=4;dhi+=0x30;dli&=0x0f;dli+=0x30;write_data(dhi);write_data(dli);dli=0x3a;write_data(dli);dli=Minute;dhi=dli&0xf0;dhi>>=4;dhi+=0x30;dli&=0x0f;dli+=0x30;write_data(dhi);write_data(dli);dli=0x3a;write_data(dli);dli=Second;dhi=dli&0xf0;dhi>>=4;dhi+=0x30;dli&=0x0f;dli+=0x30;write_data(dhi);write_data(dli);}/********************************************************************DS12887时间设置********************************************************************/voidwrite_time(){DSAxf;DS_B|=0x80;YearsxMonth0x12;Week=0x01;Hourx16;Minutex4;Second=0x00;DS_B&=0x7f;}//寄存器A//年//月//日//星期//时//分//秒//寄存器A/**********************************************************************************************定义及子程序的声明*********************************************************************************************************/sbitDS1820_DQ=P1^7;//单总线引脚chartemperature[2];//存放温度数据floatwen_val;/*子程序声明*/voidDS18B20_Init();bitDS1820_Reset();voidDS1820_WriteData(BYTEwData);BYTEDS1820_ReadData();voidDelayXus(WORDn);voidread_wendu();voidcrt_wendu(BYTEline,column);/***********************************************************DS18B20初始化*函数名称:DS1820_WriteData()*说明:本初始化程序可以不要,因为18B20在出厂时就被配置为12位精度了**********************************************************/voidDS18B20_Init(){DS1820_Reset();WriteDataxCCROMDS1820_WriteData(0x4E);//写暂存器DS1820_WriteData(0x20);//往暂存器的第三字节中写上限值DS1820_WriteData(0x00);//往暂存器的第四字节中写下限值DS1820_WriteData(0x7F);//将配置寄存器配置为12位精度DS1820_Reset();}/***********************************************************DS1820复位及存在检测(通过存在脉冲可以判断DS1820是否损坏)*函数名称:DS1820_Reset()*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在**********************************************************/bitDS1820_Reset(){DS1820_DQ=0;//拉低总线DelayXus(480);//延时480微秒,产生复位脉冲DS1820_DQ=1;//释放总线DelayXus80微秒对总线采样flag=DS1820_DQ;//对数据脚采样DelayXus(400);//延时400微秒等待总线恢复returnflag//根据flag的值可知DS1820是否存在或损坏,可加声音告警提示DS1820故障}/***********************************************************函数名称:DS1820_WriteData()**********************************************************/voidDS1820_WriteData(BYTEwData){for(i=8;i>0;i--){DS1820_DQ=0;//拉低总线,产生写信号DSDQ=wData&0x01;//发送1位DS1820_DQ=1;//释放总线,等待总线恢复wData>>=1;//准备下一位数据的传送}}/***********************************************************函数名称:DS1820_ReadData()**********************************************************/BYTEDS1820_ReadData(){for(i=8;i>0;i--){TmepData>>=1;DS1820_DQ=0;//拉低总线,产生读信号DS1820_DQ=1;//释放总线,准备读数据yXusif(DS1820_DQ==1){TmepData|=0x80;}DS1820_DQ=1;//拉高总线,准备下一位数据的读取.}return(TmepData);//返回读到的数据}/*******************************************************************************************************************/voidDelayXus(WORDn){while(--n);}/**********************************************************读取温度程序**********************************************************/voidread_wendu(){DS1820_Reset();//复位iteDataxccROMDS1820_WriteData(0x44);//温度转换命令DS1820_Reset();//复位iteDataxccROMDS1820_WriteData(0xbe);//读DS1820温度暂存器命令for(i=0;i<2;i++){temperature[i]=DS1820_ReadData();//采集温度}DS1820_Reset();//复位,结束读数据}/**********************************************************显示温度程序**********************************************************/voidcrt_wendu(BYTEline,column){eadwenduah=temperature[1]<<4;ah&=0xf0;al=temperature[0]>>4;al&=0x0f;ah=ah|al;al=temperature[0]&0x0f;if((ah&0x80)!=0){ifal=0){ah=~ah;ah=ah+1;}{ah=~ah;al=~al;al=al+1;al&=0x0f;}wen_val=ah*(-1.0)+al*(-0.0625);}{wen_val=ah*1.0+al*0.0625;}set_display_place(line,column);crt_r(wen_val,1);write_data(0x20);}/**********************************************************************************************定义及子程序的声明*********************************************************************************************************/ykflagkknumBYTExdatay_k_dm[6];BYTExdatayk_val_l[50];BYTExdatayk_val_h[50];BYTEcodetable[]={0x45,0x46,0x47,0x44,0x40,0x43,0x07,0x15,0x09,0x16,0x19,0x0d,0x0c,0x18,0x5e,0x08,0x1c,0x5a,0x42,0x52,0x4a};/*子程序声明*/voidtimer_int0_init();voidykmscan(BYTEbh);voidykm_WriteData(BYTEdat);/***********************************************************定时器和外部中断初始化*函数名称:timer_int0_init()**********************************************************/voidtimer_int0_init(){TMOD=0x11;TH0=0xdc;TL0=0x00;TR0=1;TR1=0;ykflag=0;}/***********************************************************遥控器键值扫描*函数名称:ykmscan()**********************************************************/voidykmscan(BYTEbh){for(i=0;i<21;i++){if(bh==table[i]){yknum=i+1;break;}}}/***********************************************************遥控码显示*函数名称:ykm_WriteData()**********************************************************/voidykm_WriteData(BYTEdat){a=dat/16;if(a>=10)a+=7;bdat;if(b>=10)b+=7;write_data(a+0x30);write_data(b+0x30);write_data(0x48);}/***********************************************//*****************外部中断0***************//***********************************************/voidint_int0(void)interrupt0//using2{TR1=0;if(ykflag==0){ykflag=1;y_k=0;TMOD=0x10;}{yk_val_l[y_k]=TL1;yk_val_h[y_k]=TH1;}y_k++;TL1=0;TH1=0;TR1=1;}/************************************************/*****************定时器1****************//***********************************************/voidT1_int(void)interrupt3//using1{BYTEblbhcl,ch;ykflag=0;TR1=0;if(y_k==36){bh=yk_val_h[1];ifbh=48){write_cmd(0x06);set_display_place(2,0);for(cl=0;cl<5;cl++){for(ch=0;ch<8;ch++){if(yk_val_h[bl]>6){bhx80;}}y_k_dm[cl]=~bh;}write_cmd(0x06);set_display_place(2,0);for(bl=0;bl<12;bl++)write_data(0x20);set_display_place(2,0);bh=y_k_dm[3];ykm_WriteData(bh);write_data(0x20);ykmscan(bh);write_data(0x30+yknum/10);write_data(0x30+yknum%10);ledf=yknum*8;}}}/**********************************************************************************************定义及子程序的声明************************************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论