中国矿业大学徐海学院单片机
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计
设计题目:数字钟校时电路
设计专题题目:单片机系统设计
设计主要内容:制作数字钟校时电路
设计要求:
1、基本要求
制作单片机数字钟,利用红外控制,可根据自己的需要任意定时。
先按定时按键把当前时间锁存起来,该时刻即为定时时间,定时到会自动播放音乐。
把当前时间锁存好之后要退出定时。
2、创新部分
插入音乐,定时到了会自动播放。
指导教师签字:
摘要
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用越来越普及了,并且由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,使单片机在电子和一些自动化行业中应用也越来越广泛了,利用单片机实现的电子钟具有编程灵活,并便于功能的扩展,很精确。
数字钟的组成模块主要由一个AT89C51单片机模块、用于显示时间的数码管显示模块等其他组成部分。
红外线遥控是目前使用很广泛的一种通信和遥控技术。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
关键词:单片机、红外控制、KEIL软件、C语言编程
目录
1 绪论 (1)
1.1 系统概述 (1)
1.1.1 设计性质、目的、任务 (1)
1.2 系统设计方案 (1)
1.2.1 系统设计原理框图 (1)
2程序设计 (1)
2.1定时程序设计 (1)
2.2实时时钟实现的基本方法 (2)
2.3实时时钟程序设计步骤 (2)
3红外遥控 (2)
3.1红外接收与发射 (2)
3.2红外解码 (3)
4程序执行方案 (4)
4.1子函数顺序结构方案 (4)
4.2中断加顺序方案 (4)
5设计工作及设计报告评分表 (4)
6系统调试 (5)
6.1 硬件部分 (5)
6.2 软件部分 (5)
7自我总结 (5)
8结论与展望 (5)
8.1结论 (5)
8.2单片机的发展趋势 (5)
8.2.1.采用先进结构以实现高性能 (5)
8.2.2.进一步降低功耗、 (5)
8.2.3.采用Flash Memory (6)
8.2.4.集成更多功能及兼容性 (6)
8.2.5.强抗干扰能力 (6)
8.2.6.朝系列化、全面化方向发展 (6)
9参考文献 (6)
附录一单片机板电路原理图 (8)
附录二单片机数字钟 (9)
附录三程序 (10)
1 绪论
1.1系统概述
1.1.1设计性质、目的、任务
《单片机系统设计》是在学习《模拟电子技术》、《数字电子技术》、《单片机原理及应用》等相关理论课程之后,所设置的重要的综合性实践教学环节,课程的任务是通过选题的设计、安装和调试,巩固已学的理论知识,综合应用所学知识,进行电子系统的设计,从而培养工程实践能力、创新能力,培养严肃认真的工作作风和科学态度。
通过查阅资料、选定方案、设计电路、安装调试、写报告等过程,得到一次科学研究工作的启蒙训练,也为以后利用单片机开发电子产品奠定坚实的基础。
1.2 系统设计方案
1.2.1 系统设计原理框图
2程序设计
2.1定时程序设计
单片机的定时功能也是通过计数器的计数来实现的,此时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲,也就是每经过1个机器周期的时间,计数器加1。
如果MCS-51采用的12MHz晶体,则计数频率为1MHz,即每过1us的时间计数器加1。
这样可以根据计数值计算出定时时间,也可以根据定时时间的要求计算出计数器的初值。
MCS-51单片机的定时器/计数器具有4种工作方式,其控制字均在相应的特殊功能寄存器中,通过对特殊功能寄存器的编程,可以方便的选择定时器/计数器两种工作模式和4种工作方式。
定时器/计数器工作在方式0时,为13位的计数器,由TLX(X=0、1)的低5位和THX的高8位所构成。
TLX低5位溢出则向THX进位,THX计数溢出则置位TCON中的溢出标志位TFX.
当定时器/计数器工作于方式1,为16位的计数器。
本设计师单片机多功能定时器,所以MCS-51内部的定时器/计数器被选定为定时器工作模式,计数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1。
2.2实时时钟实现的基本方法
时钟的最小计时单位是秒,但使用定时器的方式1,最大的定时时间也只能达到131ms。
我们可把定时器的定时时间定为50ms。
这样,计数溢出20次即可得到时钟的最小计时单位:秒。
而计数20次可以用软件实现。
秒计时是采用中断方式进行溢出次数的累积,计满20次,即得到秒计时。
从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。
要求每满1秒,则“秒”单元中的内容加1;“秒”单元满60,则“分”单元中的内容加1;“分”单元满60,则“时”单元中的内容加1;“时”单元满24,则将时、分、秒的内容全部清零。
2.3实时时钟程序设计步骤
(1)选择工作方式,计算初值;
(2)采用中断方式进行溢出次数累计;
(3)从秒——分——时的计时是通过累加和数值比较实现的;
(4)时钟显示缓冲区:时钟时间在方位数码管上进行显示,为此在内部RAM中要设置显示缓冲区,共6个地址单元。
显示缓冲区从左到右依次存放时、分、秒数值;
(5)主程序:主要进行定时器/计数器的初始化编程,然后反复调用显示
子程序的方法等待中断的到来。
(6)中断服务程序:进行计时操作
(7)加1子程序:用于完成对时、分、秒的加操作,中断服务程序在秒、分、时加1时共有三种条调用加1子程序,包括三项内容:合字、加1并进行十进制调整、分字。
3红外遥控
3.1红外接收与发射
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图1a《红外发射原理图》
图1b 《红外接受原理图》
3.2红外解码
红外遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
4程序执行方案
4.1子函数顺序结构方案
将各个模块放入main()函数顺序执行
优点:结构简单,代码量少,层次清晰。
缺点:实时性差,用户体验较差,
4.2中断加顺序方案
关键模块采用中断结构,如显示模块,以保证其实时性,对于实时性要求不高的模块采用循环结构嵌套顺序结构。
优点:实时性好,运行稳定,抗干扰性能好
缺点:结构复杂
5设计工作及设计报告评分表
项目内容测试结果
走时准确性程序走时准确,误差小于1s/分钟正确性秒、分、时进位正确。
优良程度走时完全符合设计要求。
闹铃完成程度能够闹铃,能够设置闹铃时间和整点报时。
正确性能够准时闹铃和整点报时
电路图及设计文件完整性所要求功能完全实现。
规X程度电路符合设计规X,软件符合软件设计要求。
抗干扰设计显示抗干扰显示正常,未发现受按键干扰和其他干扰。
按键抗干扰按键及时、有效、正确响应。
系统抗干扰系统稳定运行4小时未见异常。
6系统调试
系统调试包括硬件调试和软件调试两部分,介绍一下我在这两方面遇到一些问题,以及如何解决的。
6.1 硬件部分
硬件焊接为单片机板,因为是以前焊好的,所以不存在问题。
6.2 软件部分
开始对单片机C语言很陌生,看程序很困难,自己编写不出程序。
通过老师的讲解,和以前学过的C语言的知识,与单片机C语言基本相同,有些区别,把其中的区别搞懂了,能够编写简单的程序了。
通过程序调试各个部分的功能,完成各功能模块,把程序下载到单片机中,最终实现报时的功能。
7自我总结
这次课程设计,我学到了许多,无论是硬件焊接还是软件编程,都有了进一步的提高。
初步掌握了单片机C语言的编程。
对红外控制,单片机显示等有了更深入的了解。
这些离不开老师的指导和同学的互相帮助。
我还有许多不足,这些还远远不够,在今后我还要不断的练习。
8结论与展望
8.1结论
单片机多功能定时系统理论上能很好的达到了学校教学要求,发挥了单片机在智能化方面的应用。
该系统的设计很好的满足当前学校教学的需要,是一个理想的智能化的设计。
它具有一个走时精确的实时钟,可以任意设置时间,可以控制时间表的转换,时钟的显示功能等。
可以通过按键操作和数字显示。
该系统规
模小,但是功能较多,操作简单,造价低,应用非常广泛。
该系统的设计为向家庭数字化方向发展又前进了一步。
同时又扩大了单片机的应用领域。
8.2单片机的发展趋势
自单片机出现至今,单片机技术已走过了几十年的发展路程。
纵观几十年来单片机发展历程可以看出,单片机技术的发展以微处理器(MPU)技术及超大规模集成电路技术的发展为先导,拉动广泛的应用领域,表现出比微处理器更具个性的发展趋势:
8.2.1.采用先进结构以实现高性能
在过去的一段时间内,单片机的指令运行速度一直在10MIPS以下,这对于应用在工业控制领域内的单片机来说是足够了,但当单片机被应用在通讯及DSP 领域作为高速运算、编码或解码时,就会出现因指令运行速度不够而限制单片机应用的情形,因此提高单片机指令运行速度已经成为迫切需要解决的问题。
8.2.2.进一步降低功耗
基于80C51的飞利浦低功率、低系统成本微控制器51LPC系列是业界推动单片机向低功耗方向发展的主导单片机系列之一。
51LPC系列单片机采用以下三种方法降低功耗:(1)使系统进入空闲模式,在空闲模式下,只有外围器件在工作,任意的复位及中断均可结束空闲模式;(2)使系统进入低功耗模式,在低功耗模式下,振荡器停止工作,是功耗降到最小(3)使系统进入低电压EPROM操作;EPROM包含了模拟电路,当Vcc高于4V时,可通过软件使这些模拟电路掉电以降低功耗,在上电情况下可使系统退出该模式。
8.2.3.采用Flash Memory
随着半导体工艺技术的不断进步,MPU的Flash版本逐渐替代了原有的OTP 版本。
Flash MPU具有以下优点:与多次可编程的窗口式EPROM相比,Flash MPU 的成本要低得多;在系统编程能力以及产品生产方面提供了灵活性,因为Flash
MPU可在编程后面再次以新代码重新编程;可减少已编程器件的报废和库存;有助于生产厂商缩短设计周期,使终端用户产品和、更具有竞争力。
8.2.4.集成更多功能及兼容性
目前单片机的另一个发展趋势是在芯片上集成更多的功能。
如模拟功能,包括模拟比较器、A/D和D/A转换器等。
具体表现在:兼容性作为设计的第一考虑;额外的新的特点是透明的;使用同一种编程器;OTP使器件快速提升及标准化成为可能。
8.2.5.强抗干扰能力
不断加强抗干扰能力是单片机进一步发展的必然趋势。
ST Microelectronics 公司推出的ST62系列单片机在这方面是佼佼者,其优良的抗干扰能力使得许多大公司将其应用在系统中的关键部件上。
许多单片机开发商也正朝着这个方向努力。
8.2.6.朝系列化、全面化方向发展
各大单片机开发商在增加产品功能的同时效力于形成产品的系列化=全面化,以满足各种控制领域的要求,这也是单片机发展的趋势之一。
日本TOSHBA 公司开发了从4位到64位的多系列单片机,日立公司也有从4.位到32位的单片机,目前还没有哪个厂家生产的单片机比东芝公司的种类多。
随着单片机性能的不断提高,不断的克服和弥补自身的不足。
在各种控制领域,单片机将拥有更加广阔的使用天地。
在很长的一段时间内,它将一直是工程设计人员的首选控制芯片之一
9参考文献
[1] X专成赵怀勋.单片机测控系统中的监视定时器.武警技术学院.Mar
1997
[2] X景元.基于单片机的多用途定时器的设计与实现.电子工程师2000年第
8期
[3] 李洪涛.一种单片机控制的定时打铃器.电子世界.1990年第2期
[4] 何业军李超.基于单片机控制的高精度定时打铃器的设计.电子技
术.2001年第7期
[5] 关宗安仲丛久.基于单片机实现的多路定时控制器的设计.XX航空工业
学院学报.2004年6月.第21卷第3期
[6] ATMEL.Microcontroller Data book.2002
[7] Mark1.Montrose.PRINTED Circuit Board Design Techniques for EMC
pliance.IEE Press series.2000
[8] X立南.单片微机接口与控制技术.XX:XX大学.1996
[9] X友德.单片微型机原理、应用与实践.XX:复旦大学.1992
[10]李华.MCS-51系列单片机实用接口技术,:航空航天大学出版
社.1993
[11]何希庆,高伟.MCS-51单片机原理、实验、实例[M].XX:XX大学出版
社.1989
[12]X毅刚,彭喜源,潭晓昀.MCS-51单片机应用设计[M].XX:XX工
业大学.1997
[13]胡汉才.单片机原理及接口技术[M],:清华大学.1996
[14]余永权,单片机与家用电器智能化设计[M].:电子工业.1995
[15]房小翠,王金凤.单片微型计算机与机电接口技术[M].国防工业出版
社.2002
[16]皮红梅,李英顺.单片机开发中的定时方法.XX石油化工高等专科学校学
报.2002年12月
[17]Maxim公司.Newreleases Data Book 1996 附录一:
单片机板电路原理图
附录二:
单片机数字钟
//#include <REGX51.H>
#include <intrins.h>
#include "delay.h"
#include "decode.h"
sbit speaker=P2^5;
unsigned int i;
unsigned int k;
unsigned char timer0h,timer0l,time;
//世上只有妈妈好数据表
code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
// 音阶频率表高八位
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,
//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
// 音阶频率表低八位
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6, 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
#define uchar unsigned char
#define uint unsigned int
#define Font_code P0 //字符码写地址
#define reg_code P2 //字位码写地址
unsigned int n;
unsigned char min;
unsigned char hour;
unsigned char second;
unsigned char minx;
unsigned char hourx;
bit flag;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管0-9
unsigned char sDis_Shiwei=0xc0;//定义十位
unsigned char sDis_Gewei=0xc0; //定义个位
unsigned char mDis_Shiwei=0xc0;//定义十位unsigned char mDis_Gewei=0xc0; //定义个位unsigned char hDis_Shiwei=0xc0;//定义十位unsigned char hDis_Gewei=0xc0; //定义个位
code uchar Show_Tab[]={
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E /*F*/
};
code uchar S_Tab[8]={
0xfe,
0xfd,
0xfb,
0xf7,
0xef,
0xdf,
0xbf,
0x7f
};
unsigned char Display_Buffer[8]; //显示缓冲区uchar bit_con; //字位码扫描计数器
extern uchar key_value; //键值
extern bit key_flg; //按钮按下标志
extern bit cycle_flg; //循环标志
void delay(unsigned int t)
{
while(--t);
}
.
void delayx(unsigned char t)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR2=0;
}
void song()
{
RCAP2H=timer0h;
RCAP2L=timer0l;
TR2=1;
delayx(time);
}
void main()
{
delay_nus(1);
delay_nms(1);
reg_code = 0xff; //关闭显示
for(bit_con=0;bit_con<8;bit_con++) Display_Buffer[bit_con] = Show_Tab[0]; bit_con = 0;
Timer0init();//定时器0初始化
EX0init(); //外部中断初始化
while(1)
{
P0=sDis_Shiwei;//显示十位
P2=0xbf;
delay(300);//短暂延时
P0=sDis_Gewei; //显示个位
P2=0x7f;
delay(300);
P0=mDis_Shiwei;//显示十位
P2=0xef;
delay(300);//短暂延时
P0=mDis_Gewei; //显示个位
P2=0xdf;
delay(300);
if(key_value==0x09) //如果读到K1为0
{ key_value=0;
min++;
if(min==60)
min=0;
}
P0=hDis_Shiwei;//显示十位
P2=0xfb;
delay(300);//短暂延时
P0=hDis_Gewei; //显示个位
P2=0xf7;
delay(300);
if(key_value==0x43) //如果读到K1为0 { key_value=0;
hour++;
if(hour==24)
hour=0;
}
if(key_value==0x40) //如果读到K1为0
{ key_value=0;
hour--;
if(hour==0)
hour=23;
}
sDis_Shiwei=~tab[second/10];//十位显示值处理sDis_Gewei=~tab[second%10]; //个位显示处理mDis_Shiwei=~tab[min/10];//十位显示值处理mDis_Gewei=~tab[min%10]; //个位显示处理hDis_Shiwei=~tab[hour/10];//十位显示值处理hDis_Gewei=~tab[hour%10]; //个位显示处理
if(key_value==0x45) //如果读到K1为0
{ key_value=0;
minx=min;
hourx=hour;
flag=0;
}
if(key_value==0x15) //如果读到K1为0
{ key_value=0;
min--;
if(min==0)
min=59;
}
if((min==(minx+1)) && (hour==hourx))
{flag=0;}
if((min==minx) && (hour==hourx) && flag==0)
{
while(1)
{
TR2=1; //启动定时器
ET2=1; //打开定时器2中断
i=0;
while(i<100) //音乐数组长度,唱完从头再来
{
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
RCAP2H=timer0h;
RCAP2L=timer0l;
time=sszymmh[i+2];
i=i+3;
song();
if(key_value==0x47) //如果读到K1为0
{ key_value=0; flag=1;
TR2=0; //启动定时器
ET2=0; //打开定时器2中断
break;
}
}
break;
}
}
}
}
timer1() interrupt 3
{
unsigned char count; TH1=0xd8;//重新赋值TL1=0xf0;
count++;
if (count==100)
{
count=0;
second++;//秒加1
if(second==60)
{
second=0;
min=min+1;
}
if(min==60)
{ min=0;
hour=hour+1;
}
if(hour==24)
{
hour=0;
second=0;
min=0;
}
}
}
void t2int() interrupt 5 {
TR2=0;
TF2=0;
speaker=!speaker;
TR2=1;
}
Decode.c
/******************************************************************/ /* 红外遥控解码*/ /* CPU & XTAL :89c52 12Mhz */ /* 支持的红外编码方案:NEC6121 */ /* 编码格式:引导信号(或连发信号)+地址码+地址码+控制码+控制码反码*/ /******************************************************************/
#include "decode.h"
//#include "display.c"
#include <ABSACC.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************************************************************/ /* 变量保存区*/ /******************************************************************/ static unsigned char Timer0_t; //定时器计数值
static unsigned char Timer0_t_bk;
static bit timeout; //超时标志
static bit Guide; //引导码有效
static bit Continuous; //连发码
static unsigned char IR_time[33]; //保存每两个下降沿之间的时间间隔
/******************************************************************/ /* 结构体区*/ /* 保存一次解码后接受到的四字节数据*/ /******************************************************************/ static struct IR_data //红外接收数据寄存
{
unsigned char addr1; //地址1(客户码1)
unsigned char addr2; //地址2(客户码2)
unsigned char data1; //数据1(数据码)
unsigned char data2; //数据2(数据码反码)
}IR_data;
uchar key_value; //键值
bit key_flg; //按钮按下标志
bit cycle_flg; //循环标志
/******************************************************************/
/* 定时器0初始化*/ /* 定时值:225us */ /* 方式2 自动重载*/ /******************************************************************/ void Timer0init(void)//定时器0初始化
{
//定时值225us
TMOD=0x12;//定时器0工作方式2 自动重载
TH0=TIMER0_COUNT; //重载值
TL0=TIMER0_COUNT; //初始化值
ET0=1; //定时器0中断有效
TR0=1; //定时开始
ET1=1;
TR1=1;
//
// RCAP2H =0xF3; //赋T2的预置值,溢出1次是1/1200秒钟
// RCAP2L =0x98;
// TR2=1; //启动定时器
// ET2=1; //打开定时器2中断
// EA=1;
}
/******************************************************************/ /* 外部中断初始化*/ /* 中断端口:外部中断0 P3.2 */ /* 触发方式:下降沿*/ /******************************************************************/ void EX0init(void)
{
EA = 1; //总中断开
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //外部中断有效
}
/******************************************************************/ /* Timer0中断子程序*/ /******************************************************************/ void Timer0(void) interrupt 1 using 1
{
Timer0_t++;
if(Timer0_t>Timeout_t)
timeout=1; //超时标志
}
/******************************************************************/
/* 外部中断0函数*/ /* 下降沿触发*/ /******************************************************************/ void ex0_isr (void) interrupt 0 using 0
{
static unsigned char m=0;
Timer0_t_bk=Timer0_t; //备份时间计数值,即前一个下降沿到本下降沿的时间间隔Timer0_t=0x00; //清空时间计数值
if(timeout) //如果超时
{
TL0=TIMER0_COUNT; //初始化定时器0
Timer0_t=0x00; //清空时间计数值
timeout=0; //清除超时标志
Guide=0; //清除引导标志
Continuous=0; //清除连发标志
m=0; //复位数据位
}
else
{
if(Guide|Continuous) //如果引导码有效
{
IR_time[m++]=Timer0_t_bk; //保存时间间隔
if(m==32) //接收够32数据后
{
m=0;
Guide=0; //清除引导标志
Decode(); //解码
};
};
if(Timer0_t_bk>Guide_timer) //如果时间间隔>引导码时长
{
Guide=1; //使能引导标志
m=0;
};
if(Timer0_t_bk>Continuous_timer) //如果时间间隔>引导码时长
{
Continuous=1; //使能引导标志
EX0=0;
/**此处加入连发操作代码**/
//display_Continuous();
EX0=1;
m=0;
};
};//end of 超时
}
/******************************************************************/
/* 解码子程序*/
/******************************************************************/
void Decode(void)
{
unsigned char m,n,s=0x00;
static unsigned char *p; //指向结构体IR_data.XX的指针
EX0 = 0; //外部中断无效
p=&IR_data.addr1;
for(n=0;n<4;n++)
{
for(m=8;m>0;m--)
{
if((IR_time[s]>IR_L_timer_min)&(IR_time[s]<IR_L_timer_max))//数据“0”0.56ms低电平+0.56ms高电平
{
*p>>=1;
*p&=0x7f;
}
else if((IR_time[s]>IR_H_timer_min)&(IR_time[s]<IR_H_timer_max)) //数据“1”0.56ms低电平+1.69ms高电平
{
*p>>=1;
*p|=0x80;
};
s++;
};
p++;
};
if(IR_data.data2==~IR_data.data1) //数据2=数据1反码解码正确{
if((IR_data.addr1==IR_addr1)&(IR_data.addr2==IR_addr2))
{
_nop_();
//show_L = ~show_tab[IR_data.data1 & 0x0f];
//show_H = show_tab[(IR_data.data1 & 0xf0)>>4];
key_flg = 1;
key_value = IR_data.data1;
}
_nop_();
}
else
{
/**非本机遥控器或数据错误**/
//display_error();
};
EX0 = 1; //重新开放外部中断
}
Delay.c
.
/* 延时函数*/
#include <intrins.h>
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
void delay_1us(void);
void delay_1ms(void) ;
void delay_1us(void) //1us延时函数{
_nop_ ();
}
void delay_nus(unsigned int n) //N us延时函数{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数{
unsigned int i;
for (i=0;i<250;i++);
}
void delay_nms(unsigned int n) //N ms延时函数{
unsigned int i=0;
for (i=0;i<n;i++)
{
delay_1ms();
};
}。