预览加载中,请您耐心等待几秒...
1/3
2/3
3/3

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

'*******************************************************************************'*bascomAVR红外线解码*'*单片机使用ATTINY2313,接收头数据接PD2口,显示使用MC14489驱动5个数码管*'*此程序能解常用电视/影碟机的遥控器码制(采用脉宽调制的那种)*'*原创作者:cxd4327*'*******************************************************************************$regfile="ATtiny2313.DAT"'定义使用ATTINY2313芯片$crystal=8000000'定义使用8M时钟,我用的是内部8MConfigSpi=Soft,Dout=Portb.1,Ss=Portb.0,Clock=Portb.2'定义SPI硬件连接Spiinit'启动SPIDimAAsByte,BAsWord,CAsWord,AaAsByte,BbAsByte'定义各种变量DimDAsByte,A1(3)AsByte,CcAsByte,DdAsByteConfigInt0=Falling'设置INT0为下降沿中断EnableInterrupts'开启总中断EnableInt0'开启INT0中断OnInt0Int_0'定义INT0中断标号A=&H01'MC14489控制字SpioutA,1'向MC14489写入控制字A1(1)=&H80'MC14489开始显示00000A1(2)=&H00'A1(1)~A1(3)位MC14489显示缓冲区A1(3)=&H00'MC14489为半个字节控制一个LED数码管SpioutA1(1),3'向MC14489写入显示数据Do'死循环,等待中断LoopEndInt_0:'INT0中断入口A=0DoWaitus800'延时800微秒IfPortd.2=0Then'判断PD2是否为低电平Else'是低电平就继续循环GotoExit1'不是就跳出中断,退出解码程序EndIfIncrALoopUntilA=10'重复10次,目的是检测在8000微秒内如果出现高电平就退出解码程序BitwaitPind.2,Set'等待高电平避开9毫秒低电平引导脉冲Waitms5'延时5毫秒避开4.5毫秒的结果码A=0DoBitwaitPind.2,Set'等待地址码第一位的高电平信号Waitms1'高电平开始后用1毫秒的时间尺去判断信号此时的高低电平状态B.0=Pind.2'将PD2引脚此时的电平状态0或1存入B的低位中IfB.0=0Then'判断接收到的是0还是1RotateB,Right,1'是0就将B中的数右循环1位ElseWaitms1:RotateB,Right,1'是1就等待1毫秒再将B中的数右循环1位EndIfIncrALoopUntilA=16'循环16次,接收8位地址码及8位地址反码A=0DoBitwaitPind.2,Set'等待数据码第一位的高电平信号Waitms1'高电平开始后用1毫秒的时间尺去判断信号此时的高低电平状态C.0=Pind.2'将PD2引脚此时的电平状态0或1存入C的低位中IfC.0=0Then'判断接收到的是0还是1RotateC,Right,1'是0就将C中的数右循环1位ElseWaitms1:RotateC,Right,1'是1就等待1毫秒再将C中的数右循环1位EndIfIncrALoopUntilA=16'循环16次,接收8位数据码及8位数据反码Aa=High(b):Bb=Low(b):Cc=High(c):Dd=Low(c)'将地址码、数据码的正反码分开,地址码=BB,数据反码=DD,数据码=CCAa=NotAa:Cc=NotCc'将地址反码/数据反码取反IfAa=BbThen'判断地址码是否相同A1(2)=Aa'相同就将地址码送MC14489显示缓冲区ElseGotoExit1'不同就退出解码EndIfIfCc=DdThen'判断数据码是否相同A1(3)=Cc'相同就将数据码送MC14489显示缓冲区ElseGotoExit1'不同就退出解码EndIfSpioutA1(1),3'将接收到的地址/数据送MC14489显示Exit1:'解码退出标号Return'中断退出