|
******主程序
#include <string.h>
#include "Lcd12864.h"
#include "Lcd1602.h"
#include "PWM.h"
#include "config.h"
#include <ds18b20.h>
#include "ds1302.h"
#include "eeprom.h"
#include "uart.h"
#include "key.h"
#include "ad.h"
#include "Time.h"
#include "BH1750.h"
#include "PulseSensor.h"
#include "hcsr501.h"
#include "dht11.h"
extern bit Alarmflag;
bit flagstar = 0;
extern bit buzzerflag;
extern unsigned char set_temper;
extern unsigned char step;
extern struct sTime bufTime; //日期時間緩沖區(qū)
extern bit irflag; //紅外接收標(biāo)志,收到一幀正確數(shù)據(jù)后置1
extern unsigned char RH,RL,TH,TL;
extern unsigned char PulsePin; // Pulse Sensor purple wire connected to analog pin 0(P1.0為傳感器輸入口)
void InitTimer0(void);
unsigned int cnt_i=0;
bit staMute = 0; //靜音標(biāo)志位
extern unsigned char AlarmHour; //鬧鐘時間的小時數(shù)
extern unsigned char AlarmMin; //鬧鐘時間的分鐘數(shù)
unsigned int temper;
signed int rout; // PID Response (Output)
signed int rin; // PID Feedback (Input)
signed char counter=0;
unsigned char number=0;
unsigned char str[30];
extern unsigned char falgstep;
void InitTimer1(void)
{
TMOD&= 0x0F;
TMOD|= 0x10;
TH1 = 0xD4;
TL1 = 0xCD;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void Sys_Init()
{
InitTimer1(); //AD初始化
Uart2Init(0,1,220);//初始化串口,設(shè)置波特率9600
Uart1Init(0,1,220);//初始化串口,設(shè)置波特率9600
}
void main(void)
{
EA=1;
Sys_Init(); //系統(tǒng)初始化
while(1)
{
if(step==0)
{
UartAction();
}
}
}
extern unsigned char i;
void InterruptTimer1() interrupt 3
{
TH1 = 0xFC;
TL1 = 0x66;
}
********uart.c
#include "config.h"
#include "uart.h"
#include "string.h"
#define Buf_Max 100 //緩存長度,這個長度的最大值要根據(jù)單片機型號和程序的實際情況來,我的這個100幾乎是實際情況的最大限度了
unsigned char Rec_Buf[Buf_Max]; //定義緩存數(shù)組
unsigned char Rec_BufU2[Buf_Max]; //定義緩存數(shù)組
unsigned char i=0;
unsigned char a=0; //定義緩存指針
unsigned char bufRxd[100];
unsigned char cntRxd = 0;
bit Uart1_flagFrame = 0; //設(shè)置幀接收完成標(biāo)志
bit Uart2_flagFrame = 0; //設(shè)置幀接收完成標(biāo)志
char Uart1Init(char smod,char brtx12,unsigned char reload)
{
SCON = 0X50;//8位可變波特率,無奇偶位(SM0=0,SM1=1),使能串口接收模塊(REN=1)
BRT = reload;//設(shè)置獨立波特率發(fā)生器波特率
if(smod == 1)
{
PCON |= SMOD; //SMOD = 1;//波特率倍速位
}
else if(smod == 0)
{
PCON &= (~SMOD); //SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}
if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}
AUXR |= S1BRS;//串口1設(shè)置為使用獨立波特率發(fā)生器
AUXR |= BRTR;//開啟波特率發(fā)生器
ES = 1; //開串口中斷
EA = 1; //開總中斷
return 0;
}
char Uart2Init(char s2smod,char brtx12,unsigned char reload)
{
S2CON = 0X50;//8位可變波特率,無奇偶位
BRT = reload;//設(shè)置獨立波特率發(fā)生器波特率
if(s2smod == 1)
{
AUXR |= S2SMOD; //S2SMOD = 1;//波特率倍速位
}
else if(s2smod == 0)
{
AUXR &= (~S2SMOD); //S2SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}
if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}
AUXR |= BRTR;//開啟波特率發(fā)生器
IE2 |= ES2;// ES2 = 1; //允許串口2中斷
EA = 1; //開總中斷
return 0;
}
//void Uart1Send(char i)
//{
// TI = 0; //清空發(fā)送完中斷請求標(biāo)志位
// SBUF = i; //將數(shù)據(jù)放入寄存器發(fā)送
// while(TI == 0);//等待發(fā)送完畢,發(fā)送完畢 TI == 1
// TI = 0; //清空發(fā)送完中斷請求標(biāo)志位
//}
//void Uart1Sends(char* at)
//{
//// while(*at != '\0') //判斷一串?dāng)?shù)據(jù)是否結(jié)束
// {
// SBUF=*(at++); //發(fā)送數(shù)據(jù)
// while(TI==0); //查詢發(fā)送是否結(jié)束
// TI=0; //清除發(fā)送一標(biāo)志位
// }
//}
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //將緩存內(nèi)容清零
{
Rec_Buf[k] = 0;
}
i = 0; //接收字符串的起始存儲位置
}
//void CLR_BufU2(void)
//{
// unsigned char k;
// for(k=0;k<Buf_Max;k++) //將緩存內(nèi)容清零
// {
// Rec_BufU2[k] = 0;
// }
// a = 0; //接收字符串的起始存儲位置
//}
//bit Hand(unsigned char *b)
//{
// if(strstr(Rec_Buf,b)!=NULL)
// return 1;
// else
// return 0;
//}
//bit HandU2(unsigned char *b)
//{
// if(strstr(Rec_BufU2,b)!=NULL)
// return 1;
// else
// return 0;
//}
extern bit flagrxt;
void SerialUart1() interrupt 4
{
ES=0;
if(RI) //如果是接送中斷,則進行處理
{
RI = 0; //清除接收中斷標(biāo)志位
Rec_Buf[i] = SBUF; //將接收到的字符串存到緩存中
i++;
}
if (TI) //字節(jié)發(fā)送完畢
{
TI = 0; //清零發(fā)送中斷標(biāo)志位
}
ES=1;
}
void Uart2Send(char i)
{
unsigned char temp = 0;
IE2 &= (~ES2);//關(guān)閉串口2中斷//ES2 = 0;
S2CON &= (~S2TI);//S2TI = 0;
S2BUF = i;//裝入數(shù)據(jù)
do
{
temp = S2CON;
temp = temp & 0x02;//temp = S2TI;
}while(temp == 0);//判斷是否發(fā)送完畢
S2CON &= (~S2TI);//S2TI = 0;
IE2 |= ES2;//ES2 = 1;
}
//void Uart2Sends(char* data_at)
//{
//
// unsigned char cnt=0;
//
// IE2 &= (~ES2);//關(guān)閉串口2中斷//ES2 = 0;
// S2CON &= (~S2TI);//S2TI = 0;
//
//
// while(*(data_at+cnt)) //判斷一串?dāng)?shù)據(jù)是否結(jié)束
// {
// S2BUF = *(data_at+cnt);//裝入數(shù)據(jù)
// while((S2CON & S2TI) == 0);
// S2CON &= (~S2TI);//S2TI = 0;
// cnt++;
//
// }
//
// S2CON &= (~S2TI);//S2TI = 0;
// IE2 |= ES2;//ES2 = 1;
//}
void InterruptUart2() interrupt 8
{
IE2 &= (~ES2);//關(guān)閉串口2中斷//ES2 = 0;
if(S2CON & S2RI)
{
S2CON &= (~S2RI); //S2RI = 0;
Rec_BufU2[a]=S2BUF;
a++; //緩存指針向后移動
if(Rec_BufU2[a-2] == 0x0d && Rec_BufU2[a-1] == 0x0a && a >= 2)
{
Uart2_flagFrame=1;
}
if(a>100) //如果緩存滿,將緩存指針指向緩存的首地址
{
a = 0;
}
}
IE2 |= ES2;
if(S2CON & S2TI)
{
S2CON &= (~S2TI); //S2TI = 0;
}
}
***********time.c
#include "time.h"
#include <string.h>
#include<string.h> //后面的一些函數(shù)要用到的頭文件,如strstr等
#include <intrins.h>
#include "Lcd12864.h"
#include "Lcd1602.h"
//#include "PWM.h"
#include "config.h"
#include <ds18b20.h>
#include<stdio.h>
#include "eeprom.h"
#include "ds1302.h"
#include "uart.h"
#include "key.h"
#include "dht11.h"
#include "time.h"
#include "Infrared.h"
#include "Moto.h"
#include "BH1750.h"
#include "ad.h"
#include "hcsr501.h"
extern unsigned char str[];
extern bit flagstar;
unsigned char flagstep=0;
bit Alarmflag=0;
bit buzzerflag=0;
extern unsigned char i; //定義緩存指針
unsigned int AlarmHour = 26; //鬧鐘時間的小時數(shù)
unsigned char AlarmMin = 50; //鬧鐘時間的分鐘數(shù)
unsigned char AlarmHour1 = 0x00; //鬧鐘時間的小時數(shù)
unsigned char AlarmMin1 = 0x00; //鬧鐘時間的分鐘數(shù)
struct sTime bufTime; //日期時間緩沖區(qū)
extern signed char KeyCodeMap[4];
extern signed char KeySta[4];
extern bit Uart1_flagFrame ;
extern bit Uart2_flagFrame;
unsigned char step = 0;
extern unsigned char Rec_Buf[]; //定義緩存數(shù)組
extern unsigned char psec=0xAA; //秒備份,初值A(chǔ)A確保首次讀取時間后會刷新顯示
unsigned char str_eeprom[12];
unsigned char toch = 0;
double ADNum=0;
unsigned int Value,b; //定義兩個變量
bit res = 0;
int intT,intT1,intT2,intT3,decT; //溫度值的整數(shù)和小數(shù)部分
int temp = 0;
extern unsigned char RH,RL,TH,TL;
unsigned char str_TX[20];
unsigned char falgstep = 1;
unsigned int j;
unsigned int tempvlue = 0;
unsigned int dis_data=0;//BH1750定義
extern unsigned char BUF[8];
unsigned char lightflag=5;
extern signed char counter;
unsigned char str_TX[20];
extern unsigned int cnt_i;
void delay_Nms(unsigned int Ncount) //誤差 -0.018084490741us
{
unsigned char a,b;
while(Ncount--)
{
for(b=18;b>0;b--)
for(a=149;a>0;a--);
}
}
char strtx1[8]={0x23,0x01,0x04,0x00,0x00,0x00,0x01,0x23};
char strtx2[8]={0x23,0x01,0x04,0x00,0x00,0x00,0x02,0x23};
char strtx3[8]={0x23,0x01,0x04,0x00,0x00,0x00,0x03,0x23};
char strtx4[8]={0x23,0x01,0x04,0x00,0x00,0x00,0x04,0x23};
extern unsigned char i;
unsigned char cnttx=0;
bit flagrxt=0;
void UartAction()
{
if(i!=0)
{
delay_Nms(5);
}
if(i==4)
{
if(Rec_Buf[0]==0x7E&&Rec_Buf[1]==0x41&&Rec_Buf[2]==0x03&&Rec_Buf[3]==0x0D)
{
for(cnttx=0;cnttx<8;cnttx++)
{
Uart2Send(strtx1[cnttx]);
}
led6=0;
led7=1;
}
else if(Rec_Buf[0]==0x7E&&Rec_Buf[1]==0x41&&Rec_Buf[2]==0x06&&Rec_Buf[3]==0x0D)
{
for(cnttx=0;cnttx<8;cnttx++)
{
Uart2Send(strtx2[cnttx]);
}
led6=0;
led7=1;
}
else if(Rec_Buf[0]==0x7E&&Rec_Buf[1]==0x41&&Rec_Buf[2]==0x09&&Rec_Buf[3]==0x0D)
{
for(cnttx=0;cnttx<8;cnttx++)
{
Uart2Send(strtx3[cnttx]);
}
led6=0;
led7=1;
}
else if(Rec_Buf[0]==0x7E&&Rec_Buf[1]==0x41&&Rec_Buf[2]==0x19&&Rec_Buf[3]==0x0D)
{
for(cnttx=0;cnttx<8;cnttx++)
{
Uart2Send(strtx4[cnttx]);
}
led6=0;
led7=1;
}else
{
led6=1;
led7=0;
i=0;
}
CLR_Buf();
i=0;
}
else if((i>=1&&i<=3)||i>=5)
{
led6=1;
led7=0;
i=0;
}
}
*********time.h
#ifndef _TIME_H
#define _TIME_H
void Showstep();
void InputSetStep();
void NumberUpAcktion();
void NumberDownAcktion();
void KeyAction(unsigned char keycode);
void AlarmMonitor();
void ShowBcdByte(unsigned char x, unsigned char y, unsigned char bcd);
void RefreshTimeShow();
void view();
void HC05Action();
void refreshTempHun();
void Alarm();
void refreshTemp();
void refreshTemp1();
void refreshTemp2();
void refreshTemp3();
void refleshhum();
void refreshDs1302();
void eepromreadbyte();
void refreshalarm();
void UartAction();
void AlarmMonitor();
void led2sta(unsigned char sta);
void led2sta(unsigned char sta);
void refreshvoice();
void refreshtouch();
void reflrshuartshow();
#endif
電腦通過串口助手發(fā)送指令收不到指定的指令, 還請有經(jīng)驗的大牛們不吝賜教,謝謝!
|
|