基于51单片机的红外发射接收温度传感装置.docx
- 文档编号:8945735
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:29
- 大小:34.82KB
基于51单片机的红外发射接收温度传感装置.docx
《基于51单片机的红外发射接收温度传感装置.docx》由会员分享,可在线阅读,更多相关《基于51单片机的红外发射接收温度传感装置.docx(29页珍藏版)》请在冰点文库上搜索。
基于51单片机的红外发射接收温度传感装置
2015年高校联盟电子制作大赛题目
(数字类)
技术报告
队长:
黄文杰
学号:
2014212652
学院:
自动化学院
队员:
李嘉伟
学号:
2014212650
学院:
自动化学院
唐泓
学号:
2014212640
学院:
自动化学院
题目名称:
简易红外光数字通信装置
1、设计题目:
单片机应用系统设计
基于单片机的——简易红外光数字通信装置
2、总体要求:
本次大赛设计内容从主办方所给的题目出发,参赛者应了解单片机实际的应用系统,并自学红外信号编码,弄清结构和功能,结合单片机课程知识及其他相关课程知识,充分发挥自己的想象力和创造力,实现主办方题目要求并适当发挥,团队合作完成本次比赛。
3、具体要求:
1)确定应用系统功能参数
2)设计合理的电路原理图
3)Proteus仿真原理图
4)制作电路板并检测
5)设计程序
6)电路板调试运行
7)技术报告
单片机技术报告
一、项目简介
单片机被广泛应用于仪器仪表、工业自动控制、家用电器、医用设备、办公自动化设备、安全监控等领域,涵盖了人类生活的方方面面。
二、系统功能描述
这是一款基于STC89C52RC单片机的简易红外光数字通信装置。
它可以分为六个部分:
(1)红外功能,可以红外传送数据
(2)音阶功能,在发射板上按动七个音阶,在接收板上可以响出duoraimifasuonaixi七个音阶
(3)温度检测,在发射板上可以检测温度,在接收板上可以显示温度,每隔0.5秒更新一次温度。
三、设计思路
红外模块设计思路:
1:
对输入的数据进行编码。
2:
对编码进行脉冲调制。
3:
信号放大后,通过发射管发送38khz信号。
4:
接收信号,进行解码。
5:
让51对信号进行处理(显示,统计,分析)。
音阶模块设计思路:
1:
计算音阶响应相应延时
2:
建立延时数组,按键控制取数组里的值。
3:
用延时控制发出不同声音
温度模块设计:
1:
温度测出数据,读取温度感应数据,计算成十进制数。
2:
在数码管上显示十进制数
3:
延时控制发射更新温度数据
四、程序部分
1.红外部分,红外部分分为,发射和接收部分,发射部分,通过定时器0产生38k载波,通过定时器1发送信号。
接收部分,通过外部中断(下降沿触发)接收信号,通过定时器计算两个下降沿之间的时间来确定收到的是0还是1。
2.音阶部分:
按键1~7,每次按键按下,发送控制数据,控制接收蜂鸣器根据不同频率发出不同声音。
3.温度部分:
发射端温度传感器,测出温度,通过计算得到温度具体数值,发送数据,接收端,根据接收的数据,显示在数码管上。
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharm,inform;
uinttemp;//variableoftemperature//signoftheresultpositiveornegative
sbitDS=P0^3;
sbitIR_OUT=P1^1;
sbitkey1=P2^4;
sbitkey2=P2^5;
sbitkey3=P2^6;
sbitkey4=P2^7;
sbitkey5=P2^0;
sbitkey6=P2^1;
sbitkey7=P2^2;
sbitkey8=P2^3;
/*--------三个延迟函数的定义-------*/
voiddelay_ms(uintms)
{
uinti,j;
for(i=0;i<120;i++)
{
for(j=0;j } } voiddelay(uintcount)//delay { uinti; while(count) { i=200; while(i>0) i--; count--; } } /*——————————温度传感器函数定义——————————————————*/ voiddsreset(void)//sendresetandinitializationcommand { uinti; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } //------------------------------------------------------------ bittmpreadbit(void)//readabit { uinti; bitdat; DS=0;i++;//i++fordelay DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return(dat); } //--------------------------------------------------------------------- uchartmpread(void)//readabytedate { uchari,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); } //--------------------------------------------------------------------------- voidtmpwritebyte(uchardat)//writeabytetods18b20 { uinti; ucharj; bittestb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb)//write1 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0;//write0 i=8;while(i>0)i--; DS=1; i++;i++; } } } voidtmpchange(void)//DS18B20beginchange { dsreset(); delay (1); tmpwritebyte(0xcc);//addressalldriversonbus tmpwritebyte(0x44);//initiatesasingletemperatureconversion } uinttmp()//getthetemperature { floattt; uchara,b; dsreset(); delay (1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp<<=8;//twobytecomposeaintvariable temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; returntemp; } voidreadrom()//readtheserial { ucharsn1,sn2; dsreset(); delay (1); tmpwritebyte(0x33); sn1=tmpread(); sn2=tmpread(); } /*--------温度传感器函数定义-----------*/ //T113us产生一次中断用于产生38K载波 //T0方式116位用于定时 voidInit_Timer() { TMOD=0x21;//T0mode1T1mode2 TH1=256-13;//定时产生13us //特殊 TL1=TH1; ET1=1; EA=1; } //发送引导码发送方: 9ms高电平4.5ms低电平 voidSend_Start_Bit()//TR1的值=发送的电平 { //9ms1 TH0=(65536-9000)/256; TL0=(65536-9000)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; //4.5ms0 TH0=(65536-4500)/256; TL0=(65536-4500)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; } //发送0 voidSend_Bit_0() { //0.565ms1 TH0=(65536-565)/256; TL0=(65536-565)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; //0.565ms0 TH0=(65536-565)/256; TL0=(65536-565)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; } //发送1 voidSend_Bit_1() { //0.565ms1 TH0=(65536-565)/256; TL0=(65536-565)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; //1.685ms0 TH0=(65536-1685)/256; TL0=(65536-1685)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; } voidSend_over()//发送一个结束码,因为最后一个位只有遇到下降沿才能读取(发射端的上升沿) { //0.500ms1//小于0.5ms接收端很难识别到 TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; //0.500ms0 TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=1; } voidkeyscan() { if(key1==0) { delay_ms(5); if(key1==0) { m=1; while(! key1); } } if(key2==0) { delay_ms(5); if(key2==0) { m=2; while(! key2); } } if(key3==0) { delay_ms(5); if(key3==0) { m=3; while(! key3); } } if(key4==0) { delay_ms(5); if(key4==0) { m=4; while(! key4); } } if(key5==0) { delay_ms(5); if(key5==0) { m=5; while(! key1); } } if(key6==0) { delay_ms(5); if(key6==0) { m=6; while(! key6); } } if(key7==0) { delay_ms(5); if(key7==0) { m=7; while(! key7); } } if(key8==0) { delay_ms(5); if(key8==0) { m=8; while(! key8); } } switch(m) { case1: inform=0x7e;break; case2: inform=0x18;break; case3: inform=0x3c;break; case4: inform=0x42;break; case5: inform=0xe7;break; case6: inform=0x5a;break; case7: inform=0x99;break; case8: inform=0x24;break; default: break; } } voidSend_Char(ucharinform,ucharflag)//发送一字节8位 { uchari,j1,j2,j3,j4; j1=flag; j2=0x41; j3=inform; j4=0x20; Send_Start_Bit(); for(i=0;i<8;i++) { if(j1&0x01) Send_Bit_1(); else Send_Bit_0(); j1=j1>>1; //先发射低位 } for(i=0;i<8;i++) { if(j2&0x80) Send_Bit_0(); else Send_Bit_1(); j2=j2<<1; //先发射低位 } for(i=0;i<8;i++) { if(j3&0x01) Send_Bit_1(); else Send_Bit_0(); j3=j3>>1; //先发射低位 } for(i=0;i<8;i++) { if(j4&0x80) Send_Bit_0(); else Send_Bit_1(); j4=j4<<1; //先发射低位 } Send_over(); //结束符 } voidT1_ISR()interrupt3 { IR_OUT=~IR_OUT; } voiddelay_send() { uchari,j; for(i=120;i>1;i--) for(j=500;j>1;j--) { keyscan(); if(m) Send_Char(inform,0); m=0; } } voidmain() { Init_Timer(); while (1) { m=0; IR_OUT=0; tmpchange(); if(tmp()>250) { inform=0x7e; Send_Char(inform,0); } delay_send(); Send_Char(tmp(),0xff); } } #include #defineucharunsignedchar #defineuintunsignedint sbitIR=P3^2;//红外接口标志 sbitBeep=P2^0; sbitA1=P2^1; sbitA2=P2^2; sbitA3=P2^3; /*------------------------------------------------ 全局变量声明 ------------------------------------------------*/ ucharirtime;//红外用全局变量 bitirpro_ok,irok;//是否进行接收和是否接受完毕 ucharIRcord[4]; ucharirdata[33]; ucharTh1,Tl1;//分别给TH0,TH1赋值 ucharkey=0; ucharcodeKeyCode[]={0XFF,0XFF, 0xF8,0x8B,0xF9,0x5B,0xFA,0x14,0xFA,0x66,0xFB,0x03,0xFB,0x8F,0xFC,0x0B, 0xFC,0x43,0xFC,0xAB,0xFD,0x08,0xFD,0x33,0xFD,0x81,0xFD,0xC7,0xFE,0x05, 0xFE,0x21,0xFE,0x55,0xFE,0x84,0xFE,0X99,0XFE,0xC0,0xFE,0xE3,0xFF,0x02, }; ucharcodetable[]={0x5f,0x06,0x9b,0x97,0xc6,0xd5,0xdd,0x07,0xdf,0xd7}; ucharcodetable1[]={0x7f,0x26,0xbb,0xb7,0xe6,0xf5,0xfd,0x27,0xff,0xf7}; /*------------------------------------------------ 函数声明 ------------------------------------------------*/ voidIr_work(void); voidIrcordpro(void); //音阶函数声明 voidPlayKey(void); voidDisPlay(void); voiddelay_ms(ucharms) { uchari,j; for(i=0;i<120;i++) for(j=0;j } /*------------------------------------------------ 定时器0初始化 ------------------------------------------------*/ voidTIM0init(void)//定时器初始化 { TMOD=0x12;//定时器0工作方式2,TH0是重装值,TL0是初值,定时器1工作方式1 TH0=0x00;//重载值 TL0=0x00;//初始化值 ET0=1;//开中断 TR0=1; ET1=1; } /*------------------------------------------------ 外部中断0初始化 ------------------------------------------------*/ voidEX0init(void) { IT0=1;//指定外部中断0下降沿触发,INT0(P3.2) EX0=1;//使能外部中断 EA=1;//开总中断 } /*------------------------------------------------ 定时器0中断处理 ------------------------------------------------*/ voidtim0_isr(void)interrupt1using1 { irtime++;//用于计数2个下降沿之间的时间 } /*------------------------------------------------ 定时器1中断处理 ------------------------------------------------*/ voidtime1()interrupt3 { TH1=Th1; TL1=Tl1; Beep=~Beep; } /*------------------------------------------------ 外部中断0中断处理 ------------------------------------------------*/ voidEX0_ISR(void)interrupt0//外部中断0服务函数 { staticunsignedchari;//接收红外信号处理 staticbitstartflag;//是否开始处理标志位 if(startflag) { if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms i=0; irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; } } /*------------------------------------------------ 键值处理 ------------------------------------------------*/ voidIr_work(void)//红外键值散转程序 { switch(IRcord[2])//判断第三个数码值 { case0x7e: key=1;break;//1显示相应的按键值 case0x18: key=2;break;//2 case0x3c: key=3;break;//3 case0x42: key=4;break;//4 case0xe7: key=5;break;//5 case0x5a: key=6;break;//6 case0x99: key=7;break;//7 case0x24: key=8;break;//8 default: break; } irpro_ok=0;//处理完成标志 } voidledisplay() { ucharbai,shi,ge; bai=IRcord[2]/100; shi=IRcord[2]%100/10; ge=IRcord[2]%10; A1=0; P0=table[bai]; delay_ms(5); P0=0x00; A1=1; A2=0; P0=table1[shi]; delay_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 红外 发射 接收 温度 传感 装置