📄 zengzp.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 + -