光电技术实验三蔡成灼.docx
- 文档编号:16664154
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:21
- 大小:602.53KB
光电技术实验三蔡成灼.docx
《光电技术实验三蔡成灼.docx》由会员分享,可在线阅读,更多相关《光电技术实验三蔡成灼.docx(21页珍藏版)》请在冰点文库上搜索。
光电技术实验三蔡成灼
哈尔滨理工大学
实验报告
课程名称:
光电技术
学院:
自动化学院
专业班级:
电技12-3班
学生姓名:
蔡成灼
学号:
1212020301
指导教师:
王宏民
实验三
课程名称
光电技术
时间
2015.11.19
实验名称
红外NEC码发送与接收实验
地点
B302
姓名
蔡成灼
学号
1212020301
班级
电技12-3
同实验者
学号
班级
一、实验目的
本实验采用以STC实验箱4在完成红外遥控信号的NEC编码接收的基础上,完成红外遥控信息NEC编码的发射。
1、进一步熟悉和掌握STC单片机硬件环境下的红外遥控信息发射与接收;
2、完成采用NEC编码的信息发射程序设计,并通过程序设定来改变用户码的设定;
3、完成程序设计和调试任务。
二、实验内容
1、熟悉KEIL uVison4环境下的软件设计;
2、熟悉STC实验箱,完成系统配置和程序下载运行;
3、学习并熟悉NEC编码
4、设计完成红红外发射程序。
5、完成用户码的修改设置,将用户码修改为2015
6、完成程序验证,给出验证结果。
三、实验步骤指导
1、建立工程,编辑源程序;
2、添加STC15FXXXX.H文件
3、运行、调试程序。
注意各个窗口的观察方法;
4、下载程序到单片机的程序存储器中
5、运行测试:
(1)接收NEC遥控器编码数据
(2)通过实验箱键盘发送数据/接收数据
记录实验过程,并截图
四、实验结果
创建工程并导入源文件编译成功后,将生成的HEX文件导入STC-ISP软件中并通过USB线下载至实验箱。
此次实验需要两台实验箱,故在程序的相应位置修改用户名为自己的用户码,格式为“年级-学号”,此处我的为1217。
修改用户码:
高四位赋值年级,第四位赋值学号
下载成功截图:
下载成功后运行截图:
发送接收A实验者用户码:
(121718)
发送接收B实验者用户码:
(111713)
注意事项:
涉及下载硬件的实验,都必须注意ISP软件上晶振频率和程序中初始化代码里写的一致,否则无法下载。
还有就是软硬件型号的匹配。
本实验的源文件保存格式为C,我在一开始时以asm保存结果无法创建工程。
附录:
实验程序
/*************本程序功能说明**************
红外接收程序。
适用于NEC编码。
应用层查询B_IR_Press标志为,则已接收到一个键码放在IR_code中,处理完键码后,用户程序清除B_IR_Press标志.
数码管左起4位显示用户码,最右边两位显示数据,均为十六进制.
用户可以在宏定义中指定用户码.
用户底层程序按固定的时间间隔(60~125us)调用"IR_RX_NEC()"函数.
按下IO行列键(不支持ADC键盘),显示发送、接收到的键值。
******************************************/
#defineMAIN_Fosc22118400L//定义主时钟
#include"STC15Fxxxx.H"
sbitP_IR_TX=P3^7;//定义红外发送脚
/******************************用户定义宏***********************************/
#defineSysTick14225//次/秒,系统滴答频率,在4000~16000之间
/***********************************************************/
#defineDIS_DOT0x20
#defineDIS_BLACK0x10
#defineDIS_0x11
/******************************自动定义宏***********************************/
#defineTimer0_Reload(65536UL-((MAIN_Fosc+SysTick/2)/SysTick))//Timer0中断频率,在config.h中指定系统滴答频率,例程为14225.
/*****************************************************************************/
/*************本地常量声明**************/
u8codet_display[]={//标准字库
//0123456789ABCDEF
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black-HJKLNoPUtGQrMy
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};//0.1.2.3.4.5.6.7.8.9.-1
u8codeT_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位码
/*************IO口定义**************/
sbitP_HC595_SER=P4^0;//pin14SERdatainput
sbitP_HC595_RCLK=P5^4;//pin12RCLkstore(latch)clock
sbitP_HC595_SRCLK=P4^3;//pin11SRCLKShiftdataclock
/*************本地变量声明**************/
u8LED8[8];//显示缓冲
u8display_index;//显示位索引
bitB_1ms;//1ms标志
u8cnt_1ms;//1ms基本计时
u8IO_KeyState,IO_KeyState1,IO_KeyHoldCnt;//行列键盘变量
u8KeyHoldCnt;//键按下计时
u8KeyCode;//给用户使用的键码,1~16有效
u8cnt_27ms;
u16PCA_Timer0;
/*************红外发送程序变量声明**************/
u8IR_TxIndex;//发送步骤索引,用户把数据准备好,用IR_TxIndex=1;来启动,之后程序自动发送完成
u8IR_TxData[5];//发送数据,IR_TxData[0]--用户码低字节,IR_TxData[1]--用户码高字节,
//IR_TxData[2]--用户数据字节,IR_TxData[3]--数据字节反码,IR_TxData[4]留空.
u8IR_Tx_Tick;//(系统使用,用户不可操作)发送时隙,做0.5625ms延时计数
u8IR_TxPulseTime;//(系统使用,用户不可操作)发送38KHZ时间
u8IR_TxSpaceTime;//(系统使用,用户不可操作)发送空格时间
u8IR_TxTmp;//(系统使用,用户不可操作)发送缓冲
u8IR_TxBitCnt;//(系统使用,用户不可操作)发送bit计数
u8IR_TxFrameTime;//(系统使用,用户不可操作)帧时间,108ms
bitB_StopCR;//(系统使用,用户不可操作)停止PCA
bitB_Space;//发送空闲(延时)标志
u16tx_cnt;//发送或空闲的脉冲计数(等于38KHZ的脉冲数,对应时间),红外频率为38KHZ,周期26.3us
/*************红外接收程序变量声明**************/
sbitP_IR_RX=P3^6;//定义红外接收输入IO口
u8IR_SampleCnt;//采样计数
u8IR_BitCnt;//编码位数
u8IR_UserH;//用户码(地址)高字节
u8IR_UserL;//用户码(地址)低字节
u8IR_data;//数据原码
u8IR_DataShit;//数据移位
bitP_IR_RX_temp;//Lastsample
bitB_IR_Sync;//已收到同步标志
bitB_IR_Press;//安键动作发生
u8IR_code;//红外键码
u16UserCode;//用户码
/*********************************/
/*************本地函数声明**************/
voidIO_KeyScan(void);
voidPCA_config(void);
/**********************主函数************************/
voidmain(void)
{
u8i;
P0M1=0;P0M0=0;//设置为准双向口
P1M1=0;P1M0=0;//设置为准双向口
P2M1=0;P2M0=0;//设置为准双向口
P3M1=0;P3M0=0;//设置为准双向口
P4M1=0;P4M0=0;//设置为准双向口
P5M1=0;P5M0=0;//设置为准双向口
P6M1=0;P6M0=0;//设置为准双向口
P7M1=0;P7M0=0;//设置为准双向口
display_index=0;
AUXR=0x80;//Timer0setas1T,16bitstimerauto-reload,
TH0=(u8)(Timer0_Reload/256);
TL0=(u8)(Timer0_Reload%256);
ET0=1;//Timer0interruptenable
TR0=1;//Tiner0run
EA=1;//打开总中断
B_StopCR=0;
PCA_config();
for(i=0;i<8;i++)LED8[i]=DIS_;//上电显示-
LED8[4]=DIS_BLACK;
LED8[5]=DIS_BLACK;
while
(1)
{
if(B_1ms)//1ms到
{
B_1ms=0;
if(++cnt_27ms>=27)
{
cnt_27ms=0;
IO_KeyScan();
if(KeyCode>0)//检测到收到红外键码
{
IR_TxData[0]=0x00;//IR_TxData[0]--用户码低字节
IR_TxData[1]=0x00;//IR_TxData[1]--用户码高字节
IR_TxData[2]=KeyCode;//IR_TxData[2]--用户数据字节
IR_TxData[3]=~KeyCode;//IR_TxData[3]--数据字节反码
IR_TxIndex=1;//启动,之后程序自动发送完成
KeyCode=0;
}
}
if(B_IR_Press)//检测到收到红外键码
{
B_IR_Press=0;
LED8[0]=(u8)((UserCode>>12)&0x0f);//用户码高字节的高半字节
LED8[1]=(u8)((UserCode>>8)&0x0f);//用户码高字节的低半字节
LED8[2]=(u8)((UserCode>>4)&0x0f);//用户码低字节的高半字节
LED8[3]=(u8)(UserCode&0x0f);//用户码低字节的低半字节
LED8[6]=IR_code>>4;
LED8[7]=IR_code&0x0f;
}
}
}
}
/**********************************************/
/*****************************************************
行列键扫描程序
使用XY查找4x4键的方法,只能单键,速度快
YP04P05P06P07
||||
X||||
P00----K00----K01----K02----K03----
||||
P01----K04----K05----K06----K07----
||||
P02----K08----K09----K10----K11----
||||
P03----K12----K13----K14----K15----
||||
******************************************************/
u8codeT_KeyTable[16]={0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
voidIO_KeyDelay(void)
{
u8i;
i=60;
while(--i);
}
voidIO_KeyScan(void)//50mscall
{
u8j;
j=IO_KeyState1;//保存上一次状态
P0=0xf0;//X低,读Y
IO_KeyDelay();
IO_KeyState1=P0&0xf0;
P0=0x0f;//Y低,读X
IO_KeyDelay();
IO_KeyState1|=(P0&0x0f);
IO_KeyState1^=0xff;//取反
if(j==IO_KeyState1)//连续两次读相等
{
j=IO_KeyState;
IO_KeyState=IO_KeyState1;
if(IO_KeyState!
=0)//有键按下
{
F0=0;
if(j==0)F0=1;//第一次按下
elseif(j==IO_KeyState)
{
if(++IO_KeyHoldCnt>=37)//1秒后重键
{
IO_KeyHoldCnt=33;//108msrepeat
F0=1;
}
}
if(F0)
{
j=T_KeyTable[IO_KeyState>>4];
if((j!
=0)&&(T_KeyTable[IO_KeyState&0x0f]!
=0))
KeyCode=(j-1)*4+T_KeyTable[IO_KeyState&0x0f]+16;//计算键码,17~32
}
}
elseIO_KeyHoldCnt=0;
}
P0=0xff;
}
/****************向HC595发送一个字节函数******************/
voidSend_595(u8dat)
{
u8i;
for(i=0;i<8;i++)
{
dat<<=1;
P_HC595_SER=CY;
P_HC595_SRCLK=1;
P_HC595_SRCLK=0;
}
}
/**********************显示扫描函数************************/
voidDisplayScan(void)
{
Send_595(~T_COM[display_index]);//输出位码
Send_595(t_display[LED8[display_index]]);//输出段码
P_HC595_RCLK=1;
P_HC595_RCLK=0;//锁存输出数据
if(++display_index>=8)display_index=0;//8位结束回0
}
/********************红外采样时间宏定义,用户不要随意修改*******************/
#defineIR_SAMPLE_TIME(1000000UL/SysTick)//查询时间间隔,us,红外接收要求在60us~250us之间
#if((IR_SAMPLE_TIME<=250)&&(IR_SAMPLE_TIME>=60))
#defineD_IR_sampleIR_SAMPLE_TIME//定义采样时间,在60us~250us之间
#endif
#defineD_IR_SYNC_MAX(15000/D_IR_sample)//SYNCmaxtime
#defineD_IR_SYNC_MIN(9700/D_IR_sample)//SYNCmintime
#defineD_IR_SYNC_DIVIDE(12375/D_IR_sample)//decidedata0or1
#defineD_IR_DATA_MAX(3000/D_IR_sample)//datamaxtime
#defineD_IR_DATA_MIN(600/D_IR_sample)//datamintime
#defineD_IR_DATA_DIVIDE(1687/D_IR_sample)//decidedata0or1
#defineD_IR_BIT_NUMBER32//bitnumber
//*******************************************************************************************
//****************************IRRECEIVEMODULE********************************************
voidIR_RX_NEC(void)
{
u8SampleTime;
IR_SampleCnt++;//Sample+1
F0=P_IR_RX_temp;//SaveLastsamplestatus
P_IR_RX_temp=P_IR_RX;//Readcurrentstatus
if(F0&&!
P_IR_RX_temp)//Pre-sampleishigh,andcurrentsampleislow,soisfalledge
{
SampleTime=IR_SampleCnt;//getthesampletime
IR_SampleCnt=0;//Clearthesamplecounter
if(SampleTime>D_IR_SYNC_MAX)B_IR_Sync=0;//largetheMaximSYNCtime,thenerror
elseif(SampleTime>=D_IR_SYNC_MIN)//SYNC
{
if(SampleTime>=D_IR_SYNC_DIVIDE)
{
B_IR_Sync=1;//hasreceivedSYNC
IR_BitCnt=D_IR_BIT_NUMBER;//Loadbitnumber
}
}
elseif(B_IR_Sync)//hasreceivedSYNC
{
if(SampleTime>D_IR_DATA_MAX)B_IR_Sync=0;//datasamlpetimetoolarge
else
{
IR_DataShit>>=1;//datashiftright1bit
if(SampleTime>=D_IR_DATA_DIVIDE)IR_DataShit|=0x80;//devidedata0or1
if(--IR_BitCnt==0)//bitnumberisover?
{
B_IR_Sync=0;//ClearSYNC
if(~IR_DataShit==IR_data)//判断数据正反码
{
UserCode=((u16)IR_UserH<<8)+IR_UserL;
IR_code=IR_data;
B_IR_Press=1;//数据有效
}
}
elseif((IR_BitCnt&7)==0)//onebytereceive
{
IR_UserL=IR_UserH;//SavetheUsercodehighbyte
IR_UserH=IR_data;//SavetheUsercodelowbyte
IR_data=IR_DataShit;//SavetheIRdatabyte
}
}
}
}
}
/**********************Timer01ms中断函数************************/
voidtimer0(void)interruptTIMER0_VECTOR
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 光电 技术 实验 三蔡成灼
![提示](https://static.bingdoc.com/images/bang_tan.gif)