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

📄 一个简单的c51亮灯的程序,pelco d 2400检测.c

📁 一个简单的C51亮灯的程序
💻 C
字号:
一个简单的C51亮灯的程序,PELCO D 2400检测。
/*9J1普通解码器程序代码*/
/*单片机AT89S51或AT89S52*/
/*包含头文件,单片机SFR定义信息*/
#include <at89x51.h> 
#include <INTRINS.H>
#include <stdio.h>
/*选择晶振*/
//#define XTAL 11059200
#define XTAL 18432000
/*定义波特率设置参数*/
#define BRL2400 256L-XTAL/(12L*16L*2400L)
#define BRL4800 256L-XTAL/(12L*16L*4800L)
#define BRL9600 256L-XTAL/(12L*16L*9600L)
#define BRL19200 256L-XTAL/(12L*16L*19200L)
/*电机运动控制:高低电平的含义*/
/*高电平=电机停止,低电平=电机运动,比如:可控硅控制 */
//const MOVE=0;
//const STOP=1;
/*低电平=电机停止,高电平=电机运动,比如:继电器控制 */
const MOVE=1;
const STOP=0;
/*限位开关:高低电平的含义*/
/*高电平=到达限位,低电平=未到达限位开关*/
//const XWMOVE=0;
//const XWSTOP=1;
/*低电平=到达限位,高电平=未到达限位*/
const XWMOVE=0;
const XWSTOP=1;
/*附加SFR定义*/
/*ATMEL AT89S51 AT89S52*/
sfr16 DPTR=0x82;
sfr WDTRST=0xA6;
/*STC 89C52*/
sfr WDT_CONTR=0xe1;
/*单片机引脚的定义*/
/*电机动作的定义*/
sbit m2up=P1^0; /*上*/
sbit m2down=P1^1; /*下*/
sbit m2left=P1^2; /*左*/
sbit m2right=P1^3; /*右*/
/*摄像机动作的定义*/
sbit camz1=P0^0;/*变倍ZOOM*/
sbit camz2=P0^1;/*变倍ZOOM*/
sbit camf1=P0^2;/*聚焦FOCUS*/
sbit camf2=P0^3;/*聚焦FOCUS*/
sbit cami1=P0^4;/*光圈IRIS*/
sbit cami2=P0^5;/*光圈IRIS*/

/*全局变量定义*/
unsigned char ADDRESS; /* 地址存储变量 */
unsigned char data synch; /* 数据帧头存储变量 */
unsigned char data i; /* 串口中断临时变量,数组下标 */
unsigned char lenth; /* 数据帧的长度标志:pelco_d=7 pleco_p=8 */
unsigned char data rdata[10]; /* 串口接收数据存储数组 */
unsigned char data baudrate; /* 波特率设置变量,用于初始化串口使用 */
/*将数据帧关键数据存储在可位寻址的单元变量*/
unsigned char bdata command1; 
unsigned char bdata command2;
sbit d2up=command2^3;
sbit d2down=command2^4;
sbit d2left=command2^2;
sbit d2right=command2^1;
sbit always0=command2^0;
sbit zoomtele=command2^5;
sbit zoomwide=command2^6;
sbit focusfar=command2^7;
sbit focusnear=command1^0;
sbit irisopen=command1^1;
sbit irisclose=command1^2;
sbit pzoomtele=command2^5;
sbit pzoomwide=command2^6;
sbit pfocusfar=command1^0;
sbit pfocusnear=command1^1;
sbit pirisopen=command1^2;
sbit pirisclose=command1^3;
/*程序运行中的标志位*/
unsigned char bdata flag; 
sbit flag0=flag^0; /* PELCO P协议判断执行标志位 */
sbit flag1=flag^1; /* PELCO D协议判断执行标志位 */
sbit flag2=flag^2; /* 串口数据接收完毕标志位 */
sbit flagauto=flag^3; /* 水平自动扫描程序运行标志位 */
unsigned char bdata flaga;
sbit flagtt1=flaga^1; /* 垂直自动扫描程序开始执行动作标志位 */
sbit flagtt2=flaga^2; /* 垂直自动扫描程序停止标志位 */
sbit flagttadd=flaga^3; /* 水平+垂直自动扫描程序开关判断标志位 */
sbit flagfirst=flaga^4; /*执行拨码选择地址和波特率*/
sbit flagp=flaga^5;
sbit flagd=flaga^6;
/*函数声明*/
//void dog(void); /* 看门狗函数声明,不使用 */
void init_uart(void); /* 串口初始化函数的声明 */
void camerad(void); /* PELCO D协议的摄象机动作函数的声明 */
void motorpd(void); /* 云台动作函数的声明 */
void ifalways0(void); /* 预置位等处理函数的声明,注意:该函数与预置位程序中的函数不同 */

/*主函数*/
void main(void) 
{
/*关闭所有的继电器输出,和摄像机的输出*/
m2up=STOP;m2down=STOP;m2left=STOP;m2right=STOP;
camz1=0;camz2=0;camf1=0;camf2=0;cami1=0;cami2=0;
/*标志位初始化,flag0,为进行pleco d协议判断的标志,flag1作为pelco p协议判断的标志*/
/*确保后面的协议判断及参数设置被执行一次!*/
flagfirst=1;
flag0=1; /* PELCO P协议判断执行标志位赋初值 */
flag1=1; /* PELCO D协议判断执行标志位赋初值 */
flag2=0; /* 串口数据接收完毕标志位赋初值 */
flagauto=0; /* 水平自动扫描程序运行标志位赋初值 */
/* 调用看门狗函数 */
/* dog(); */
WDTRST=0x1e;WDTRST=0xe1; /*ATMEL看门狗程序*/
WDT_CONTR=0x34; /*STC看门狗程序*/
baudrate=BRL2400;flagp=0;flagd=1;lenth=7;synch=0xff;
init_uart(); /* 调用串口初始化函数 */
ADDRESS=1; /* 地址的计算 */
/*嵌入式的主循环,死循环*/
while(1)
{
/* 调用看门狗函数 */
/* dog(); */
WDTRST=0x1e;WDTRST=0xe1; /* 看门狗程序,取消调用环节 */
WDT_CONTR=0x34;
/* 水平自动扫描 */
/* 调用看门狗函数 */
/* dog(); */
WDTRST=0x1e;WDTRST=0xe1; /* 看门狗程序 */
WDT_CONTR=0x34;
/* 对接收到的数据进行相应的处理,完成相应的动作 */
if(flag2) /* 如果数据接收完毕,运行程序 */
{
flag2=0; /* 清除接收数据标志,防止程序多次运行 */
command1=rdata[2];command2=rdata[3];
/* PELCO D 协议,广播地址为0 */
/* flagbaud=0,pelco d */
if(flagd&&((rdata[1]==ADDRESS))&&(rdata[6]==((rdata[1]+rdata[2]+rdata[3]+rdata[4]+rdata[5]))%0xff))  /* 协议分别判断处理 */
{
if(!always0)
{
if((command1==0)&&(command2==0))
{
P0=0;P1=0;P2=0;
}
motorpd(); camerad(); /* PELCO D摄象机动作处理程序 */
}
/* 预置位处理 */
if(always0)
{
ifalways0(); /* 预置位等处理程序 */
}
};
WDTRST=0x1e;WDTRST=0xe1;
WDT_CONTR=0x34;
} /* end of if(flag2) */
} /* end of while(1) */
} /* end of main */
/*主函数结束*/
/*函数定义部分*/
/* 看门狗函数定义 */
/*
void dog(void)
{
WDTRST=0x1e;WDTRST=0xe1;
WDT_CONTR=0x34;
}
*/
/*串口初始化函数的定义*/
void init_uart(void) /*串口初始化程序*/
{ 
SCON=0x50; /* SCON: serail mode 1, 8-bit UART, nable ucvr */
TMOD&=T1_MASK_;
TMOD|=T1_M1_; /* TMOD: timer 1, mode 2, 8-bit reload */
PCON=SMOD_; /* SMOD=1 */
TL1=baudrate;   TH1=baudrate;
IE=0x92; /* Enable Serial Interrupt */
RI=0;  TI=0;
TR1=1; /* timer 1 run */
}
/*串口中断程序的定义 serial interrupt function*/
void serial(void) interrupt SIO_VECTOR using 0 /* 串口中断处理函数 */
{
while (!RI);
rdata[i]=SBUF;
if(rdata[0]==synch){i++;}
if(i==lenth){i=0;flag2=1;}
RI=0;
} 
void camerad(void)
{
/* 聚焦变倍光圈的判断 */
if(zoomtele){camz1=1;}   if(zoomwide){camz2=1;}
if(focusfar){camf1=1;}   if(focusnear){camf2=1;}
if(irisopen){cami1=1;}   if(irisclose){cami2=1;}
}
/* PELCO DP协议中,电机动作处理函数的定义 */
void motorpd(void)
{
/* 兼顾停止命令 */
/* 上下左右的判断 */
if(d2up&&(m2up!=MOVE)) {m2right=STOP;m2left=STOP;m2up=MOVE;flagauto=0;}
if((!d2up)&&(m2up!=STOP)){m2right=STOP;m2left=STOP;m2up=STOP;flagauto=0;}
if(d2down&&(m2down!=MOVE)) {m2right=STOP;m2left=STOP;m2down=MOVE;flagauto=0;} 
if((!d2down)&&(m2down!=STOP)) {m2right=STOP;m2left=STOP;m2down=STOP;flagauto=0;}
/* 增加对flagauto的判断 在自动扫描状态没有清除的时候禁止左右动作的命令的执行 */
if(d2left&&(m2left!=MOVE)) {m2right=STOP;m2left=STOP;m2left=MOVE;flagauto=0;} 
if((!d2left)&&(m2left=STOP)) {m2right=STOP;m2left=STOP;m2left=STOP;flagauto=0;}
if(d2right&&(m2right!=MOVE)) {m2right=STOP;m2left=STOP;m2right=MOVE;flagauto=0;} 
if((!d2right)&&(m2right!=STOP)) {m2right=STOP;m2left=STOP;m2right=STOP;flagauto=0;}
P0=rdata[4];
P2=rdata[5];
}
/* 特殊功能预置位处理函数的定义 */
void ifalways0(void)
{
/* 7代表调用 3 代表设置  7代表删除  99预置位 */
/* rdata[3]==7代表调用预置位 */
if(rdata[3]==7)
{
P0=rdata[5];
}
if(rdata[3]==5)
{
P2=rdata[5];
}
if(rdata[3]==3)
{
P1=rdata[5];
}
}

⌨️ 快捷键说明

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