將測的溫度通過IIC總線保存到AT24C02芯片中,同樣也可以讀出來并在數碼管上顯示,程序中的串口部分用于切換程序段、向AT24C02寫數據并提示是否寫入成功:“返回1:成功,返回0:失敗”、從AT24C02數據,并處理顯示在數碼管上。
單片機源程序如下:
- /*********************************************************************
- *程序說明:用DS18B20測溫,用串口發送響應的字符串可實現將溫度數據保存
- * 在AT24C02中,同樣也可以讀出來并顯示在數碼管上。
- *主要程序段:IIC、DS18B20驅動、Usart
- *********************************************************************/
- #include "REG52.H"
- #include "DS18B20.h"
- #include "I2C.h"
- #include "Usart.h"
- #define GPIO_DIG P0
- typedef unsigned int u16;
- typedef unsigned char u8;
- u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
- 0x7c,0x39,0x5e,0x79,0x71};
- u8 display[6];
- u8 data_r;
- int Read_tp; //保存從AT24C02讀出來的溫度
- int tp; //保存將要寫入AT24C02的溫度
- int response; //檢查是否了寫入數據
- sbit LSA = P1^0;
- sbit LSB = P1^1;
- sbit LSC = P1^2;
- void Delay(u16 i)
- {
- while(i--);
- }
- /* 定義八個數碼管顯示器的位選函數 ,掃描數碼管 */
- void Digdisplay()
- {
- u8 i;
- for(i = 0; i < 6; i++)
- {
- switch(i)
- {
-
- case (0):
- LSA = 0; LSB = 0; LSC = 0; break; // 000
- case (1):
- LSA = 1; LSB = 0; LSC = 0; break; // 001
- case (2):
- LSA = 0; LSB = 1; LSC = 0; break; // 010
- case (3):
- LSA = 1; LSB = 1; LSC = 0; break; // 011
- case (4):
- LSA = 0; LSB = 0; LSC = 1; break; // 100
- case (5):
- LSA = 1; LSB = 0; LSC = 1; break; // 101
- }
- GPIO_DIG = display[i];
- Delay(80); //改變參數的值能實現滾動顯示。最大為65535,否則會溢出。
- GPIO_DIG = 0x00; //清空數碼管,以防止出現重影。
- }
- }
- //將讀出來的溫度數據進行處理
- void DataPros(int temp)
- {
- float temperature;
- if(temp < 0)
- {
- display[0] = 0x40; //顯示負號
- temp -= 1;
- temperature = ~temp;
- temp = temperature * 0.0625 * 100;
- }
- else
- {
- display[0] = 0x00;
- temperature = temp;
- temp = temperature * 0.0625 * 100;
- }
- display[1] = smgduan[temp/10000];
- display[2] = smgduan[temp%10000/1000];
- display[3] = smgduan[temp%1000/100]|0x80;
- display[4] = smgduan[temp%100/10];
- display[5] = smgduan[temp%10];
- }
- void main()
- {
- Usart_Init(); //串口初始化
- while(1)
- {
- switch(data_r)
- {
- case '1': //測溫
- DataPros(Ds18b20ReadTemp());
- Digdisplay();
- break;
- case '2': //將測溫數據保存在AT24c02第1個地址中
- DataPros(0x00); //保存數據時,讓數碼管顯示零
- Digdisplay();
- tp = Ds18b20ReadTemp();
- response = At24C02WriteByte(1,tp);//檢查數據是否寫入,返回1:成功 返回0:失敗
- break;
- case '3': //讀出AT24c02第1個地址中的溫度數據并顯示
- Read_tp = At24C02ReadByte(1);
- DataPros(Read_tp);
- Digdisplay();
- break;
- case '4': //將測溫數據保存在AT24c02第2個地址中
- DataPros(0x00);
- Digdisplay();
- tp = Ds18b20ReadTemp();
- response = At24C02WriteByte(2,tp);
- break;
- case '5': //讀出AT24c02第2個地址中的溫度數據并顯示
- Read_tp = At24C02ReadByte(2);
- DataPros(Read_tp);
- Digdisplay();
- break;
- }
- }
- }
- void Usart() interrupt 4
- {
- u8 ReceiveData;
- ReceiveData = SBUF;
- data_r = ReceiveData;
- while(!RI);
- RI = 0;
- // SBUF = tp;
- // while(!TI);
- // TI = 0;
-
- SBUF = response;
- while(!TI);
- TI = 0;
- }
復制代碼
所有資料51hei提供下載:
DS18B20溫度傳感器.rar
(42.31 KB, 下載次數: 50)
2020-4-12 12:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|