📄 pt2262.txt
字号:
#include <reg51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P0^7;
sbit Plus_out = P2^0 ; //脉冲输出
unsigned int Per = 36 ,s_xian=4319;
bit dd=1,b_anjian=1,b_stop=0 , b_jia=0 , b_jian=0 , b_fas=0 ,b_a=0 ,b_b=0 ,b_c=0 ,b_d=0;
unsigned char decode[12]={1,2,2,2,0,2,2,2,1,1,1,1};
unsigned char init_timer[5][2]={{211,40},{250,96},{251,200},{254,152},{254,184}} ;//存放各种定时器初值
unsigned char rx_decode[24]={0} ,aaa=0,bbb=1;
void delayms(unsigned char ms); // 1ms延时程序
void INT_0( void ) ; // 外部中断0服务程序
//unsigned int measure ( void ); //测量一次正脉冲宽度
void Timer0_IN(void) ;
void Timer1_IN(void) ;
void send()
{
int i,j;
TMOD = 0x11 ; //T1、T0定时方式1,定时器,GATE置0
ET0 = 1 ;
ET1 = 1 ; //开定时
PT1 = 1 ; //T1定时中断优先级高
// 外部中断设置
EA = 1 ; //开总中断
Plus_out = 0 ; //
for( i = 0 ; i <12 ; i++ ) //转换编码高:11 , 低:00 , 高阻:01;
{
if( decode[i] == 1 )
{ rx_decode[2*i] = 1;
rx_decode[2*i+1] = 1 ;
}
else if( decode[i] == 2 )
{
rx_decode[2*i] = 0;
rx_decode[2*i+1] = 1 ;
}
else
{
rx_decode[2*i] = 0;
rx_decode[2*i+1] = 0 ;
}
}
for( j = 0 ; j<4 ; j++)
{
TH1 = init_timer[0][0] ;
TL1 = init_timer[0][1] ; //启始码的周期为128a;同步码
TH0 = init_timer[4][0] ;
TL0 = init_timer[4][1] ; //同步码的正脉冲宽度,4a。
TR0 = 1 ;
TR1 = 1 ; //启动定时器
F0 = 1 ; //标志置位
Plus_out = 1 ; //
for( i = 0 ; i < 25 ; i++ )
{
while( F0 == 1 ) ; //等待TO中断,正脉宽
if ( i != 24 )
{
if( rx_decode[i] == 1 )
{
TH0 = init_timer[2][0] ;
TL0 = init_timer[2][1] ; //同步码的正脉冲宽度,12a。
}
else
{
TH0 = init_timer[3][0] ;
TL0 = init_timer[3][1] ; //同步码的正脉冲宽度,4a。
}
while ( F0 == 0 ) ; //等待T1中断
}
else
while ( F0 == 0 ) ; //等待T1中断
}
}
TR0 = 0 ;
TR1 = 0 ;
Plus_out = 0 ;
}
void main ( void )
{
unsigned int max=0 , min=0 , a3=0 , a5=0, a11=0 ,a13=0 ;
unsigned char temp=0xff ;
led=0;
Plus_out = 0 ;
// 定时器设置
TMOD = 0x09 ; //T0定时方式1,内定时器,GATE置1
// 外部中断设置
IT0 = 1; //外部中断为后沿负跳有效
EX0 = 1 ; //开外部中断
while(1)
{
if(b_stop==0)
{
if(s_xian==0)
s_xian=6561;
// s_xian--;
decode[7]=s_xian%3;
decode[6]=s_xian/3%3;
decode[5]=s_xian/3/3%3;
decode[4]=s_xian/3/3/3%3;
decode[3]=s_xian/3/3/3/3%3;
decode[2]=s_xian/3/3/3/3/3%3;
decode[1]=s_xian/3/3/3/3/3/3%3;
decode[0]=s_xian/3/3/3/3/3/3/3%3;
led=0;
send();
led=1;
}
else
{
led=1;
temp=P1&0xff;
if(temp!=0xff && b_anjian==1)
{
delayms(10);
temp=P1&0xff;
if(temp!=0xff && b_anjian==1)
{
b_anjian=0;
switch ( temp )
{
case 0xfe :
s_xian++;led=0;
decode[7]=s_xian%3;
decode[6]=s_xian/3%3;
decode[5]=s_xian/3/3%3;
decode[4]=s_xian/3/3/3%3;
decode[3]=s_xian/3/3/3/3%3;
decode[2]=s_xian/3/3/3/3/3%3;
decode[1]=s_xian/3/3/3/3/3/3%3;
decode[0]=s_xian/3/3/3/3/3/3/3%3;
break;
case 0xfd :
s_xian--;led=0;
decode[7]=s_xian%3;
decode[6]=s_xian/3%3;
decode[5]=s_xian/3/3%3;
decode[4]=s_xian/3/3/3%3;
decode[3]=s_xian/3/3/3/3%3;
decode[2]=s_xian/3/3/3/3/3%3;
decode[1]=s_xian/3/3/3/3/3/3%3;
decode[0]=s_xian/3/3/3/3/3/3/3%3;
break;
case 0xfb :
led=0;send();led=0; break;
case 0xef :
decode[8]=0;decode[9]=0;decode[10]=0;decode[11]=1;led=0;send();break;
case 0xdf :
if( temp == 0xdf )
decode[8]=0;decode[9]=0;decode[10]=1;decode[11]=0;led=0;send();break;
case 0xbf :
decode[8]=0;decode[9]=1;decode[10]=0;decode[11]=0;led=0;send();break;
case 0x7f :
decode[8]=1;decode[9]=0;decode[10]=0;decode[11]=0;led=0;send();break;
}
}
}
temp=P1&0xff;
if(temp==0xff)
{ b_anjian=1;led=1;}
}
}
}
void INT_0(void) interrupt 0 using 1
{
b_stop=~b_stop;
// b_anjian=~b_anjian;
}
void Timer0_IN(void) interrupt 1 using 2 //产生正脉冲宽度
{
Plus_out =0 ;
TR0 = 0 ;
F0 = 0 ; //标志符
}
void Timer1_IN(void) interrupt 3 using 3 //产生脉冲周期
{
F0 =1 ; //置1
Plus_out =1 ;
TR0 = 1 ; //启动定时T0
TH1 = init_timer[1][0] ;
TL1 = init_timer[1][1] ;
}
void delayms(unsigned char ms)// 延时子程序
{
unsigned char i1;
while(ms--)
{
for(i1 = 0; i1 < 120; i1++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -