📄 cortrol.c.bak
字号:
//****************************************************************************
//**********情报板系统控制器程序 ***********
//**********单片机STC12C5410AD,晶振18.432MHZ ***********
//**********LIUBIN<2008.6.16> ***********
//**********当前版本1.0 ***********
//****************************************************************************
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#include <ctype.h>
#include <intrins.h>
#define ACK 1
#define noACK 0
#define MEASURE_TEMP 0X03 //测量温度命令
#define MEASURE_HUM1 0X05 //测量湿度命令
#define TEMP 0 //温度参数标志
#define HUMI 1 //湿度参数标志
#define LUMM 2 //亮度参数标志
#define S_TEMP 3
#define DC 4
////***********************************************************************************/
sfr ISP_CONTR=0xe7;
sfr ADC_CONTR=0XC5;
sfr ADC_DATA=0XC6;
sfr P1M0=0X91;
sfr P1M1=0X92;
sbit CHECK1=P1^0;
sbit CHECK2=P1^1;
sbit CHECK3=P1^2;
sbit TH_DATA=P1^4;
sbit TH_SCK =P1^5;
sbit C=P3^7;
sbit DRE=P3^2;
sbit E=P1^7;
sbit AC1=P2^0;
sbit AC2=P2^1;
sbit AC3=P2^2;
sbit KB0=0XA0;
sbit KB1=0XA1;
sbit KB2=0XA2;
sbit KB3=0XA3;
sbit STB=P0^0;
sbit CLK=P0^1;
sbit DATA0=P0^2;
sbit BELL=P0^3;
sbit LED=P3^5;
sbit IN1=P3^3;
//sbit test=P1^6;
//****************************************************************************************
void delay1(unsigned char d1);
void delay(unsigned int i);
int ADC3_Switch(void);
void POW_Check(void);
void Display(signed int display_data,unsigned char dis_flag);
void Display_set(signed int display_set_data,unsigned char dis_set_flag);
void serial_Init(void);
char s_write_byte(char);
void s_transstart(void);
unsigned char s_read_byte(char s );
signed int measure(unsigned char mode);
void key_deal(void);
unsigned char key_switch(unsigned char key_d);
void keycost_deal(unsigned char TH_flag);
void bell(void);
void error_bell(void);
void TH_Control(void);
void Key_scan();
void R_Data_with(void);
void read_device_status( );
void set_TH_Control( );
//******************************************************************/
typedef unsigned char uchar;
uchar xdata CHECK_DATA,POW_DATA;
//uchar xdata serial_id;
uchar xdata i,j;
uchar xdata KeyNumber,kb_data;
bit keyboard_flag,keyflag,RT_Flag;
uchar xdata error;
signed int L_Temp_set,H_Temp_set,H_Hum_set,H_Lum_set;//L_Hum_set,L_Lum_set;
int TEM,HUMM,LUM,f1,f2,f3,time_count;
char TH_F0,TH_F1,TH_F2,kf;
uchar data serial_count,serial_count_T; // serial帧位置计数
uchar data serial_length; // serial帧数据长度
uchar data serial_sum; // serial帧总校验和
uchar data serial_data; // serial帧数据
uchar data serial_id; // DEVICE地址
unsigned char serial_buf_R[7]; // 接收缓冲区
unsigned char serial_buf_T[7]; // 发送缓冲区
unsigned char serial_buf2[7]; // 接收缓冲2区
/*****************************************************************/
/***********************************************************************************/
void main(void)
{
serial_Init( );
while(1)
{
LED=0; //点亮指示灯
POW_Check( ); //三相电源检测
TH_Control(); //温湿度控制
if(kb_data!=0xff) //按键查询处理
{
key_deal();
KeyNumber=0xff;
kb_data=0Xff;
keyflag=0;
}
if(TH_F0==1&&RT_Flag==0)
{
TEM=measure(TEMP); //测试温度值
Display(TEM,TEMP); //显示温度值
}
LED=1; //熄灭指示灯
if(TH_F1==1&&RT_Flag==0)
{
HUMM=measure(HUMI); //测试湿度值
Display(HUMM,HUMI); //显示湿度值
}
if(TH_F2==1&&RT_Flag==0)
{ LUM=ADC3_Switch(); //测试亮度值
Display(LUM,LUMM); //显示亮度值
keyflag=1;
}
if(RT_Flag==1)
{
R_Data_with();
serial_count=0; //复位帧计数
serial_sum=0; //复位校验和
RT_Flag=0;
}
}
}
/*************************************初始化程序********************************
****函数名称:serial_Init() ****************************
****函数功能:设置通讯波特率,定时器0初值 ,变量初值****************************
*******************************************************************************/
void serial_Init(void)
{
TH1 = 0xFB; // 设定TH1初值 , 波特率 19200
TL1 = 0xFB; // 设定TL1初值, 波特率 19200
TH0 = 0Xa5; //定时器0设置初值,定时时间为10MS
TL0 = 0X00;
SCON = 0x50; // 设定串口工作方式
PCON = PCON|0X80;
TMOD = (TMOD & 0x0f) | 0x21; // 设定T1为波特发生器
PS = 1; // 串口为高级中断
ES = 1; // 允许串口中断
TR1 = 1; // 启动T1
TR0 = 1;
ET0 = 1;
// EX1 = 1;
// PX1 =1;
// IT1=1;
EA = 0;
DRE = 0; //设485接受
C=0;
E=0;
delay(5);
serial_id=P2; //读地址
delay(5);
E=1;
BELL=1;
error=0;
// P2=0XF0;
KeyNumber=0XFF;
kb_data=0xff;
keyboard_flag=1;
RT_Flag=0;
keyflag=0;
f1=200;
f2=0;
f3=0;
TH_F0=0;
TH_F1=0;
TH_F2=0;
time_count=0;
kf=0;
serial_count=0;
serial_count_T=0;
L_Temp_set=10;
H_Temp_set=45;
H_Hum_set=80;
EA=1;
}
//********************************串口中断**********************************
//*******函数功能:处理串口中断,接收数据到缓冲区
//******* 发送缓冲区中要发送的数据
//**************************************************************************
void serial_IR (void) interrupt 4
{
uchar temp;
if(RI)
{RI=0;
//LED=0;
temp=SBUF;
if(temp==0x00)
ISP_CONTR=0X60; //软件复位
else
serial_buf_R[serial_count++]=temp; //将数据写入缓存区
}
if(TI)
{ TI=0;
serial_count_T++;
if(serial_count_T < 7)
SBUF = serial_buf_T[serial_count_T]; //发送待发数据
else DRE = 0; //设485接受
}
}
//*********************************接收到数据处理函数*******************
void R_Data_with(void)
{// LED=0;
for(i=0;i<7;i++)
{
serial_buf2[i]=serial_buf_R[i];
}
for(i=0;i<6;i++)
{
serial_sum+=serial_buf_R[i];
}
if(serial_sum==serial_buf2[6]) //校验和累加
{
if(serial_buf2[1]== serial_id) //校验地址
{
if(serial_buf2[2] == 0xA0)
read_device_status( ); //读取控制状态
if(serial_buf2[2]==0x50)
{
set_TH_Control( ); //设置控制
// write_flash();
}
}
}
}
//*******************************取电源状态,温湿度,亮度参数值发送函数*********************
void read_device_status( )
{ // LED=0;
serial_buf_T[0]=0XAA;
serial_buf_T[1]=serial_id;
serial_buf_T[2]=POW_DATA;
serial_buf_T[3]=TEM;
serial_buf_T[4]=HUMM;
serial_buf_T[5]=LUM;
serial_buf_T[6]=serial_buf_T[0]+serial_buf_T[1]+serial_buf_T[2]+serial_buf_T[3]+serial_buf_T[4]+serial_buf_T[5];
DRE = 1; //485启动发送 ,发送温湿度,亮度参数值
delay(200);
serial_count_T = 0;
SBUF = serial_buf_T[0];
}
//******************************************************************************************
//*************************参数控制处理函数*************************************************
void set_TH_Control( )
{
L_Temp_set=serial_buf2[3];
H_Temp_set=serial_buf2[4];
H_Hum_set =serial_buf2[5];
serial_buf_T[0]=0XBB;
serial_buf_T[1]=serial_id;
serial_buf_T[2]=0X50;
serial_buf_T[3]=serial_buf2[3];
serial_buf_T[4]=serial_buf2[4];
serial_buf_T[5]=serial_buf2[5];
serial_buf_T[6]=serial_buf2[6];
DRE = 1; //485启动发送,返回应答数据
delay(200);
serial_count_T = 0;
SBUF = serial_buf_T[0];
}
//*****************************************************************************************
//********************************A/D转换函数*(P1.3)***********************************************/
int ADC3_Switch(void)
{
int ADC_DA;
ADC_CONTR=ADC_CONTR|0X80; //开A/D转换电源
delay(1000);
P1M0=P1M0|0X08; //设置P1.3为开漏模式
P1M1=P1M1|0X08;
ADC_CONTR=ADC_CONTR|0XE3; //设置P1.3为A/D转换通道
ADC_CONTR=ADC_CONTR&0XEF;
delay(10);
ADC_DATA=0;
ADC_CONTR= ADC_CONTR|0X08; //启动A/D转换
while((ADC_CONTR&0X10)==0) //判断A/D转换是否完成
{;}
ADC_CONTR=ADC_CONTR&0XE7; //清标志,关闭A/D转换
ADC_DA=ADC_DATA;
return(ADC_DA);
}
//****************************************************************************************************************/
//*******************************************三相电源检测函数*****************************************************/
void POW_Check()
{
if(CHECK1==0)
{
POW_DATA=0X01;
}
else
{
POW_DATA=0;
}
if(CHECK2==0)
{
POW_DATA=(POW_DATA<<1)|0X01;
}
else
{
POW_DATA=POW_DATA<<1;
}
if(CHECK3==0)
{
POW_DATA=(POW_DATA<<1)|0X01;
}
else
{
POW_DATA=POW_DATA<<1;
}
if(POW_DATA!=0x07)
{CHECK_DATA=0XFF;
}
else
{ CHECK_DATA=0XF8;
}
}
//================================================================================================================//
//=============================================温湿度控制函数=====================================================
void TH_Control(void)
{uchar TH_Con_data;
if(TEM>H_Temp_set)
TH_Con_data=0xf7;
else if(TEM<L_Temp_set)
TH_Con_data=0xEF;
else if(L_Temp_set<TEM<H_Temp_set)
TH_Con_data=0XFF;
if(HUMM>H_Hum_set)
TH_Con_data= TH_Con_data&0XDF;
ET0=0;
P2=CHECK_DATA&TH_Con_data;
C=1;
delay(5);
C=0;
ET0=1;
//P2=0XF0;
}
//*********************************************************************************************************************/
//************************************************数码管显示函数*******************************************************
//********函数名称: Display *******
//********函数功能:五位数码管显示温湿度,亮度 *******
//********入口参数:显示数值,参数标志 *******
//********返回值 :无 *******
//*******************************************************************************************************
void Display(signed int display_data,unsigned char dis_flag)
{uchar xdata A[5];
code uchar D[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0XC7,0X8C,0X88,0XC1,0X91,0XFF,0XBF,0X9C};
uchar dp_data,Y;
if(dis_flag==TEMP)
{A[0]=12;
A[1]=24;
}
if(dis_flag==HUMI)
{A[0]=16;
A[1]=19;
}
if(dis_flag==LUMM)
{A[0]=17;
A[1]=22;
}
if(display_data<=-10)
{A[2]=(display_data*(-1))%10;
A[3]=(display_data*(-1))/10;
A[4]=23;
}
else if(display_data<0)
{A[2]=display_data*(-1);
A[3]=22;
A[4]=23;
}
else if(display_data<10)
{A[2]=display_data;
A[3]=22;
A[4]=22;
}
else if(display_data<100)
{A[2]=display_data%10;
A[3]=display_data/10;
A[4]=22;
}
else if(display_data<1000)
{A[2]=display_data%10;
A[3]=(display_data/10)%10;
A[4]=display_data/100;
}
else if(display_data<10000)
{A[1]=display_data%10;
A[2]=(display_data/10)%10;
A[3]=(display_data/100)%10;
A[4]=display_data/1000;
}
for(i=0;i<5;i++)
{dp_data=D[A[i]];
for(j=8;j>0;j--)
{ CLK=0;
if(dp_data&0x80)
Y=1;
else Y=0;
DATA0=Y;
CLK=1;
dp_data=dp_data<<1;
}
}
STB=0;
STB=1;
delay(2);
STB=0;
}
//===========================================================================================================//
//**********************************************数码管显示参数 函数*******************************************
//******函数功能:显示设置参数值 *******
//************************************************************************************************************
void Display_set(signed int display_set_data,unsigned char dis_set_flag)
{int B[5];
code uchar DD[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0XC7,0X8C,0X88,0XC1,0X91,0XFF,0XBF,0X9C};
uchar dp_data,Y;
if(dis_set_flag==0)
{B[4]=17;
}
if(dis_set_flag==1)
{B[4]=16;
}
if(display_set_data<=-10)
{B[0]=(display_set_data*(-1))%10;
B[1]=(display_set_data*(-1))/10;
B[2]=23;
B[3]=22;
}
else if(display_set_data<0)
{B[0]=display_set_data*(-1);
B[1]=22;
B[2]=23;
B[3]=22;
}
else if(display_set_data<10)
{B[0]=display_set_data;
B[1]=22;
B[2]=22;
B[3]=22;
}
else if(display_set_data<100)
{B[0]=display_set_data%10;
B[1]=display_set_data/10;
B[2]=22;
B[3]=22;
}
else if(display_set_data<1000)
{B[0]=display_set_data%10;
B[1]=(display_set_data/10)%10;
B[2]=display_set_data/100;
B[3]=22;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -