?? cortrol.c.bak
字號:
//****************************************************************************
//**********情報板系統(tǒng)控制器程序 ***********
//**********單片機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]; // 接收緩沖區(qū)
unsigned char serial_buf_T[7]; // 發(fā)送緩沖區(qū)
unsigned char serial_buf2[7]; // 接收緩沖2區(qū)
/*****************************************************************/
/***********************************************************************************/
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為波特發(fā)生器
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;
}
//********************************串口中斷**********************************
//*******函數功能:處理串口中斷,接收數據到緩沖區(qū)
//******* 發(fā)送緩沖區(qū)中要發(fā)送的數據
//**************************************************************************
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; //將數據寫入緩存區(qū)
}
if(TI)
{ TI=0;
serial_count_T++;
if(serial_count_T < 7)
SBUF = serial_buf_T[serial_count_T]; //發(fā)送待發(fā)數據
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( ); //讀取控制狀態(tài)
if(serial_buf2[2]==0x50)
{
set_TH_Control( ); //設置控制
// write_flash();
}
}
}
}
//*******************************取電源狀態(tài),溫濕度,亮度參數值發(fā)送函數*********************
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啟動發(fā)送 ,發(fā)送溫濕度,亮度參數值
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[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啟動發(fā)送,返回應答數據
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 + -