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

📄 zengzp.c

📁 通信方式是485方式。通过485来控制一组灯的开关。
💻 C
字号:
/*曾智平文档
传送字节37
修改者机号和801一样 ,前置字符和801一样

0x9e+01+00+机号+命令+37+。。。。。。。。。。。。。。
开灯命令0xaa+时间1+时间2+   时间为0表示常开,否则按照时间计算关灯时间
开灯命令0xbb+                  直接关灯


*/




#include <reg54.h>
#include <stdlib.h>
#include <absacc.h>
#include "string.h"
#include "stdio.h"

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#define true 1
#define false 255







uchar idata usart0_flag;
uchar idata usart0_receive_counter;
uchar  idata usart0_rt_temp_memory[39];  //37,,改称10


uchar idata door_low_serial;

sbit lock_1=P4^1;
sbit lock_2=P4^0;


uint led_delay_time=0;


sbit or485=P2^6;


sbit buzzer_led=P3^5;
sbit led=P3^4;
void delay(uchar x)
 {
  uchar i;
  while(x--)
   {
    for(i=0;i<114;i++)
      {;
      }
   }
 }

open_led()
{
 //buzzer_led=0;
 lock_1=0;
 lock_2=0;

}

close_led()
{
// buzzer_led=1;
 lock_1=1;
 lock_2=1;

}
void clr_wdt(void) 
{
WDT54=0x87|0x04;
 
}


void wdt_init(void)
{
 WDT54=0x87;
}




void buzzer_on()
{
  //buzzer_led=0;
  led=1;

}
void buzzer_off()
{
 led=0;
// buzzer_led=1;

}


void buzzer_drive(void)
{
  buzzer_on();
  delay(100);
  buzzer_off();
}









void timer0_init(void)
{
TMOD=0x21;
TL0=0xfd;
TH0=0xdb;  //
TF0=0;
TR0=1;
}

//中断方式接受字符
//获得的数据标准格式0x9e+kind+high_serial+low_serial+command+byte_num+有效数据.
//获得这样的字符串后,才能接收数据
serial() interrupt 4
{
uchar i;
uint temp_add;
bit flag_value;

while(!RI);
RI=0;

usart0_rt_temp_memory[usart0_receive_counter]=SBUF;

flag_value=1;
switch(usart0_receive_counter)
{ //2,3的0,0是设定序列号的标记
  case 0:
  if(usart0_rt_temp_memory[0]!=0x9e)
   {flag_value=0;}//没有找到有效开始字节,,退出去
  usart0_rt_temp_memory[5]=6;//这个字节是要接受的数据个数,置初值不能小于5;
  break;

  case 1:  //有了起始位,判断接下来的四位
  if(usart0_rt_temp_memory[1]==0x9e)//起始位重复,,屏蔽掉
     {usart0_receive_counter--;usart0_rt_temp_memory[5]=6;}
  else if((usart0_rt_temp_memory[1]!=1)&(usart0_rt_temp_memory[1]!=0))
       {flag_value=0;}//不是考勤的标示位
  else{}
  break;

  case 2:
  if(usart0_rt_temp_memory[2]!=0)
   {flag_value=0;}//不是本机的标示位
  break;

  case 3:
  if((usart0_rt_temp_memory[3]!=door_low_serial)&(usart0_rt_temp_memory[3]!=0))
  {flag_value=0;}//不是本机的标示位
  break;

  default:

  break;
}
 if(!flag_value)
   {usart0_receive_counter=0;return;}


usart0_receive_counter++;
timer0_init();//初始化定时时间,10ms自动屏蔽


if(usart0_receive_counter==37)
   {
     /*
     temp_add=0;//判断检验码
     for(i=0;i<usart0_rt_temp_memory[5]-3;i++)
	   {
	     temp_add=temp_add+usart0_rt_temp_memory[i];
	   }
     if(temp_add!=(usart0_rt_temp_memory[usart0_rt_temp_memory[5]-3]*0x100+usart0_rt_temp_memory[usart0_rt_temp_memory[5]-2]))
	   {usart0_receive_counter=0;return;}
     else if(usart0_rt_temp_memory[usart0_rt_temp_memory[5]-1]!=0x9d)
           {usart0_receive_counter=0;return;}
     else
     */

       usart0_flag=true;usart0_receive_counter=0;return;
   }

}




 void or485_o(void)
{
 //P4=P4|0x2;
 or485=1;

}


 void or485_r(void)//  低电位
{
 //P4=P4&0x0d;
 or485=0;


}












void USART0_Transmit_byte(uchar byte)
{
    uchar y;
    y=50;
   TB8=0;
   or485_o();//or_485=1;
   TI=0;
        SBUF=byte;
        while(TI==0);
        TI=0;
        while(y--)
        {;}
        or485_r();//or_485=0;

}


void Usart_Init( void )//7--57600; 23--19200; 47--9600;
{
 TMOD=0X20;
 TH1=0Xfd;
 TL1=0Xfd;
 PCON=0X80; //8 19200
 TR1=1;
 SCON=0X58;  //方式1。。
 IE=0X90;
}






void send_data_to_computer(uchar num_data)
{
 uchar i;
 uint  idata temp_16;

 ES=0;

 usart0_rt_temp_memory[0]=0x8e;  //起始符
 usart0_rt_temp_memory[1]=1;// board type
 usart0_rt_temp_memory[2]=0;//board address l
 usart0_rt_temp_memory[3]=door_low_serial;//board address  h
 //usart0_rt_temp_memory[4]=不管
 usart0_rt_temp_memory[5]=num_data;
 temp_16=0;
 for(i=0;i<num_data-3;i++)
  {
    temp_16=temp_16+usart0_rt_temp_memory[i];
  }
 usart0_rt_temp_memory[num_data-3]=temp_16%0x100;
 usart0_rt_temp_memory[num_data-2]=temp_16/0x100;
 usart0_rt_temp_memory[num_data-1]=0x9d;  //结尾符
 for(i=0;i<num_data;i++)
  {
    USART0_Transmit_byte(usart0_rt_temp_memory[i]);//send_buff_data[i]);
  }

ES=1;
return;

}












void cpu_init(void)
{

EA=0;

P0=0xff;
P1=0xff;
P2=0xff;
P4=0xff;


IE0=0;
IE1=0;
EX1=1;
EX0=1;
IT0=1;
IT1=1;
IP=0X05;
TR0=0;
TF0=0;
//p4口的操作

}








main (void)
{
uchar i;
uchar timer_counter_10ms;

uchar  second_counter=0;

usart0_flag=false;
delay(200);
delay(200);

cpu_init();
Usart_Init();
timer0_init();
EA=0;

buzzer_drive();


or485_r();//  低电位//置485于接收状态

//启动看门狗
wdt_init();


//AUXR=3;//关闭ale信号

door_low_serial=000001;




while(1)
{
EA=1;
ES=1;

clr_wdt();




if(TF0)
 {
   TF0=0;timer_counter_10ms++;timer0_init();
    //判断接受一位数据在规定的时间里面有没有完成
    //10ms时间内,接收完有效数据,,否则放弃
   if(usart0_receive_counter!=0)
      {usart0_receive_counter=0;}
    /*判断打卡的情况*/


 }






if(timer_counter_10ms>100) //1S时间到 //定时100ms判断是不是外中断,还是串口中断结束

⌨️ 快捷键说明

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