|
1.png (10.58 KB, 下載次數(shù): 56)
下載附件
2022-5-10 16:25 上傳
單片機(jī)源程序如下:
- /*
- **********************************************************************
- * 頭文件包含
- **********************************************************************
- */
- #include "ds18b20.h"
- /*
- **********************************************************************
- * 本地宏定義
- **********************************************************************
- */
- #define MATRIX_PORT P0 // 點(diǎn)陣LED負(fù)極端口
- /*
- **********************************************************************
- * 本地全局變量
- **********************************************************************
- */
- sbit M1 = P1^0; // M1接在P1.0
-
- sbit gBuz = P1^5; // P1.5通過(guò)ULN2003放大功率后驅(qū)動(dòng)BUZZER
- sbit SCK = P3^6; // SCK上升沿移位
- sbit RCK = P3^5; // RCK上升沿串行輸出寄存器鎖存
- sbit SER = P3^4; // SER引腳送字節(jié)數(shù)據(jù)進(jìn)去
- code u8 init_1_8266[] ="AT+CIPMUX=1\r\n";//設(shè)置8266為多連接模式(建立TCP server的前提)
- code u8 init_2_8266[] ="AT+CIPSERVER=1\r\n";//建立 TCP server
- code u8 init_3_8266[] ="AT+CIPSEND=0,5\r\n";//8266朝手機(jī)發(fā)送多少字節(jié)
- u8 flag = 0;//串口接收數(shù)據(jù)標(biāo)志位,當(dāng)8266初始化完后被改寫(xiě)
- u8 Buffer[40] = {0}; //從串口接收的數(shù)據(jù)
- u8 i = 0;//Buffer的index
- // 點(diǎn)陣列選值,數(shù)組每個(gè)元素的值選中其中一列
- code u8 gLineCode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- code u8 gZhu[] = {0x73,0xD6,0x58,0xFF,0x58,0x54,0x52,0x12}; // 漢字 朱
-
- /*
- **********************************************************************
- * 函數(shù)原型聲明
- **********************************************************************
- */
- void delay1ms(u16 i);
- void Hc595SendByte(u8 dat);
- void MatrixDisplay(u8 *zimo);
- void UartInit(void);
- void BuzzerOnOff(void);
- void UartSendBytes(u8 *c);
- u16 TempDisplayTest(void);
- void main()
- {
- u16 temp = 0;
- u8 temps[6] = {0};
- temps[2] = '.';
- M1 = 0;
- UartInit();//串口初始化
- delay1ms(1000);
-
- UartSendBytes(init_1_8266);//設(shè)置8266為多連接模式(建立TCP server的前提)
- delay1ms(1000);
- UartSendBytes(init_2_8266);//建立 TCP server
- delay1ms(1000);
- P2 = 0x55;//表示可以wifi連接8266了
- flag = 1;//開(kāi)啟串口接收數(shù)據(jù)
- while (1)
- {
- switch (Buffer[9]) //根據(jù)手機(jī)輸入的鍵值不同,執(zhí)行不同的內(nèi)容
- {
- case '1':
- P2 = 0x0;//點(diǎn)亮所有燈
- break;
- case '2':
- P2 = 0xff;//熄滅所有燈
- break;
- case '3':
- M1 = 1;//馬達(dá)轉(zhuǎn)
- break;
- case '4':
- M1 = 0;//馬達(dá)停
- break;
- case '5':
- BuzzerOnOff();//蜂鳴器叫
- break;
- case '6':
- //蜂鳴器靜
- break;
- case '7':
- MatrixDisplay(gZhu);//點(diǎn)陣亮
- break;
- case '8':
- //點(diǎn)陣滅
- break;
- case '9'://發(fā)送18b20溫度
- temp = TempDisplayTest();
- temps[0] = temp /1000 + '0';
- temp %= 1000;
- temps[1] = temp/100 + '0';
- temp %= 100;
- temps[3] = temp/10 + '0';
- temp %= 10;
- temps[4] = temp + '0';
- UartSendBytes(init_3_8266);//確定發(fā)送數(shù)據(jù)長(zhǎng)度(5個(gè)字節(jié))
- delay1ms(10);
- UartSendBytes(temps);//發(fā)送溫度數(shù)據(jù)
- Buffer[9] = 'x';
- P2 = 0x55;
- break;
- default:
- break;
- }
- }
- }
- /********************************************************************
- * 名稱 : Delay_1ms()
- * 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
- * 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
- * 輸出 : 無(wú)
- ***********************************************************************/
- void delay1ms(u16 i) //誤差 0us
- {
- u8 a,b,c;
- for(;i>0;i--)
- for(c=1;c>0;c--)
- for(b=142;b>0;b--)
- for(a=2;a>0;a--);
- }
- /*********************************************************************
- * 函 數(shù) 名 : Hc595SendByte
- * 函數(shù)功能 : 通過(guò)74HC595串行移位發(fā)送一個(gè)字節(jié)出去
- * 參數(shù)列表 : dat - 待發(fā)送的字節(jié)數(shù)據(jù)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void Hc595SendByte(u8 dat)
- {
- u8 i = 0, j = 0;
- SCK = 0; // 將SCK置為初始狀態(tài)
- RCK = 0; // 將RCK置為初始狀態(tài)
- for (i=0; i<8; i++)
- {
- SER = dat & (0x01);
- dat >>= 1;
- SCK = 1;
- j++; // 延時(shí)代碼,等同于nop指令
- j++; // 延時(shí)代碼,等同于nop指令
- SCK = 0;
- }
- RCK = 1;
- j++; // 延時(shí)代碼,等同于nop指令
- j++; // 延時(shí)代碼,等同于nop指令
- }
- /*********************************************************************
- * 函 數(shù) 名 : MatrixDisplay
- * 函數(shù)功能 : 循環(huán)刷新顯示字模到點(diǎn)陣上
- * 參數(shù)列表 : zimo - 待顯示的字模數(shù)組
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void MatrixDisplay(u8 *zimo)
- {
- u8 i = 0;
- u8 j = 0;//gai
- while(1)
- {
- for(i=0;i<8;i++)
- {
- MATRIX_PORT = gLineCode[i]; // 位選
- Hc595SendByte(zimo[i]); // 發(fā)送段選數(shù)據(jù)
- Hc595SendByte(0x00); // 消隱
- }
- j++;//gai
- if(j==200)//gai
- {
- break;
- }
- }
- }
- /********************************************************************
- * 名稱 : UartIsr()
- * 功能 : 串口中斷處理程序
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void UartIsr(void) interrupt 4
- {
- EA = 0;
- if (RI == 1) //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位
- {
- RI = 0;
- if(flag == 1) //初始化完8266后,此處才為真
- {
- Buffer[i] = SBUF;//將接收到的字符放入Buffer
- i++;
- if(SBUF == 0x0a)//遇到換行就回到Buffer的頭部開(kāi)始存
- {
- i = 0;
- }
- }
- }
- EA = 1;
- }
- /********************************************************************
- * 名稱 : UartInit()
- * 功能 : 串口初始化,注意波特率是2400
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void UartInit(void)
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xF3;
- TL1 = TH1;
- PCON = 0x00;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- /*********************************************************************
- * 函 數(shù) 名 : BuzzerOnOff
- * 函數(shù)功能 : 給蜂鳴器開(kāi)關(guān)各一段時(shí)間
- * 參數(shù)列表 : 無(wú)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void BuzzerOnOff(void)
- {
- gBuz = 1;
- delay1ms(1);
- gBuz = 0;
- delay1ms(1);
- }
- /*********************************************************************
- * 函 數(shù) 名 : UartSendBytes
- * 函數(shù)功能 : 通過(guò)串口往外發(fā)送數(shù)據(jù)
- * 參數(shù)列表 : uchar *c,要發(fā)的數(shù)據(jù)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void UartSendBytes(u8 *c)//串口發(fā)送數(shù)據(jù)
- {
- EA = 0;
- while(*c != '\0')
- {
- SBUF = *c;
- while(!TI);
- TI = 0;
- c++;
-
- }
- EA = 1;
- }
- /*********************************************************************
- * 函 數(shù) 名 : TempDisplayTest
- * 函數(shù)功能 : 通過(guò)串口往外發(fā)送數(shù)據(jù)
- * 參數(shù)列表 : 無(wú)
- * 函數(shù)輸出 : u16 tDisp,最終的溫度值
- *********************************************************************/
- u16 TempDisplayTest(void)
- {
- u16 temp = 0; // 用來(lái)暫存12位的AD值
- u8 tmh = 0, tml = 0; // 用來(lái)暫存2個(gè)8位的AD值
- u16 tDisp = 0; // 用來(lái)存儲(chǔ)乘以100倍后的溫度值
- double t = 0; // 用來(lái)存儲(chǔ)轉(zhuǎn)換后以攝氏度為單位的溫度值
- Ds18b20TempConvertCmd(); // 先寫(xiě)入轉(zhuǎn)換命令
- Ds18b20TempReadCmd(); // 然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml = Ds18b20ReadByte(); // 讀取溫度值共16位,先讀低字節(jié)
- tmh = Ds18b20ReadByte(); // 再讀高字節(jié)
- temp = tml | (tmh << 8); // 默認(rèn)是12位分辨率,前面4個(gè)S位是符號(hào)位
-
- // 正溫度時(shí)符號(hào)位為0,下面代碼計(jì)算沒(méi)有考慮負(fù)溫度情況,因?yàn)槲覀儗?shí)驗(yàn)是在
- // 室溫下做的,如果要考慮到負(fù)溫度的情況,代碼中要先判斷S位,若S位為1則
- // 必須點(diǎn)去掉S的1再計(jì)算,計(jì)算后的值加負(fù)號(hào)即可。
- t = temp * 0.0625;
- tDisp = (u16)(t * 100); // 為方便顯示將溫度值乘以100后強(qiáng)轉(zhuǎn)為u16
- return tDisp;
- }
復(fù)制代碼
Keil代碼下載,僅供參考:
25.1.ESP8266 Wifi Test.rar
(20.28 KB, 下載次數(shù): 78)
2022-5-10 16:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|