⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 red_code.c

📁 是一个红灯编码器的实用程序,已经经过验证,工作可靠.
💻 C
字号:
#include "stdio.h"
#include "reg51.h"
#include "intrins.h"
#include "absacc.h"
#include "stdlib.h"
#include "ctype.h"
#define uchar unsigned char
#define uint unsigned int

sbit LED=P2^6;
sbit P2_4=P2^4;
sbit P2_5=P2^5;

uchar a1,a2,b1,b2;

uchar time0_count=0;
uchar ms1000_flag=0;
uchar ms50_flag=0;

uchar receive_end_flag=0;
uchar receive_data=0;
uchar transmit_data[10];
uchar first_flag=0;

void delay(uint DelayTime) //延时函数
{	 
  while(DelayTime!=0)
    {
      DelayTime--;
       }  
}
void CPU_init()
{
	IE = 0;
	PSW = 0;
	IP = 0x1A;   //外部中断0和1为高优先级中断?
	TMOD = 0x21; //T1为定时器,T0为定时器,为16位定时器
	TCON = 0;
	SCON = 0X50;
	PCON = 0;
	TR0 = 0;
	TR1=0;
	TL0 = 0xFD;  //定时器0初值19453=4BFD
	TH0 = 0x4B;
	TL1 = 0xFD;  //波特率设置9600
	TH1 = 0xFD;
	EA = 0;     // all interrupt
	IT0 = 1;     //set into:falling eage trigger
	IT1 = 1;   //边沿触发
	TR0 = 1;          //开定时器0
	TR1 = 1;         //开定时器1
	ET0 = 1;         //定时器0中断允许
}
void time0_int() interrupt 1 using 0
{
 TR0=0;
 ET0=0;
 TL0=0x00;           //50ms定时器重装载值
 TH0=0x4C;
 time0_count++;
 if(time0_count>=20)
 {
  ms1000_flag=1; 
  }
 TR0=1;
 ET0=1;
}
void serial_int4() interrupt 4 using 1
{
	if(RI==1)
	{  receive_data=SBUF;
	   RI=0;
	   receive_end_flag=1;
	   }
}

void transmit()
{uchar j;
  P2_5=1;
  for(j=0;j<5;j++)
   {
     SBUF=transmit_data[j];                  //往SBUF写报文
	 while(TI==0);
	  TI=0;
      }
    P2_5=0;
    TR0=0;
    ET0=0;
    TL0=0x00;           //50ms定时器重装载值
    TH0=0x4C;
    time0_count=0;
    ms1000_flag=0; 
    TR0=1;
    ET0=1;
 }
main()
{
 uchar j,i;
 CPU_init();
 ES=1;
 ET0=1;
 REN=1;
 EA=1;
 transmit_data[0]=0xef;
 transmit_data[4]=0xfe;
 for(i=0;i<5;i++)
 {
  P2_4=1;
  P2_4=0;
  delay(15000);
  LED=!LED;
  }
 P2_5=0;
 for(;;)
 {
  P2_4=1;
  P2_4=0;
  a2=a1;
  a1=~(((P1<<7)&0x80)|((P1<<5)&0x40)|((P1<<3)&0x20)|((P1<<1)&0x10)|((P1>>7)&0x01)|((P1>>5)&0x02)|((P1>>3)&0x04)|((P1>>1)&0x08));
  b2=b1;
  b1=_crol_(((~P2)&0x0f),4);
  if(a2!=a1||b2!=b1)
  {
    transmit_data[0]=0xef;             //报文头
    transmit_data[1]=a1;               //报文区
    transmit_data[2]=b1;                //报文区
    transmit_data[3]=a1+b1;             //校验和
    transmit_data[4]=0xfe;               //报文尾 
    transmit();
	first_flag=1;
    }
   else
  {
    if(ms1000_flag==1&&first_flag==1)	//每隔一秒或是状态有变化是发送;
     {
      transmit();
       }
      }
  if(receive_end_flag==1)
     {
       receive_end_flag=0;              //发送完毕时需要重新置零
       if(receive_data==0xB2)
         {
           P2_5=1;
           for(j=0;j<5;j++)
            {
              SBUF=transmit_data[j];                  //往SBUF写报文
	          while(TI==0);
	          TI=0;
              }
            P2_5=0;
            receive_data=0;
          }
       }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -