 
- UID
- 373967
- 帖子
- 9377
- 主題
- 2609
- 精華
- 0
- 積分
- 1021
- 楓幣
- 1
- 威望
- 997
- 存款
- 38367
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 475 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2025-3-2
|
以下是一個簡單的自動滅菌鞋櫃的示例程式碼,使用STC12C5410AD微控制器實現控制。
零件規格
紫外線燈管:使用一個紫外線燈管進行滅菌,燈管接到P1.0。
溫度濕度傳感器:使用DHT11模組檢測環境溫度和濕度,引腳接到P0.0。
LCD顯示屏:使用16x2的字符LCD顯示屏,引腳分別接到P2.4-P2.7和P3.2-P3.3。
連接腳位
P1.0:紫外線燈管引腳
P0.0:溫度濕度傳感器引腳
P2.4-P2.7、P3.2-P3.3:LCD顯示屏引腳
程式碼
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
// 定義紫外線燈管控制引腳
sbit uv_light = P1^0;
// 定義溫度濕度傳感器引腳
sbit dht11_data = P0^0;
// 定義LCD顯示屏引腳
sbit lcd_rs = P2^4;
sbit lcd_rw = P2^5;
sbit lcd_en = P2^6;
sbit lcd_d4 = P3^2;
sbit lcd_d5 = P3^3;
sbit lcd_d6 = P2^7;
sbit lcd_d7 = P3^4;
// 聲明液晶顯示相關函數
void lcd_delay(uint z);
void lcd_init();
void lcd_write_com(uchar com);
void lcd_write_data(uchar dat);
void lcd_clear();
void lcd_gotoxy(uchar x, uchar y);
// 聲明溫度濕度傳感器相關函數
void dht11_delay(uint z);
void dht11_start();
uchar dht11_read_byte();
void dht11_read_data(uchar *temp, uchar *humi);
// 主函數
void main()
{
uchar temp, humi; // 定義溫度和濕度變量
lcd_init(); // 初始化LCD顯示屏
while(1) // 主循環
{
dht11_read_data(&temp, &humi); // 讀取溫度和濕度
lcd_clear(); // 清空LCD顯示屏
lcd_gotoxy(0, 0); // 定位到第一行第一列
printf("Temperature: %dC", temp); // 顯示溫度
lcd_gotoxy(0, 1); //
printf("Humidity: %d%%", humi); // 顯示濕度
if(temp >= 70 && humi >= 70) // 判斷溫度和濕度是否達到滅菌標準
{
uv_light = 1; // 開啟紫外線燈管
lcd_gotoxy(0, 2); // 定位到第二行第一列
printf("UV Light: ON"); // 顯示紫外線燈管狀態
}
else
{
uv_light = 0; // 關閉紫外線燈管
lcd_gotoxy(0, 2); // 定位到第二行第一列
printf("UV Light: OFF"); // 顯示紫外線燈管狀態
}
delay(1000); // 延時1秒
}
}
// LCD顯示相關函數
void lcd_delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_init()
{
lcd_write_com(0x02);
lcd_write_com(0x28);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
}
void lcd_write_com(uchar com)
{
lcd_rs = 0;
lcd_rw = 0;
lcd_d7 = (com & 0x80)>>7;
lcd_d6 = (com & 0x40)>>6;
lcd_d5 = (com & 0x20)>>5;
lcd_d4 = (com & 0x10)>>4;
lcd_en = 1;
lcd_delay(5);
lcd_en = 0;
lcd_d7 = (com & 0x08)>>3;
lcd_d6 = (com & 0x04)>>2;
lcd_d5 = (com & 0x02)>>1;
lcd_d4 = (com & 0x01);
lcd_en = 1;
lcd_delay(5);
lcd_en = 0;
}
void lcd_write_data(uchar dat)
{
lcd_rs = 1;
lcd_rw = 0;
lcd_d7 = (dat & 0x80)>>7;
lcd_d6 = (dat & 0x40)>>6;
lcd_d5 = (dat & 0x20)>>5;
lcd_d4 = (dat & 0x10)>>4;
lcd_en = 1;
lcd_delay(5);
lcd_en = 0;
lcd_d7 = (dat & 0x08)>>3;
lcd_d6 = (dat & 0x04)>>2;
lcd_d5 = (dat & 0x02)>>1;
lcd_d4 = (dat & 0x01);
lcd_en = 1;
lcd_delay(5);
lcd_en = 0;
}
void lcd_clear()
{
lcd_write_com(0x01);
lcd_delay(10);
}
void lcd_gotoxy(uchar x, uchar y)
{
uchar addr;
if(y==0)
addr = 0x80+x;
else
addr = 0xc0+x;
lcd_write_com(addr);
}
void lcd_write_string(uchar x, uchar y, uchar *s)
{
lcd_gotoxy(x,y);
while(*s)
lcd_write_data(*s++);
}
// DHT11溫濕度傳感器相關函數
uchar dht11_init()
{
uchar i;
dht11_dat = 1;
delay(10);
dht11_dat = 0;
delay(18);
dht11_dat = 1;
delay(1);
if(dht11_dat)
{
return 0;
}
delay(80);
if(!dht11_dat)
{
return 0;
}
delay(80);
for(i=0;i<5;i++)
{
dht11_buf[i] = dht11_read_byte();
}
if((dht11_buf[0]+dht11_buf[1]+dht11_buf[2]+dht11_buf[3]) != dht11_buf[4])
{
return 0;
}
return 1;
}
uchar dht11_read_byte()
{
uchar i, j, dat;
dat = 0;
for(i=0;i<8;i++)
{
dht11_dat = 0;
delay(1);
dht11_dat = 1;
j = 0;
while(!dht11_dat)
{
delay(1);
j++;
if(j > 50)
{
return 0;
}
}
delay(5);
if(dht11_dat)
{
dat |= (1<<(7-i));
}
j = 0;
while(dht11_dat)
{
delay(1);
j++;
if(j > 50)
{
return 0;
}
}
}
return dat;
}
// 主函数
void main()
{
uchar hum, tem, hum1, hum2, tem1, tem2, i;
init();
while(1)
{
hum1 = 0;
hum2 = 0;
tem1 = 0;
tem2 = 0;
if(dht11_init())
{
hum = dht11_buf[0];
tem = dht11_buf[2];
hum1 = hum / 10 + '0';
hum2 = hum % 10 + '0';
tem1 = tem / 10 + '0';
tem2 = tem % 10 + '0';
}
lcd_write_string(1,1,"Humidity:");
lcd_write_data(hum1);
lcd_write_data(hum2);
lcd_write_data('%');
lcd_write_string(1,2,"Temperature:");
lcd_write_data(tem1);
lcd_write_data(tem2);
lcd_write_data(0xdf);
lcd_write_string(4,2,"C");
delay(500);
lcd_clear();
}
}
以上是一個簡單的例子,展示了如何使用STC12C5410AD控制DHT11溫濕度傳感器和LCD顯示屏。
在這個例子中,我們使用了STC12C5410AD的數字輸出/輸入口P1.0來控制DHT11溫濕度傳感器,使用了P2.0-P2.7來控制LCD顯示屏。
在主函數中,我們首先初始化了DHT11溫濕度傳感器,然後從傳感器讀取溫度和濕度數據。
我們將溫度和濕度數據轉換為字符數據,並使用LCD顯示屏顯示它們。
最後,我們等待500毫秒,然後清除LCD顯示屏上的數據,並繼續循環執行主函數。 |
|