#include<reg51.h>
#define uchar unsigned char
uchar rec
bit flag=0
void uart() interrupt 4
{
if(RI)
{
RI=0
rec=SBUF
flag=1
}
}
main()
{
TMOD=0x20
TH1=0xfd
TL1=0xfd
SCON=0x50
TR1=1
ES=1
EA=1
while(1)
{
if(flag)
{
case ....
case ....
default:break
}
}
}
retc=0//变量 retc 归零retc=retc<<1// 变量银乎向左移位
if(SDA==1)retc=retc+1// 这句话,其实就是接收一个位,因为上一句向左移位了,所以山樱这句话就要接收下一位了,向锋唯悉左移位,最低位为 0,如果接收管脚为 0,那么就是0,如果为1,那么rec变量应该最低位变为1,程序里 +1,其实就是变最低为 1,以完成数据位的正确接收
给你一个PIC写的接收红外遥控器的程序。//******************************************************
//mcu: PIC16F883
//author:
//data:
//ver: 1.0
//********************************************************
#include <pic.h>
#include <pic16f887.h>
#include "main.h"
// 函数声明部份
void interrupt IRQ_TEST(void)
void fun_intset(void)
void set_port(void)
void fun_timerset(void)
void delay_10us(void)
void delay_130us(void)
void test_remote(void)
// 主函数
void main()
{
set_port()
fun_timerset()
fun_intset()
delay_10ms()
ram_ini()
GIE=1
while(1)
{
asm("clrwd")
test_remote()
}
}
//端口I/O定义子程序
void set_port()
{
ANSEL =0X00//porta io port
ANSELH=0X00 //portb io port
//TRISX BIT=1, PORTX AS INPUT
TRISA = 0x0F//模搭RA0-RA3 INPUT ,RA4-RA5 OUTPUT
TRISB = 0x07//RB0 PASS0, RB1-RB2 INPUT ,RB3-RB6 OUTPUT
TRISC = 0x0F
// TRISC = 0x03//RC0-RC1 INPUT,RC5-RC6 OUTPUT , RC3 RC4 EEPROM SCL SDA
PORTC=0
PORTA=0XFF
// WPUB=0XFF
PORTB=0X07
}
//中断子程序
void interrupt IRQ_TEST(void)
{
if(T0IF) //Timer0中断服务子程序
{
TMR0=0xce
T0IF=0
timer_100us++ //100us
}
if(INTF==1)
{
INTF=0
timer_rec=timer_100us
timer_100us=0
flag_rec_remote=1
}
}
void fun_timerset()
{
//Timer0初始化设置
PSA=0//Timer0 使用预分频器
//Timer0选择分频率为1:2
PS0=0PS1=0PS2=0
//内部时钟定时方式,定时时旦行拿间:200uS,误差:0uS
T0CS=0
// TMR0=0x9b
TMR0=0xce//100us
}
/*
//定时器2初始化设置子程序
void fun_timer2set()
{
//Timer2初始化设置
//timer2使带颤用预分频率1:1
T2CKPS0=0T2CKPS1=0
//timer2使用后分频率1:1
TOUTPS0=0
TOUTPS1=0
TOUTPS2=0
TOUTPS3=0
//定时器2定时时间为:200uS,误差:0uS
TMR2=0x38
TMR2ON=1
}
*/
//中断允许设置子程序
void fun_intset()
{
T0IE=1//Tiemr0中断允许
INTEDG=0//RB0 FALLAGE INTERRUPT
INTE=1
INTF=0
}
void ram_ini(void)
{
}
//------------------------------------------------------------
//*****************************************************************************
void delay_10us(void)
{
NOP
NOP
NOP
NOP
NOP
NOP
}
void delay_130us(void)
{
uchar i
for(i=0i<13i++)
{
NOP
NOP
NOP
}
}
void delay_10ms(void)
{
unsigned int i
for(i=0i<1000i++)
{
NOP
NOP
NOP
NOP
NOP
}
}
void test_remote(void)
{
uchar rec_ok,i
if(flag_rec_remote==1)
{
flag_rec_remote=0
// remote_buf[rec_byte]=timer_rec //test use
// rec_byte++//test use
// return //test use
if(flag_rec_head==0)
{
if(timer_rec>=90&&timer_rec<=140) //135
{
flag_rec_head=1
rec_byte=0
rec_bit=0
rec_buf=0
return
}
}
else
{
if(timer_rec>=8&&timer_rec<=12) //11.2
{
rec_buf=(rec_buf>>1)
rec_buf=rec_buf&0x7f
}
else if(timer_rec>=18&&timer_rec<=22) //22
{
rec_buf=(rec_buf>>1)
rec_buf=rec_buf|0x80
}
else if(timer_rec>=90&&timer_rec<=140)
{
flag_rec_head=1
rec_byte=0
rec_bit=0
rec_buf=0
return
}
else
{
flag_rec_head=0
rec_byte=0
rec_bit=0
rec_buf=0
return
}
}
if(flag_rec_head==1)
{
rec_bit++
if(rec_bit==8)
{
remote_buf[rec_byte]=rec_buf
rec_byte++
rec_bit=0
if(rec_byte==4)
{
NOP
NOP
NOP
NOP
rec_byte=0
rec_bit=0
rec_buf=0
flag_rec_head=0
}
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)