|
智能水杯-
- /*连线说明: 蓝牙: RXD--P43
- 液晶 RXD--P31
- DHT11 DATA--P20
- */
- /*************** 用户定义参数 *****************************/
- #define MAIN_Fosc 11059200L //define main clock
- #define Baudrate1 9600 //define the baudrate, 如果使用BRT做波特率发生器,则波特率跟串口2一样
- //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
- #define Baudrate2 9600 //define the baudrate2,
- //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
- #define BUF_LENTH 1 //定义串口接收缓冲长度
- /**********************************************************/
- #include <STC12C5A60S2.h>
- #include <DS18B20.h>
- #define U8 unsigned char
- #define U16 unsigned int
- unsigned char uart1_wr; //写指针
- unsigned char uart1_rd; //读指针
- unsigned char xdata RX1_Buffer[BUF_LENTH];
- bit B_TI,flag;
- unsigned char uart2_wr; //写指针
- unsigned char uart2_rd; //读指针
- unsigned char xdata RX2_Buffer[BUF_LENTH];
- bit B_TI2;
- sbit JDQ=P3^7;
- bit sec;
- U8 state,cnt;
- int TempThreshold,TH;
- /****************** 编译器自动生成,用户请勿修改 ************************************/
- #define T1_TimerReload (256 - MAIN_Fosc / 192 / Baudrate1) //Calculate the timer1 reload value at 12T mode
- #define BRT_Reload (256 - MAIN_Fosc / 192 / Baudrate2) //Calculate BRT reload value
- #define TimeOut1 (28800 / (unsigned long)Baudrate1 + 2)
- #define TimeOut2 (28800 / (unsigned long)Baudrate2 + 2)
- #define TI2 (S2CON & 0x02) != 0
- #define RI2 (S2CON & 0x01) != 0
- #define CLR_TI2() S2CON &= ~0x02
- #define CLR_RI2() S2CON &= ~0x01
- /******************** 本地函数声明 ***************/
- void uart1_init(void);
- void uart2_init(void);
- void UART1_TxByte(unsigned char dat);
- void UART2_TxByte(unsigned char dat);
- void PrintString1(unsigned char *puts);
- void PrintString2(unsigned char *puts);
- /**********************************************************/
- //液晶相关函数,利用串口2完成数据收发功能
- void UART1_TxByte(unsigned char dat)
- {
- B_TI = 0;
- SBUF = dat;
- while(!B_TI);
- B_TI = 0;
- }
- void UART2_TxByte(unsigned char dat)
- {
- B_TI2 = 0;
- S2BUF = dat;
- while(!B_TI2);
- B_TI2 = 0;
- }
- void PrintString1(unsigned char *puts) //发送一串字符串
- {
- for (; *puts != 0; puts++) UART1_TxByte(*puts); //遇到停止符0结束
- }
- void PrintString2(unsigned char *puts) //发送一串字符串
- {
- for (; *puts != 0; puts++) UART2_TxByte(*puts); //遇到停止符0结束
- }
- void uart1_init(void)
- {
- PCON |= 0x80; //UART0 Double Rate Enable
- SCON = 0x50; //UART0 set as 10bit , UART0 RX enable
- TMOD &= ~(1<<6); //Timer1 Set as Timer, 12T
- TMOD = (TMOD & ~0x30) | 0x20; //Timer1 set as 8 bits auto relaod
- TH1 = T1_TimerReload; //Load the timer
- TR1 = 1;
- ES = 1;
- EA = 1;
- }
- /**********************************************/
- void UART0_RCV (void) interrupt 4
- {
- if(RI)
- {
- RI = 0;
- RX1_Buffer[uart1_wr] = SBUF;
- if(++uart1_wr >= BUF_LENTH) uart1_wr = 0;
- }
- if(TI)
- {
- TI = 0;
- B_TI = 1;
- }
- }
- /**********************************************/
- void uart2_init(void)
- {
- AUXR |= (1 << 3); //串口2波特率加倍
- S2CON = (S2CON & 0x3f) | (1<<6); //串口2模式1,8位UART,(2^S2SMOD / 32) * BRT溢出率
- S2CON |= 1 << 4; //允许串2接收
- AUXR |= 1 << 4; //baudrate use BRT
- BRT = BRT_Reload;
- IE2 |= 1; //允许串口2中断
- }
- /**********************************************/
- void UART2_RCV (void) interrupt 8
- {
- if(RI2)
- {
- CLR_RI2();
- RX2_Buffer[uart2_wr] = S2BUF;
- flag=1;
- if(++uart2_wr >= BUF_LENTH) uart2_wr = 0;
- }
- if(TI2)
- {
- CLR_TI2();
- B_TI2 = 1;
- }
- }
- /**********************************************************/
- void InitT0()
- {
- TMOD|=0X01;
- IE|=0X82;
- TR0=1;
- }
- void T0Ser() interrupt 1
- {
- if(++cnt==16)
- {
- cnt=0;
- sec=1;
- }
- }
- void Uart2Enter()
- {
- UART2_TxByte(0x0d);
- UART2_TxByte(0x0a);
- }
- void Uart1Enter()
- {
- UART1_TxByte(0x0d);
- UART1_TxByte(0x0a);
- }
- void dis_LanYa(void)
- {
- char temp[]="TH=25.0C";
- temp[3]=TempThreshold/100+48;
- temp[4]=TempThreshold%100/10+48;
- temp[6]=TempThreshold%10+48;
- UART2_TxByte('T');
- UART2_TxByte('=');
- UART2_TxByte(TH%1000/100+0x30);
- UART2_TxByte(TH%100/10+0x30);
- UART2_TxByte('.');
- UART2_TxByte(TH%10+0x30);
- PrintString2("C");
- Uart2Enter();
-
- PrintString2(temp);
- Uart2Enter();
- Uart2Enter();
- }
- void dis_LanYa2(void)
- {
- char temp[]="TH=25.0C";
- temp[3]=TempThreshold/100+48;
- temp[4]=TempThreshold%100/10+48;
- temp[6]=TempThreshold%10+48;
- UART1_TxByte('T');
- UART1_TxByte('=');
- UART1_TxByte(TH%1000/100+0x30);
- UART1_TxByte(TH%100/10+0x30);
- UART1_TxByte('.');
- UART1_TxByte(TH%10+0x30);
- PrintString1("C");
- PrintString1(temp);
- Uart1Enter();
- Uart1Enter();
-
- }
- void main(void)
- {
- unsigned int oldT,oldTh;
- InitT0();
- uart1_rd = 0;
- uart1_wr = 0;
- uart2_rd = 0;
- uart2_wr = 0;
- // AUXR |= 0x01; //串口1使用独立波特率发生器, 波特率跟串口2一样
- AUXR1 |= (1<<4); //将UART2从P1口切换到 RXD2--P1.2切换到P4.2 TXD2---P1.3切换到P4.3
-
- uart1_init();
- uart2_init();
-
- state=0; //==0 正常模式,==1设置模式
- TempThreshold=400;
-
- P3M1&=0X7F; //强推挽模式,推动继电器
- P3M0|=0X80;
- PrintString1("Hello");
- while(1)
- {
- if(flag) //串行口2(蓝牙)接收到数据 A(温度增加) B(温度减少)
- {
- flag=0;
- if(RX2_Buffer[0]=='A' || RX2_Buffer[0]=='a')
- {
- TempThreshold+=10; //目标温度++
- if(TempThreshold>800)
- {
- PrintString2("Warning,you can't set the value greater than 80C");
- Uart2Enter();
- TempThreshold=800;
- }
- }
- else if(RX2_Buffer[0]=='B' || RX2_Buffer[0]=='b')
- {
- TempThreshold-=10; //目标温度--
- if(TempThreshold<40)
- {
- PrintString2("Warning,you can't set the value less than 4C");
- Uart2Enter();
- TempThreshold=40;
- }
- }
- }
- if(sec)
- {
- sec=0;
- TH=Get_temp();
-
- if((oldT!=TH)||(TempThreshold!=oldTh))//如果温度有变化或者设置的阈值有变化,才更新显示
- {
- oldT=TH;
- oldTh=TempThreshold;
- dis_LanYa();
- dis_LanYa2();
-
- if(TH>=TempThreshold-1) //还差1度就停止加热
- {
- PrintString2("Stop heat");
- Uart2Enter();
- JDQ=0;//关闭加热装置
- }
- else if(TH<TempThreshold-1) //相差1摄氏度再开启加热
- {
- JDQ=1;// 打开加热装置
- PrintString2("Heating");
- Uart2Enter();
- }
- }
-
- }
- }
- }
复制代码
|
-
-
智能水杯.7z
29.96 KB, 下载次数: 7, 下载积分: 黑币 -5
|