unsigned char code
table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};// 显示数值表0-f unsigned char s,g;
unsigned char ircord[4];
unsigned char irtime;//红外用全局变量 bit irok,jiemaok;
sbit ge=P3^3; sbit shi=P3^2; sbit ir=P3^7;
void init(void);
void delayms(unsigned int t); //函数声明 void display(void); void jiema(void); void process(void);
/*------------------------------------------------ 主函数
------------------------------------------------*/ void main (void) {
init();
while (1) //主循环 {
jiema(); if(jiemaok) {
process(); jiemaok=0; }
display(); }
}
void init(void)
{
// P3M0=0X00; // P3M1=0X0c;
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x9C; //重载值 TL0=0x9C; //初始化值 EA = 1;
ET0=1; //开中断 TR0=0; }
void jiema(void) {
unsigned char i,j,value; if(!ir) {
while(!ir); TR0=1;
while(ir); TR0=0; // P1=0;
if(irtime<48&&irtime>=42) {
irok=1; // P1=0; } else {
irok=0; }
irtime=0; if(irok) {
irok=0;
for(i=0;i<4;i++) {
for(j=0;j<8;j++) {
value>>=1;
while(!ir);//等待低电平结束
TR0=1;
while(ir);// 等待高电平的结束 TR0=0;
if(irtime>10) //如果收到的高电平时间大雨1ms 说明收到数据是1
{
value|=0x80; }
irtime=0; }
ircord[i]=value; value=0; }
jiemaok=1; // P1=0; } } }
void process(void) {
s=ircord[2]/16; g=ircord[2]%16; }
void display(void) {
ge=1;
P2=table[s]; delayms(1); ge=0; P2=0x00; shi=1;
P2=table[g]; delayms(1); shi=0;
P2=0x00;
}
void delayms(unsigned int xms) {
unsigned i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--); }
void tim0_isr (void) interrupt 1 using 1 {
irtime++; //用于计数时间
五、参考文献
1、《8051单片机课程设计实训教材》,陈明荧,清华大学出版社 2、《数字电子技术》,阎石,高等教育出版社 3、《模拟电子技术》,童诗白,高等教育出版社
4、《单片机课程设计指导》,谭浩强,清华大学出版社 5、 《MCS-51单片机应用设计》,张毅刚,哈工大出版社