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