欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
DS18B20測(cè)溫?cái)?shù)碼管顯示并保存數(shù)據(jù)到AT24C02
[打印本頁(yè)]
作者:
jkla
時(shí)間:
2020-4-12 12:46
標(biāo)題:
DS18B20測(cè)溫?cái)?shù)碼管顯示并保存數(shù)據(jù)到AT24C02
將測(cè)的溫度通過(guò)IIC總線保存到AT24C02芯片中,同樣也可以讀出來(lái)并在數(shù)碼管上顯示,程序中的串口部分用于切換程序段、向AT24C02寫(xiě)數(shù)據(jù)并提示是否寫(xiě)入成功:
“
返回1:成功,返回0:失敗
”、從AT24C02數(shù)據(jù),并處理顯示在數(shù)碼管上。
單片機(jī)源程序如下:
/*********************************************************************
*程序說(shuō)明:用DS18B20測(cè)溫,用串口發(fā)送響應(yīng)的字符串可實(shí)現(xiàn)將溫度數(shù)據(jù)保存
* 在AT24C02中,同樣也可以讀出來(lái)并顯示在數(shù)碼管上。
*主要程序段:IIC、DS18B20驅(qū)動(dòng)、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讀出來(lái)的溫度
int tp; //保存將要寫(xiě)入AT24C02的溫度
int response; //檢查是否了寫(xiě)入數(shù)據(jù)
sbit LSA = P1^0;
sbit LSB = P1^1;
sbit LSC = P1^2;
void Delay(u16 i)
{
while(i--);
}
/* 定義八個(gè)數(shù)碼管顯示器的位選函數(shù) ,掃描數(shù)碼管 */
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); //改變參數(shù)的值能實(shí)現(xiàn)滾動(dòng)顯示。最大為65535,否則會(huì)溢出。
GPIO_DIG = 0x00; //清空數(shù)碼管,以防止出現(xiàn)重影。
}
}
//將讀出來(lái)的溫度數(shù)據(jù)進(jìn)行處理
void DataPros(int temp)
{
float temperature;
if(temp < 0)
{
display[0] = 0x40; //顯示負(fù)號(hào)
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': //測(cè)溫
DataPros(Ds18b20ReadTemp());
Digdisplay();
break;
case '2': //將測(cè)溫?cái)?shù)據(jù)保存在AT24c02第1個(gè)地址中
DataPros(0x00); //保存數(shù)據(jù)時(shí),讓數(shù)碼管顯示零
Digdisplay();
tp = Ds18b20ReadTemp();
response = At24C02WriteByte(1,tp);//檢查數(shù)據(jù)是否寫(xiě)入,返回1:成功 返回0:失敗
break;
case '3': //讀出AT24c02第1個(gè)地址中的溫度數(shù)據(jù)并顯示
Read_tp = At24C02ReadByte(1);
DataPros(Read_tp);
Digdisplay();
break;
case '4': //將測(cè)溫?cái)?shù)據(jù)保存在AT24c02第2個(gè)地址中
DataPros(0x00);
Digdisplay();
tp = Ds18b20ReadTemp();
response = At24C02WriteByte(2,tp);
break;
case '5': //讀出AT24c02第2個(gè)地址中的溫度數(shù)據(jù)并顯示
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;
}
復(fù)制代碼
所有資料51hei提供下載:
DS18B20溫度傳感器.rar
(42.31 KB, 下載次數(shù): 50)
2020-4-12 12:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
jkla
時(shí)間:
2020-4-12 14:54
由于AT24C02一個(gè)地址只能存一個(gè)字節(jié)的數(shù)據(jù),DS18B20讀出的數(shù)據(jù)是兩個(gè)字節(jié),所以當(dāng)所測(cè)溫度到16時(shí),存入AT24C02的數(shù)據(jù)就會(huì)溢出,解決辦法是:將溫度數(shù)據(jù)高八位取出來(lái),低八位取出來(lái),分別存入AT24C02的兩個(gè)地址中,讀出的時(shí)候分別讀出兩個(gè)地址的溫度數(shù)據(jù),再進(jìn)行重組,送入數(shù)據(jù)處理函數(shù)以便進(jìn)行顯示。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1