当前位置:文档之家› 单片机_人工智能与控制技术

单片机_人工智能与控制技术

单片机课程设计一、需求分析(1)应用场合: 红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空调机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅安全可靠而且能有效地隔离电气干扰。

(2)设计目的:实现简单的数据传送和接收。

(3)立题意义:体会红外遥控器编程上的一些独特的编法,以及硬件连接和各部件的使用。

在这次课设中制作红外遥控器的目的是为了学习它的基本功能,以及这些功能怎样用AT89C51去编程实现我们需要的功能。

二、硬件设计方案发射部分包括键盘矩阵4×3、AT89C51单片机、LED红外发送器;接收部分包括红外接收器、AT89C51单片机、解码电路、数码管。

硬件所用的器件:序号名称型号数量1 单片机AT89C51 22 按键四脚123 电阻470Ω 54 电阻 4.7KΩ 25 电解电容22uf 26 瓷片电容30pf 47 晶振12MHz 28 红外发射器φ5 19 接收头V34138 110 电源5V 211 七段数码管共阳 112 三极管NPN 113 万用板 2AT89C51芯片的原理:AT89系列单片机是ATMEL公司最早推出,也是功能最简单的一个系列,该系列都是内含Flash程序存储器的MCS-51兼容单片机,AT89C51就是其中一款可在线编程ISP Flash单片机。

AT89C51具有价格便宜、性能优良、可在线编程等特点。

其具体性能参数如下:兼容MCS-51内核单片机;4KB可在线编程Flash 存储器,可有效擦除/读写1000次;工作电压范围4.0~5.5V;完全静态工作:0Hz~33MHz;ROM三级加密模式;128*8bit内置RAM;32位可控I/O引脚;2个16位的时钟源;5个中断源;全双工UART串行接口;低功耗工作模式;看门狗计时器;两个数据指针;快速编程特性。

三、软件设计方案发射流程图:接收流程图:算法分析:这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.6ms、间隔0. 6ms、周期为1.2ms 的组合表示二制的“0”;以脉宽为1.2ms、间隔0.6ms、周期为1.8ms 的组合表示二进制的“1”,其波形如图2 所示。

图2 遥控码的“0”和“1”上述“0”和“1”组成的10 位二进制码经38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。

然后再通过红外发射二极管产生红外线向空间发射,如图3 所示。

图3 遥控信号编码波形图利用定时器产生的遥控编码是连续的10 位二进制码组,其中前2位为引导码,能区别不同的电器设备,防止不同机种遥控码互相干扰。

后8位操作码(数据码)。

四、调试软件调试:使用伟福WAVE.在使用中,我们使用断点调试,用跟踪型单步观察程序,设定观察项,查看程序运行时设定值的变化,并修改程序,并使用伟福试波器来观察波形。

硬件调试:使用万用表检查万用板的焊接线路是否连接无误各个器件是否短接,芯片引脚是否接错或少接,以免烧坏元器件,焊点是否连焊、虚焊或焊点过大,线路连接是否美观五、心得体会(1)我们在最开始的焊板中就遇到了问题,首先没考虑到芯片在万用板上摆放位置,以至于接线无法完成,焊点不够牢固,布线不够美观。

经过反复思考调试达到预期效果。

(2)软件调试上没有注意到细节,逻辑算法不够合理。

经过不断修改和老师的指导调试成功。

(3)通过本次课设使我们充分地了解和使用C51,并且能够合理地安排万用板上布线布局,对软件程序也能够根据要求合理地设计和安排程序逻辑。

将红外遥控器的基本原理及编程,掌握并得到充分的运用。

附录1:发射代码:#include "reg51.h" #include"absacc.h" #include"intrins.h"#define uchar unsigned char#define uint unsigned intsbit A=P2^0;uchar flag=1,k;uchar flag2;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;unsigned char GetKey() //按键扫描子程序{uchar key,temp;P1=0xFF; //扫描第一行P1_0=0; //第一行线送0 temp=P1; //读取P口数据temp&=0xF0; //取高四位if(temp !=0xF0) //判断高四位是否全为1 若果不是进入此函数{temp=P1; //消抖从新检测temp&=0xF0;if(temp !=0xF0){temp=P1;temp&=0xF0;switch(temp) //高四位判断数值并进行码制转换 {case 0xE0: key=0;flag2++;break;case 0xD0: key=1;flag2++;break;case 0xB0: key=2;flag2++;break;}return key;}}P1=0xFF; //扫描第二行 P1_1=0;temp=P1;temp&=0xF0;if(temp !=0xF0){temp=P1;temp&=0xF0;if(temp !=0xF0){temp=P1;temp&=0xF0;switch(temp){case 0xE0: key=3;flag2++;break; case 0xD0: key=4;flag2++;break;case 0xB0: key=5;flag2++;break;}return key;}}P1=0xFF; //扫描第三行 P1_2=0;temp=P1;temp&=0xF0;if(temp !=0xF0){temp=P1;temp&=0xF0;if(temp !=0xF0){temp=P1;temp&=0xF0;switch(temp){case 0xE0: key=6;flag2++;break; case 0xD0: key=7;flag2++;break; case 0xB0: key=8;flag2++;break;}return key;}}P1=0xFF; //扫描第四行 P1_3=0;temp=P1;temp&=0xF0;if(temp !=0xF0){temp=P1;temp&=0xF0;if(temp !=0xF0){temp=P1;temp&=0xF0;switch(temp){case 0xE0: key=9;flag2++;break; case 0xD0: key=10;flag2++;break; case 0xB0: key=11;flag2++;break; }return key;}}return key=15;}void delay(uint k){while(k--){_nop_();} }void timeint(void) interrupt 1 //定时器0中断处理{A=~A;}void fa(uchar h){uchar i=h;uchar s;ET0=1;delay(268);ET0=0;delay(290);for(s=0;s<8;s++){i=i&0x01;if(i==0){_nop_();ET0=1;delay(22);_nop_();ET0=0;delay(49);}if(i==1){_nop_();ET0=1; //定时器0中断允许delay(44);_nop_();ET0=0;//定时器0中断不允许delay(49);}i=h>>1;h=i;ET0=0;}}void main(){TMOD = 0x02; //设定时器0为方式2 TH0 = 0xF3; //定时器赋初值TL0 = 0xF3;TR0=1; //开定时器EA = 1;//允许CPU中断delay(1);while(1){k=getkey(); //接收键值delay(800);if(k==1){ ET0=1;fa(k);k=16;ET0=0;}if(k==2){ ET0=1;fa(k);k=16;ET0=0;}if(k==3){ ET0=1;fa(k);k=16;ET0=0;}if(k==4){ ET0=1;fa(k);k=16;ET0=0;}if(k==5){ ET0=1;fa(k);k=16;ET0=0;}if(k==6){ ET0=1;fa(k);k=16;ET0=0;}if(k==7){ ET0=1;fa(k);k=16;ET0=0;}if(k==8){ ET0=1;fa(k);k=16;ET0=0;}if(k==9){ ET0=1;fa(k);k=16;ET0=0;}if(k==10){ ET0=1;fa(k);k=16;ET0=0;}if(k==11){ ET0=1;fa(k);k=16;ET0=0;}if(k==12){ ET0=1;fa(k);k=16;ET0=0;}}}接收代码://解码程序//晶振12M#include "reg51.h"#include "absacc.h"#include "intrins.h"sbit DQ=P1^7;sbit p=P1^0;#define uint unsigned int#define uchar unsigned charuint conut=0,k=0;uchar jie=0;uchar code duma[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};void yindao(){st:k=0;while(DQ==1);while(DQ==0)k++; //判断引导码 if((k>=900)&&(k<=1300));elsegoto st;}void jiema(){uchar i=0;for(i=0;i<4;i++){k=0;while(DQ==1);while(DQ==0) k++; //判断接收数据1,0if((k>90)&&(k<130))jie=jie>>1+0;elsejie=(jie>>1)+0x80;}jie=jie>>4;_nop_();}void display(uchar k){ uchar i;i=k;P2=duma[i]; //送数码管显示p=1;}void main(){while(1){yindao(); //调引导函数jiema(); //调解码函数display(jie); //传送接收到的段码值}}10 1112 13。

相关主题