单片机原理期末大作业.docx
- 文档编号:18333488
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:28
- 大小:124.66KB
单片机原理期末大作业.docx
《单片机原理期末大作业.docx》由会员分享,可在线阅读,更多相关《单片机原理期末大作业.docx(28页珍藏版)》请在冰点文库上搜索。
单片机原理期末大作业
《单片机原理与应用》大作业
题目基于单片机的电视遥控器
院系信息科学与技术学院
专业计算机应用
姓名
班级学号
指导教师
二○一一年十二月
信息科学与技术学院
单片机大作业任务书
作业名称
基于AT89C52单片机的万年历
姓名
院(系)
班级
专业
学号
电话
QQ号
信息学院
计算机应用
20
1、设计任务:
基于单片机的遥控器设计
2、设计要求:
红外遥控是目前使用较多的一种遥控手段。
功能强,成本低的等特点。
系统设计要求利用红外传输控制指令及智能控制系统,借助微处理器强大灵活地控制功能发出脉冲编码,组成一个遥控系统。
本设计的主要技术指标如下:
(1)显示可控制通道
(2)灵敏性可靠,抗干扰性强
(4)遥控范围:
4——6米
红外线的特点不影响周边环境的,不干扰其他电器设备。
由于其无法穿透墙壁,股不同房间的家用电器可使用的遥控器而不会产生相互干扰;多路遥控。
完成时间
2010-2011学年第二学期
摘要
本作业是基于单片机的遥控器设计。
本设计采用的是AT89S51.和AT89C55单片机,接收端的输出端状态大致可分为脉冲,电平,自锁,互锁,数据五种形式。
“脉冲”输出是档案发射端按键时接收端应对应输出端输出一个“有效脉冲”
通过此次作业能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。
总体设计
1.1.1利用红外遥控开关电路
用单片机制作一个红外电器遥控器,可以控制电视机。
当按下遥控按钮时,单片机产生相应的控制脉冲,由红外发光二极管发射出去。
1.1.2红外接收部分结构如下:
当红外接收器接收到控制脉冲后,经单片机处理由显示设备显示出当前调的数字。
第2章系统硬件电路设计
2.1.红外遥控电路设计
由于本设计为一红外遥控装置,根据所选择方案将其分为发射和接收两大模块进行设计。
2.1.1发射电路部分
2.1.1.1器件选择
单片机的选择:
本设计所用的单片机可以用C-31,AT89C-51,羚羊单片机等多种单片机来实现。
但是C-31没有内部存储器,本设计需要编写程序,那么就要用外部扩展,比较麻烦。
本设计所编写的程序比较简单,功能也比较少,如用羚羊单片机过于麻烦,大材小用,本设计所用到的输入输出端口也不是很多,所以我们决定用AT89C-51单片机来完成本设计,既方便也很实用。
下面对AT89C-51做一下简单的介绍:
AT89C-51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C-51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
·与MCS-51兼容
·4K字节可编程闪烁存储器
·全静态工作:
0Hz-24Hz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道低功耗的闲置和掉电模式
·片内振荡器和时钟电路
按键控制选择
由于本设计所控制的电视机,所以用外接扩充键盘较好。
电路设计
本遥控发射器采用码分制遥控方式,码分制红外遥控就是指令信号产生电路以不同的脉冲编码(不同的脉冲数目及组合)代表不同的控制指令。
在确定选择AT89C-51作为本设计发射电路核心芯片和点触式开关作为控制键后,加上一个简单红外发射电路和12M晶体震荡器便可实现红外发射。
下图为本红外遥控设计核心部分之一的发射电路原理图:
其中芯片端口P1.0至P1.7接键盘式开关。
接收电路部分
2.1.2器件选择
单片机的选择
与发射部分一样,本设计所用到的输入输出端口不多,用AT89C-51单片机完全可以完成本设计,其方便实用的性能相对其他同类芯片更适合于本设计。
显示设备选择
在单片机应用系统中,使用的显示器主要有LED(发光二极管),LCD(夜晶显示器)。
LCD显示的字比较丰富,也比较清楚,给人的感觉很好,因为我们设计的是电视机遥控器用LCD更合适。
电路设计
2.1.3显示电路的设计
以51芯片的P1端口直接与数码管相连,但为保证51芯片的正常工作,须在P1端口连电源时加上470Ω的限流电阻。
设计电路图如下:
2.1.4遥控接收器电路原理图
下图为本红外遥控设计的另一核心部分接收电路原理图,其中芯片端口P1.0至P1.7接数码管的a至h这8个引脚。
端口P0.0至P0.5接LCD的电源控制输出。
端口P2.7为可控硅调光灯的调光脉冲输出,端口P3.0为50Hz交流市电相位基准输入,端口P3.2为中断输入口,端口P3.1用于接收红外遥控码输入信号。
2.2.1遥控发射部分:
下图是遥控发射的主程序,首先初始化程序,然后调用键扫描处理子程序.
扫键过程:
首先判断控制键是否按下,若有控制键按下则进行逐行扫描,按照P口值查找键号.最后按照键号转至相应的发射程序如下所示.
NY
红外信号发射过程:
首先装入发射脉冲个数(发射时为3ms脉冲,停发时为1ms脉冲),此时若发射脉冲个数为1则返回主程序,若不为1则发1ms脉冲,然后停发1ms脉冲,这样便结束整个发射过程.
采用红外线遥控方式时,由于受遥控距离,角度等影响,使用效果不是很好,如采用调频或调幅发射接收码,可提高遥控距离,并且没有角度影响。
Y
N
2.2.2遥控接收部分:
遥控接收部分的主程序及初始化及延时过程如下:
首先初始化,然后按照显示亮度数据设定调光脉冲延时值,看P3.0口的脉冲是否为0,若不为0则调入延时程序,此时P2.7口输出调光脉冲然后返回;若为0则直接返回。
N
Y
中断过程:
首先判断低电平脉宽度是否大于2ms,若脉宽不到2ms,则中断返回;若低电平大于2ms,则接收并地低电平脉冲计数,接下来看判断高电平脉宽度冲是否大于3ms,若脉宽不到3ms,则返回上一接收计数过程;若高电平脉宽大于3ms,则按照脉冲个数至对应功能程序.此时中断返回.
N
Y
N
Y
附录代码
红外遥控器代码:
#include
staticbitOP;//红外发射管的亮灭
staticunsignedintcount;//延时计数器
staticunsignedintendcount;//终止延时计数
staticunsignedcharFlag;//红外发送标志
chariraddr1;//十六位地址的第一个字节
chariraddr2;//十六位地址的第二个字节
voidSendIRdata(charp_irdata);
voiddelay();
chargetkey()
{
P1=0xfe;P3_6=P3_7=1;P3_3=1;
if(!
P1_4)return1;//ON
if(!
P1_5)return2;//7
if(!
P1_6)return3;//8
if(!
P1_7)return4;//9
if(!
P3_6)return5;//X
if(!
P3_7)return6;//÷
P1=0xfd;
if(!
P1_4)return11;//+-
if(!
P1_5)return12;//4
if(!
P1_6)return13;//5
if(!
P1_7)return14;//6
if(!
P3_6)return15;//-
if(!
P3_7)return16;//MRC
P1=0xfb;
if(!
P1_4)return21;//%
if(!
P1_5)return22;//1
if(!
P1_6)return23;//2
if(!
P1_7)return24;//3
if(!
P3_6)return25;//+
if(!
P3_7)return26;//M-
P1=0xf7;
if(!
P1_4)return31;//□
if(!
P1_5)return32;//0
if(!
P1_6)return33;//.
if(!
P1_7)return34;//=
if(!
P3_6)return35;//+
if(!
P3_7)return36;//M+
P1=0xfF;P3_3=0;
if(!
P1_4)return41;//
if(!
P1_5)return42;//
if(!
P1_6)return43;//
if(!
P1_7)return44;//
if(!
P3_6)return45;//
if(!
P3_7)return46;//
return0;
}
voidmain(void)
{
charkey;
count=0;
Flag=0;
OP=0;
P3_4=1;
EA=1;//允许CPU中断
TMOD=0x11;//设定时器0和1为16位模式1
ET0=1;//定时器0中断允许
P1=0xff;
TH0=0xFF;
TL0=0xE6;//设定时值0为38K也就是每隔26us中断一次
TR0=1;//开始计数
iraddr1=0xff;
iraddr2=0xff;
do{
key=getkey();
if(key==1)SendIRdata(0x12);//set
if(key==11)SendIRdata(0x0b);//exit
if(key==25||key==35)SendIRdata(0x1a);//+
if(key==15)SendIRdata(0x1e);//-
if(key==6)SendIRdata(0x0e);//↑÷
if(key==16)SendIRdata(0x1d);//↓MRC
if(key==26)SendIRdata(0x1f);//←M-
if(key==36)SendIRdata(0x1b);//→M+
if(key==32)SendIRdata(0x00);//0
if(key==22)SendIRdata(0x01);//1
if(key==23)SendIRdata(0x02);//2
if(key==24)SendIRdata(0x03);//3
if(key==12)SendIRdata(0x04);//4
if(key==13)SendIRdata(0x05);//5
if(key==14)SendIRdata(0x06);//6
if(key==2)SendIRdata(0x07);//7
if(key==3)SendIRdata(0x08);//8
if(key==4)SendIRdata(0x09);//9
if(key==21)SendIRdata(0x2A);//%
if(key==5)SendIRdata(0x2B);//X
if(key==33)SendIRdata(0x2C);//.
if(key==34)SendIRdata(0x2D);//=
if(key==31)SendIRdata(0x2E);//□
if(key==41)SendIRdata(0x2F);//
if(key==42)SendIRdata(0x30);//
if(key==43)SendIRdata(0x31);//
if(key==44)SendIRdata(0x32);//
if(key==45)SendIRdata(0x33);//
if(key==46)SendIRdata(0x34);//
}while
(1);
}
//定时器0中断处理
voidtimeint(void)interrupt1
{
TH0=0xFF;
TL0=0xE6;//设定时值为38K也就是每隔26us中断一次
count++;
}
voidSendIRdata(charp_irdata)
{
inti;
charirdata=p_irdata;
//发送9ms的起始码
endcount=223;
Flag=1;
count=0;
P3_4=0;
do{}while(count //发送4.5ms的结果码 endcount=117; Flag=0; count=0; P3_4=1; do{}while(count //发送十六位地址的前八位 irdata=iraddr1; for(i=0;i<8;i++) { //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平) endcount=10; Flag=1; count=0; P3_4=0; do{}while(count //停止发送红外信号(即编码中的高电平) if(irdata-(irdata/2)*2)//判断二进制数个位为1还是0 { endcount=15;//1为宽的高电平 } else { endcount=41;//0为窄的高电平 } Flag=0; count=0; P3_4=1; do{}while(count irdata=irdata>>1; } //发送十六位地址的后八位 irdata=iraddr2; for(i=0;i<8;i++) { endcount=10; Flag=1; count=0; P3_4=0; do{}while(count if(irdata-(irdata/2)*2) { endcount=15; } else { endcount=41; } Flag=0; count=0; P3_4=1; do{}while(count irdata=irdata>>1; } //发送八位数据 irdata=~p_irdata; for(i=0;i<8;i++) { endcount=10; Flag=1; count=0; P3_4=0; do{}while(count if(irdata-(irdata/2)*2) { endcount=15; } else { endcount=41; } Flag=0; count=0; P3_4=1; do{}while(count irdata=irdata>>1; } //发送八位数据的反码 irdata=p_irdata; for(i=0;i<8;i++) { endcount=10; Flag=1; count=0; P3_4=0; do{}while(count if(irdata-(irdata/2)*2) { endcount=15; } else { endcount=41; } Flag=0; count=0; P3_4=1; do{}while(count irdata=irdata>>1; } endcount=10; Flag=1; count=0; P3_4=0; do{}while(count P3_4=1; Flag=0; } voiddelay() { inti,j; for(i=0;i<400;i++) { for(j=0;j<100;j++) { } } } 解码代码: #include"At89x51.h" #include"stdio.h" #include"stdlib.h" #include"string.h" #defineJINGZHEN48 #defineTIME0TH((65536-100*JINGZHEN/12)&0xff00)>>8//time0,100us,红外遥控 #defineTIME0TL((65536-100*JINGZHEN/12)&0xff) #defineTIME1TH((65536-5000*JINGZHEN/12)&0xff00)>>8 #defineTIME1TL((65536-5000*JINGZHEN/12)&0xff) #defineucharunsignedchar #defineuintunsignedint codeucharBitMsk[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; uintIrCount=0,Show=0,Cont=0; ucharIRDATBUF[32],s[20]; ucharIrDat[5]={0,0,0,0,0}; ucharIrStart=0,IrDatCount=0; externvoidinitLCM(void);//LCD初始化子程序 externvoidDisplayListChar(ucharX,ucharY,unsignedchar*DData);//显示指定坐标的一串字符子函数 voidtimer1int(void)interrupt3using3{//定时器1 EA=0; TH1=TIME1TH; TL1=TIME1TL; Cont++; if(Cont>10)Show=1; EA=1; } voidtimer0int(void)interrupt1using1{//定时器0 uchari,a,b,c,d; EA=0; TH0=TIME0TH; TL0=TIME0TL; if(IrCount>500)IrCount=0; if(IrCount>300&&IrStart>0){IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0;} if(IrStart==2) { IrStart=3; for(i=0;i { if(i<32) { a=i/8; b=IRDATBUF[i]; c=IrDat[a]; d=BitMsk[i%8]; if(b>5&&b<14)c|=d; if(b>16&&b<25)c&=~d; IrDat[a]=c; } } if(IrDat[2]! =~IrDat[3]) { IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0; } EA=1; return; } IrCount++; EA=1; } voidint0()interrupt0using0{ EA=0; if(IrStart==0) { IrStart=1;IrCount=0;TH0=TIME0TH;TL0=TIME0TL; IrDatCount=0;EA=1; return; } if(IrStart==1) { if(IrDatCount>0&&IrDatCount<33) IRDATBUF[IrDatCount-1]=IrCount; if(IrDatCount>31) {IrStart=2;TH0=TIME0TH;TL0=TIME0TL;EA=1;return;} if(IrCount>114&&IrCount<133&&IrDatCount==0) {IrDatCount=1;}elseif(IrDatCount>0)IrDatCount++; } IrCount=0;TH0=TIME0TH;TL0=TIME0TL; EA=1; } main() { uchar*a,n; TMOD|=0x011; TH0=TIME0TH; TL0=TIME0TL; ET0=1; TR0=1; ET1=1; TR1=1; IT0=1;//下降沿 EX0=1; initLCM(); EA=1; for(;;) { if(Show==1) { Show=0; Cont=0; DisplayListChar(0,1,"Pleasekeys"); a=""; switch(IrDat[3]) { case0x12: //ON/C a="ON/C"; break; case0x0b: //± a="+/-"; break; case0x1a: //+ a="+"; break; case0x1e: //- a="-"; break; case0x0e: //÷ a="/"; break; case0x1d: //MRC a="MRC"; break; case0x1f: //M- a="M-"; break; case0x1b: //M+ a="M+"; break; case0x00: //0 if(IrDat[2]==0xff)a="0"; break; case0x01: //1 a="1"; break; case0x02: //2 a="2"; break
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 期末 作业