|
|
#include <reg52.h>
#include <stdio.h>
// 定義液晶顯示屏引腳連接
sbit RS = P2^5; // 液晶顯示屏的RS引腳
sbit RW = P2^6; // 液晶顯示屏的RW引腳
sbit E = P2^7; // 液晶顯示屏的E引腳
// 定義液晶顯示屏的數據線引腳
sbit D0 = P0^0;
sbit D1 = P0^1;
sbit D2 = P0^2;
sbit D3 = P0^3;
sbit D4 = P0^4;
sbit D5 = P0^5;
sbit D6 = P0^6;
sbit D7 = P0^7;
// 定義溫濕度傳感器的引腳
sbit DHT11_IO = P3^7;
sbit switch2 = P3^3;
sbit switch10 =P1^3;
sbit switch9= P1^4;
sbit switch8 = P1^5;
sbit switch7 = P1^6;
// 定義液晶顯示屏的命令碼
#define CMD_CLEAR 0x01
#define CMD_DISPLAY_ON 0x0C
#define CMD_CURSOR_HOME 0x02
#define CMD_SET_CURSOR 0x80
// 定義溫濕度傳感器和時鐘模塊的相關函數和變量
// 請根據具體的傳感器和時鐘模塊進行相應的實現
unsigned char temperature = 0; // 溫度值
unsigned char humidity = 0; // 濕度值
// 延時函數
void delay(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void LCD_WriteCmd(unsigned char cmd) {
RS = 0; // 設置為命令模式
RW = 0; // 設置為寫入模式
E = 1;
P0 = (P0 & 0xF0) | (cmd >> 4); // 寫入高4位命令
E = 0;
delay(1);
E = 1;
P0 = (P0 & 0xF0) | (cmd & 0x0F); // 寫入低4位命令
E = 0;
delay(1);
}
// 初始化液晶顯示屏
void LCD_Init() {
delay(15); // 延時等待液晶顯示屏上電穩定
LCD_WriteCmd(0x28); // 設置為4位數據總線、2行顯示、5×7點陣字符
LCD_WriteCmd(0x0C); // 顯示開,光標關閉
LCD_WriteCmd(0x06); // 寫入字符后地址指針加1,不移動顯示
LCD_WriteCmd(0x01); // 清除顯示
}
// 向液晶顯示屏寫入數據
void LCD_WriteData(unsigned char dat) {
RS = 1; // 設置為數據模式
RW = 0; // 設置為寫入模式
E = 1;
P0 = (P0 & 0xF0) | (dat >> 4); // 寫入高4位數據
E = 0;
delay(1);
E = 1;
P0 = (P0 & 0xF0) | (dat & 0x0F); // 寫入低4位數據
E = 0;
delay(1);
}
// 設置液晶顯示屏的光標位置
void LCD_SetCursor(unsigned char row, unsigned char col) {
unsigned char addr;
if (row == 0) {
addr = 0x80 + col; // 第1行
} else {
addr = 0xC0 + col; // 第2行
}
LCD_WriteCmd(addr);
}
// 在液晶顯示屏上顯示字符串
void LCD_DisplayString(unsigned char row, unsigned char col, unsigned char *str) {
LCD_SetCursor(row, col);
while (*str != '\0') {
LCD_WriteData(*str++);
}
}
void DHT11_Start(void)
{
DHT11_IO =1;
DHT11_IO =0;
delay(20);
DHT11_IO =1;
delay(50);
}
char GetTemperature(void){
char i,flag,byteRead =0;
for(i = 8;i<16;i++)
{
while(!DHT11_IO)
delay(33);
if(DHT11_IO ==1)
{
flag=1;
while(DHT11_IO);
}
else
{
flag =0;
}
}
byteRead<<=1;
byteRead|=flag;
return byteRead;
}
char GetHumidity(void){
char i,flag,byteRead =0;
for(i = 0;i<8;i++)
{
while(!DHT11_IO)
delay(33);
if(DHT11_IO ==1)
{
flag=1;
while(DHT11_IO);
}
else
{
flag =0;
}
}
byteRead<<=1;
byteRead|=flag;
return byteRead;
}
// 獲取溫濕度值
void GetTemperatureHumidity() {
delay(500);delay(500);delay(500);
DHT11_Start();
// 請根據具體的溫濕度傳感器進行相應的實現
// 這里僅作為示例,假設獲取溫濕度的函數為GetTemperatureHumidity()
temperature = GetTemperature();
DHT11_Start();
humidity = GetHumidity();
}
// 發送溫濕度值到串口助手
void SendTemperatureHumidityToSerial() {
// 將溫濕度值轉換為字符串
char tempStr[4];
char humiStr[4];
sprintf(tempStr, "%d", temperature);
sprintf(humiStr, "%d", humidity);
// 發送溫濕度值到串口助手
UART_SendString("Temperature: ");
UART_SendString(tempStr);
UART_SendString("C, Humidity: ");
UART_SendString(humiStr);
UART_SendString("%\r\n");
}
// 主函數
void main() {
// 初始化液晶顯示屏
LCD_Init();
while (1) {
// 獲取溫濕度值
GetTemperatureHumidity();
// 在液晶顯示屏上顯示溫濕度
LCD_DisplayString(0, 0, "Temp: ");
LCD_WriteData(temperature);
LCD_DisplayString(0, 8, "C");
LCD_DisplayString(1, 0, "Humid: ");
LCD_WriteData(humidity);
LCD_DisplayString(1, 8, "%");
// 檢查串口接收到的命令
if (receivedData) {
switch (receivedData) {
case '0':
// 關閉液晶顯示屏
LCD_WriteCmd(CMD_DISPLAY_ON);
break;
case '1':
// 打開液晶顯示屏
LCD_WriteCmd(CMD_DISPLAY_ON | 0x04);
break;
default:
break;
}
receivedData = 0; // 清空接收數據緩存
}
// 檢查開關狀態
if (switch2) {
// 發送實時溫濕度到串口助手
SendTemperatureHumidityToSerial();
}
if (switch10) {
// 時間加1
IncreaseTime();
}
if (switch9) {
// 時間減1
DecreaseTime();
}
if (switch8) {
// 切換時間位(秒、分、時)
SwitchTimeUnit();
}
if (switch9) {
// 暫停時間
PauseTime();
}
// 延時一段時間,避免過于頻繁地刷新液晶顯示屏
delay(1000);
}
}
|
|