標(biāo)題: 基于STC15單片機(jī)溫度光照藍(lán)牙傳輸-proteus仿真-源程序 [打印本頁]
作者: bbxyliyang 時(shí)間: 2023-11-5 16:37
標(biāo)題: 基于STC15單片機(jī)溫度光照藍(lán)牙傳輸-proteus仿真-源程序
一、系統(tǒng)方案
本設(shè)計(jì)采用STC15單片機(jī)作為主控器,液晶1602顯示,DS18B20采集溫度,光敏電阻采集光照、按鍵設(shè)置溫度上下限,測量溫度小于下限,啟動(dòng)加熱,測量溫度大于上限,啟動(dòng)降溫。
1.jpg (5.25 KB, 下載次數(shù): 23)
下載附件
2023-11-5 16:36 上傳
二、硬件設(shè)計(jì)
原理圖如下:
2.jpg (59.94 KB, 下載次數(shù): 30)
下載附件
2023-11-5 16:36 上傳
三、單片機(jī)軟件設(shè)計(jì)
1、首先是系統(tǒng)初始化
uint count=0;
uint16 TempPhoto;
uint8 strPhoto[6];
uint wendu=0;
P3M0 = 0x00;
P3M1 = 0x00;
lcd_init(); //LCD1602初始化
delay_ms(10); //初始化后延時(shí)
DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內(nèi)容
DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內(nèi)容
InitADC();
InitUart(); //初始化串口
2、液晶顯示程序
/**************************************
功能描述:LCD1602寫命令函數(shù)
入口參數(shù)int8 com
返回值:無
***************************************/
void lcd_wcom(uint8 com)
{
lcd1602_rs=0; //選擇指令寄存器
lcd1602_rw=0; //選擇寫
P0=com; //把命令字送入P0
delay_ms(1); //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
lcd1602_en=1; //使能線電平變化,命令送入1602的8位數(shù)據(jù)口
lcd1602_en=0;
}
/**************************************
功能描述:LCD1602寫數(shù)據(jù)函數(shù)
入口參數(shù):uint8 dat
返回值:無
***************************************/
void lcd_wdat(uint8 dat)
{
lcd1602_rs=1; //選擇數(shù)據(jù)寄存器
lcd1602_rw=0; //選擇寫
P0=dat; //把要顯示的數(shù)據(jù)送入P0
delay_ms(1); //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
lcd1602_en=1; //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
lcd1602_en=0;
}
/**************************************
功能描述:LCD1602初始化函數(shù)
入口參數(shù):無
返回值:無
***************************************/
void lcd_init(void)
{
lcd_wcom(0x38); //8位數(shù)據(jù),雙列,5*7字形
lcd_wcom(0x0c); //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
lcd_wcom(0x06); //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位
lcd_wcom(0x01); //清屏
}
3、按鍵程序
void keyscan() //按鍵掃描
{
if(K1==0) //功能鍵
{
delayms(5);
if(K1==0)
{
keyflag_1++; //鍵一按下,標(biāo)志位加1
if(keyflag_1>3) keyflag_1=0;
lcd_init();
if( keyflag_1==0)
{
DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內(nèi)容
DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內(nèi)容
}
if( keyflag_1==1)
{
DisplayListChar(0, 0, " SET TEMP HIGH");
}
if( keyflag_1==2)
{
DisplayListChar(0, 0, " SET TEMP LOW");
}
while(!K1);
}
}
if(keyflag_1!=0)
{
if(K2==0) //限值加鍵
{
delayms(5); //按鍵消除抖動(dòng)判斷
if(K2==0)
{
if(keyflag_1==1) //進(jìn)入設(shè)置模式
{
max++;
if(max==100) max=0;
}
if(keyflag_1==2) //進(jìn)入設(shè)置模式
{
min++;
if(min==100) min=0;
}
while(!K2); //松手檢測
}
}
if(K3==0) //限值減鍵
{
delayms(5); //按鍵消除抖動(dòng)判斷
if(K3==0)
{
if(keyflag_1==1) //進(jìn)入設(shè)置模式
{
max--;
if(max==0) max=99;
}
if(keyflag_1==2) //進(jìn)入設(shè)置模式
{
min--;
if(min==0) min=99;
}
while(!K3); //松手檢測
}
}
}
}
/***
4、核心算法程序
int main(void)
{
uint count=0;
uint16 TempPhoto;
uint8 strPhoto[6];
uint wendu=0;
P3M0 = 0x00;
P3M1 = 0x00;
lcd_init(); //LCD1602初始化
delay_ms(10); //初始化后延時(shí)
DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內(nèi)容
DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內(nèi)容
InitADC();
InitUart(); //初始化串口
Init_DS18B20();
while (1)
{
keyscan();
if(keyflag_1==0)
{
count++;
if(count>10)//讀取溫度值
{
wendu=ReadTemperature();
count=0;
}
Disp_Temperature(wendu) ;
memset(strPhoto, 0, sizeof(strPhoto)); //strTemp數(shù)組清零
TempPhoto =GetADCResultint(1); //實(shí)時(shí)讀取P1.1通道的AD轉(zhuǎn)換結(jié)果
TempPhoto=TempPhoto*5.0*20/1023;
strPhoto[0] = TempPhoto/1000+48; //千位
strPhoto[1] = (TempPhoto%1000)/100+48; //百位
strPhoto[2] = (TempPhoto%1000)%100/10+48; //十位
strPhoto[3] = (TempPhoto%10)+48; //個(gè)位
//在LCD1602上顯示
DisplayOneChar(6, 0, strPhoto[0]); //在LCD1602屏第二行顯示千位值
DisplayOneChar(7,0, strPhoto[1]); //在LCD1602屏第二行顯示百位值
DisplayOneChar(8, 0, strPhoto[2]); //在LCD1602屏第二行顯示十位值
DisplayOneChar(9, 0, strPhoto[3]); //在LCD1602屏第二行顯示個(gè)位值
DisplayOneChar(10,0,'l');
DisplayOneChar(11,0,'u');
DisplayOneChar(12,0,'x');
}
if(keyflag_1==1)
{
DisplayOneChar(6, 1, max/100+0x30); //在LCD1602屏第二行顯示百位值
DisplayOneChar(7,1, max%100/10+0x30); //在LCD1602屏第二行顯示十位值
DisplayOneChar(8, 1, max%10+0x30); //在LCD1602屏第二行顯示個(gè)位值
}
if(keyflag_1==2)
{
DisplayOneChar(6, 1, min/100+0x30); //在LCD1602屏第二行顯示百位值
DisplayOneChar(7,1, min%100/10+0x30); //在LCD1602屏第二行顯示十位值
DisplayOneChar(8, 1, min%10+0x30); //在LCD1602屏第二行顯示個(gè)位值
}
SendString("guangz:");
SendData( strPhoto[0]);//顯示濕度值
SendData( strPhoto[1]);
SendData( strPhoto[2]);
SendData( strPhoto[3]);
SendData( 'l');
SendData( 'u');
SendData( 'x');
SendData( 0x0d);
SendData( 0x0a);
}
}
四、 proteus仿真設(shè)計(jì)
Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒有硬件平臺(tái)的基礎(chǔ)上通過自身的軟件仿真出硬件平臺(tái)的運(yùn)行情況,這樣就可以通過軟件仿真來驗(yàn)證我們設(shè)計(jì)的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達(dá)到我們設(shè)定的目的,避免我們搭建實(shí)物的時(shí)候,如果當(dāng)初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會(huì)浪費(fèi)人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個(gè)問題,我們在設(shè)計(jì)之初,就使用該軟件進(jìn)行模擬仿真,測試,選擇滿足我們設(shè)計(jì)的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實(shí)物,調(diào)試,最終完成本設(shè)計(jì)的作品。
3.jpg (57.95 KB, 下載次數(shù): 24)
下載附件
2023-11-5 16:36 上傳
作者: bobo電子愛好者 時(shí)間: 2023-11-6 07:45
仿真資料,代碼附件上傳下呀
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |