?? 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 + -