📄 znjh.c
字号:
if ( flag == INTER ) {
sprintf(str,"室内:%d.%d %d.%d",a,b,c,d);
lcd_str(0,str);
} else {
sprintf(str,"室外:%d.%d %d.%d",a,b,c,d);
lcd_str(1,str);
}
}
/////////////////////
//------------------------------串口---------------------------------------------------
//****************************************************************************
//
// 下面这些函数是使能串口 UART,并从串口发送接收数据,不同的硬件串口,程序都是类似的,只要改一下相应的硬件参数即可
//
//****************************************************************************
//****************************************************************************
//
// UARTEnable 设置串口UART,并使能
//
//****************************************************************************
#define RXEN 4 //Receiver Enable
#define TXEN 3 //Transmitter Enable
#define RXCIE 7 //
#define UDRIE 5 //
#define USBS 3 //Bit 3 - USBS: Stop Bit Select 0: 1位停止位 1: 2位停止位
#define UCSZ0 1 //定义数据位大小
#define UCSZ1 2
#define UCSZ2 2 //Register B 第二位
/*UCSZ2 UCSZ1 UCSZ0 Character Size
0 0 0 5-bit
0 0 1 6-bit
0 1 0 7-bit
0 1 1 8-bit
1 0 0 (reserved)
1 0 1 (reserved)
1 1 0 (reserved)
1 1 1 9-bit
*/
#define UPM0 4 //Register C,奇偶校验模式
#define UPM1 5
/*
UPM1 UPM0 Parity Mode
0 0 Disabled
0 1 (Reserved)
1 0 Enabled, Even Parity
1 1 Enabled, Odd Parity
*/
#define URSEL 7
/*
unsigned char UARTEnable(void)
{
// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud rate: 19200
//波特率计算 Baud = FCK/(16*(UBRR+1))
UCSRA=0x00;
// Enable receiver and transmitter
//UCSR0B=0x18;
UCSRB = (1<<RXEN)|(1<<TXEN);
// Set frame format: 8data, 1stop bit
//UCSR0C=0x06;
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);
UBRRH = 0x00;
UBRRL = 0x19;//12;//0x19; //4M时钟时,0x0c是19200, 0x19是9600
return 0;
}
//****************************************************************************
//
// UARTSendChar 发送一个字符到串口 UART.
//
//****************************************************************************
#define UDRE 5 //Data Register Empty (UDRE) flag.
unsigned char UARTSendChar(unsigned char cChar)
{
if ( !( UCSRA & (1<<UDRE)) ) return 0;
UDR = cChar;
return 1;
}
//****************************************************************************
//
// UARTReceiveChar 从串口 UART 接收字符
//
//****************************************************************************
#define RXC 7 //Receive Complete (RXC) flag.
#define FE 4
#define DOR 3
#define PE 2
unsigned char UARTReceiveChar(unsigned char *nChar)
{
unsigned char i;
unsigned char ucsra_1;
ucsra_1 = UCSRA;
if ( !(ucsra_1 & (1<<RXC)) ) return 0;
if ( (ucsra_1 &(1<<FE)) != 0 ) {
i = 0;
*nChar = UDR;
return 0;
}
if ( (ucsra_1 &(1<<DOR)) != 0 ) {
i = 1;
*nChar = UDR;
return 0;
}
if ( (ucsra_1 &(1<<PE)) != 0 ) {
i = 2;
*nChar = UDR;
return 0;
}
//if ( !(UCSRA & (1<<RXC)) ) return 0;
//if ( !(ucsra_1 & (1<<RXC)) ) return 0;
*nChar = UDR;
return 1;
}
*/
unsigned char UARTEnable_INT(void)
{
// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud rate: 19200
//波特率计算 Baud = FCK/(16*(UBRR+1))
SREG &= 0x7f;
UCSRA=0x00;
/* Enable receiver and transmitter */
//UCSR0B=0x18;
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<UDRIE);
/* Set frame format: 8data, 1stop bit */
//UCSR0C=0x06;
UCSRC = (0<<USBS)|(3<<UCSZ0);
UBRRH=0x00;//0x00;
//UBRRL=71;//外接11.0592MHz的晶振,71为9600.
//UBRRL=0x19; //4M时钟时,0x0c是19200, 0x19是9600, 51:4800, 103:2400
UBRRL=12; //1M时钟时,12为4800,6为9600
SREG |= 0x80;
return 0;
}
interrupt [USART_RXC] void usart_rxc(void)
{
unsigned char inChar;
inChar = UDR;
recvnum++;
if ( (inhead+1) != intail ) {
if ( inhead==intail && inChar=='\n' ) return;
inbuf[inhead] = inChar;
inhead = (inhead+1)%SIZE_OF_INBUF;
}
}
interrupt [USART_DRE] void usart_dre(void)
{
unsigned char cChar;
if ( outtail != outhead ) {
cChar = outbuf[outtail];
outtail = ( outtail+1)%SIZE_OF_OUTBUF;
UDR = cChar;
}
else {
UCSRB &= ~(1<<UDRIE);
}
}
//进风、出风接口
#define __wind_port PORTA.1
#define __wind_ddr DDRA.1
//空调降温接口
#define __aircon_letdown_port PORTA.2
#define __aircon_letdown_ddr DDRA.2
//空调升温接口
#define __aircon_rise_port PORTA.3
#define __aircon_rise_ddr DDRA.3
//加湿接口
#define __addhumi_port PORTA.4
#define __addhumi_ddr DDRA.4
//除湿接口
#define __clearhumi_port PORTC.0
#define __clearhumi_ddr DDRC.0
void ctrl_init(void)
{
__wind_ddr = OUT;
__wind_port = 0; //低电平停
__aircon_rise_ddr = OUT;
__aircon_rise_port = 0; //低电平停
__aircon_letdown_ddr = OUT;
__aircon_letdown_port = 1; //高电平停 2004.7.13
__addhumi_ddr = OUT;
__addhumi_port = 0; //低电平停
__clearhumi_ddr = OUT;
__clearhumi_port = 0; //低电平停
}
void all_init(void)
{
ctrl_init();
lcd_init();
InitTimer0();
}
struct SYSPRM{
unsigned char nTemp;
unsigned char nTempHigh;
unsigned char nTempLow;
unsigned char nTempDualOn;
//unsigned char nRiseNum;
//unsigned char nLetdownNum;
//unsigned char nDelayNum;
unsigned char nHumidity;
unsigned char nHumiLow;
unsigned char nHumiHigh;
unsigned int nTempAirconTimer;
unsigned int nTempAirconAllTimer;
unsigned int nTempWindTimer;
unsigned int nTempWindAllTimer;
unsigned int nHumiTimer;
unsigned int nHumiAllTimer;
unsigned char nNotRunDay; //未运行天数.当 sysprm.nNotRunDay等于10时,为输出调试信息
unsigned char nRunDelay; //运行时长
unsigned char nWindDevice; //风扇设备 0:正常 1:停用
unsigned char nLetDownDevice;
unsigned char nRiseDevice;
unsigned char nAddHumiDevice;
unsigned char nClearHumiDevice;
char tel1[14];
char tel2[14];
//char tel3[14];
char password[8];
char version[6];
}sysprm;
void WriteSysPrm(void);
void ReadSysPrm(void)
{
unsigned char eeprom *ptr_to_eeprom;
unsigned char *ptr_to_ram;
int i;
ptr_to_eeprom = (unsigned char eeprom *)(0);
ptr_to_ram = (unsigned char *)&sysprm;
for (i=0;i<sizeof(struct SYSPRM);i++) {
*ptr_to_ram = *ptr_to_eeprom;
ptr_to_ram++;
ptr_to_eeprom++;
}
//检验数据有效性
if ( sysprm.nTemp >= 50 || sysprm.nTemp < 10) {
sysprm.nTemp = 32;
}
}
void WriteSysPrm(void)
{
unsigned char eeprom *ptr_to_eeprom;
unsigned char *ptr_to_ram;
int i;
ptr_to_eeprom = (unsigned char eeprom *)(0);
ptr_to_ram = (unsigned char *)&sysprm;
for (i=0;i<sizeof(struct SYSPRM);i++){
*ptr_to_eeprom = *ptr_to_ram;
ptr_to_ram++;
ptr_to_eeprom++;
}
}
/*
void SetCalibration(void)
{
unsigned char eeprom *ptr_to_eeprom;
unsigned char a;
ptr_to_eeprom = (unsigned char eeprom *)(0);
a = *ptr_to_eeprom;
OSCCAL = 0x02;//a;
}
*/
//错误号
#define ERROR_ADDHUMI_INVALID 0
#define ERROR_ADDHUMI_SLOW 1
#define ERROR_CLEARHUMI_INVALID 2
#define ERROR_CLEARHUMI_SLOW 3
#define ERROR_WIND_LETDOWN_INVALID 4
#define ERROR_WIND_LETDOWN_SLOW 5
#define ERROR_WIND_RISE_INVALID 6
#define ERROR_WIND_RISE_SLOW 7
#define ERROR_AIRCON_LETDOWN_INVALID 8
#define ERROR_AIRCON_LETDOWN_SLOW 9
#define ERROR_AIRCON_RISE_INVALID 10
#define ERROR_AIRCON_RISE_SLOW 11
#define ERROR_SENSOR 12
#define ERROR_LETDOWN_BAD 13
#define ERROR_RISE_BAD 14
#define ERROR_WIND_BAD 15
#define ERROR_ADDHUMI_BAD 16
#define ERROR_CLEARHUMI_BAD 17
#define ERROR_NO_ERROR 255
#define SERIOUS_ALARM 0
#define NORMAL_ALARM 1
#define SLIGHT_ALARM 2
void SendAlarm(unsigned char AlarmID,unsigned char AlarmType,char *info)
{
sprintf(str,"%d+%d+%d+%02d%02d+%s\r",COM_Alarm,AlarmID,AlarmType,t.hour,t.minute,info);
put_buf(str);
//proc_send();
if( AlarmID == ERROR_LETDOWN_BAD || AlarmID == ERROR_RISE_BAD ||
AlarmID == ERROR_WIND_BAD || AlarmID == ERROR_ADDHUMI_BAD || AlarmID == ERROR_CLEARHUMI_BAD ) return;
__errled_port = 1;
// sprintf(AlarmInfo[alarmpos].date,"%02d/%02d %02d:%02d",t.month,t.date,t.hour,t.minute);
// AlarmInfo[alarmpos].nAlarmID = AlarmID;
// alarmpos = (alarmpos+1)%MAX_ALARMINFO_NUM;
// alarmnum++;
// if ( alarmnum >= MAX_ALARMINFO_NUM ) alarmnum = MAX_ALARMINFO_NUM;
}
unsigned char get2438(unsigned char flag); //取内部温湿度传感器值函数
void ReadSensor(void);
//void proc_user_interface(void);
void data_init(void);
void proc_recv(void);
int SeperateStr(char *src,int pos,char *dest,int destsize);
void DeviceCheck(void);
//add 2005.5.8-----------
unsigned long RecvMsgCount=0; //五分钟收不到消息即复位ETR186 ,即
//计数达到300次即复位ETR186。
unsigned long StartResetCount=0; //开始复位时间点
void ResetEtr186(void)
{
__aircon_letdown_ddr = OUT;
__aircon_letdown_port = 0; //高电平停 2004.7.13
delay_ms(20);
__aircon_letdown_port = 1; //高电平停 2004.7.13
}
void QueryEtr186(void)
{
if ( nSecondCount > RecvMsgCount + 300 ) {
//开始点复位灯
StartResetCount = nSecondCount;
SetOnResetLed();
//复位ETR186
RecvMsgCount = nSecondCount;
ResetEtr186();
} else {
//过了1分钟,灭复位灯
if ( nSecondCount> StartResetCount+ 60 ) { //一分钟
//灭复位灯
StartResetCount = nSecondCount;
SetOffResetLed();
}
}
}
void ProcessComLed(void)
{
static unsigned char ledflag=0;
if ( ledflag == 0 ) {
if ( procnum != recvnum ) {
procnum++;
ledflag = 1;
SetOnComLed();
}
} else {
SetOffComLed();
ledflag = 0;
}
}
//add 2005.5.8------------
void EnableWDT(void);
void main(void)
{
unsigned char runstatus;
unsigned long nCurCount,nCurCount1,nCurCount2;
unsigned char data1,data2;
unsigned char nMCUSR;
int i;
__aircon_letdown_ddr = OUT;
__aircon_letdown_port = 1; //高电平停 2004.7.13
all_init();
nMCUSR = MCUCSR;
MCUCSR = 0x00;
//SetCalibration();
__errled_ddr = OUT;
__errled_port = 0;
runstatus = 0;
ReadSysPrm();
//InitState();
data_init();
UARTEnable_INT();
InitADC();
sprintf(str,"ver:20050508\r\n");
put_buf(str);
lcd_str(0,str);
//while(1) {
// ResetEtr186();
// delay_ms(10000);
//}
#asm("wdr")
data1 = WDTCR;
EnableWDT();
data2 = WDTCR;
#asm("wdr")
// while(1) {
// for (i=0;i<35;i++) delay_us(50000);
// #asm("wdr");
//}
sprintf(str,"SR:%x CR:%x %x\r\n",nMCUSR,data1,data2);
put_buf(str);
lcd_str(1,str);
if ( (nMCUSR&0x08) != 0 ) {
sprintf(str,"看门狗复位启动\r\n");
put_buf(str);
lcd_str(2,str);
delay_ms(5000);
} else {
delay_ms(3000);
}
while(1){
//test
/*
if ( nCurCount2 != nSecondCount ) {
nCurCount2 = nSecondCount;
//sprintf(str,"%d %02d:%02d:%02d %d",nSecondCount,t.hour,t.minute,t.second,nHopFlag);
sprintf(str,"%l %02d:%02d:%02d",nSecondCount,t.hour,t.minute,t.second);
lcd_str(3,str);
}*/
//test
nCurCount1 = nSecondCount;
if ( ((nCurCount1%readinterval)==0) && (nCurCount!=nCurCount1)) {
nCurCount = nCurCount1;
#asm("wdr") //复位看门狗
ReadSensor();
//proc_send();
#asm("wdr") //复位看门狗
}
#asm("wdr") //复位看门狗
//process_menu();
//proc_send();
proc_recv();
//proc_send();
#asm("wdr") //复位看门狗
if ( sample_flag == 1 ) {
if ( nSecondCount>sample_interval+sample_timer ) {
sample_timer = nSecondCount;
sprintf(str,"%d+",COM_SendSample);
FloatToStr(T_in,tmpstr);
//FloatToStr(inTempValue[SamplePos],tmpstr);
strcat(str,tmpstr);
strcatf(str,"+");
FloatToStr(H_in,tmpstr);
//FloatToStr(inHumiValue[SamplePos],tmpstr);
strcat(str,tmpstr);
strcatf(str,"+");
FloatToStr(T_out,tmpstr);
//FloatToStr(outTempValue[SamplePos],tmpstr);
strcat(str,tmpstr);
strcatf(str,"+");
FloatToStr(H_out,tmpstr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -