亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
LCD一直顯示溫度為0
[打印本頁]
作者:
零點一
時間:
2025-2-18 13:29
標題:
LCD一直顯示溫度為0
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
// 定義 LM016L 引腳
sbit RS = P2^3;
sbit RW = P2^2;
sbit EN = P2^1;
// 定義 DS18B20 引腳
sbit DQ = P1^4;
// 定義心率引腳
sbit HeartRateSensor = P3^2;
#define LCD_DATA P0
// 函數聲明
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void lcd_init();
void lcd_command(unsigned char cmd);
void lcd_data(unsigned char dat);
void lcd_string(const char *str);
void display_heart_rate(unsigned int heart_rate);
void display_temperature(float temperature);
// DS18B20 相關函數聲明
bit ds18b20_reset(void);
void ds18b20_write_byte(unsigned char dat);
unsigned char ds18b20_read_byte(void);
float ds18b20_read_temp(void);
// 聲明 str 數組為全局變量
static unsigned char str[10];
// 全局變量用于心率計算
unsigned int pulse_count = 0;
unsigned int prev_pulse_count = 0;
unsigned int heart_rate = 0;
// 定時器 1 初始化函數,用于精確延時
void timer1_init() {
TMOD |= 0x10; // 定時器 1 工作在模式 1
TR1 = 0; // 先停止定時器 1
}
//精確的微秒延時函數
void delay_us(unsigned int us) {
while(us--) {
_nop_(); // 一個 _nop_() 指令大約 1 微秒(12MHz 晶振)
_nop_();
_nop_();
_nop_();
}
}
// 精確的毫秒延時函數,使用定時器 1
void delay_ms(unsigned int ms) {
while (ms--) {
delay_us(1000);
TR1=1;
}
}
// 初始化 LCD
void lcd_init() {
delay_ms(15);
lcd_command(0x38); // 設置 16x2 顯示,5x7 點陣,8 位數據
delay_ms(5);
lcd_command(0x38);
delay_ms(5);
lcd_command(0x38);
lcd_command(0x0C); // 打開顯示,關閉光標
lcd_command(0x06); // 光標右移,字符不移動
lcd_command(0x01); // 清屏
delay_ms(5);
}
// 發送 LCD 命令
void lcd_command(unsigned char cmd) {
RS = 0;
RW = 0;
LCD_DATA = cmd;
EN = 1;
_nop_();
EN = 0;
delay_ms(1);
}
// 發送 LCD 數據
void lcd_data(unsigned char dat) {
RS = 1;
RW = 0;
LCD_DATA = dat;
EN = 1;
_nop_();
EN = 0;
delay_ms(1);
}
// 發送字符串到 LCD
void lcd_string(const char *str) {
while (*str) {
lcd_data(*str++);
}
}
// 顯示心率
void display_heart_rate(unsigned int heart_rate) {
lcd_command(0x87); // 設置顯示位置
sprintf(str, "%d bpm", heart_rate);
lcd_string(str);
}
// 顯示溫度
void display_temperature(float temperature) {
lcd_command(0xC7); // 設置顯示位置
if (temperature == -1) {
sprintf(str, "Err");
} else {
sprintf(str, "%.1f C", temperature);
}
lcd_string((const char *)str);
}
// 修改復位函數使用精確延時
bit ds18b20_reset(void) {
bit presence;
DQ = 0;
delay_us(480); // 拉低至少 480us
DQ = 1;
delay_us(60); // 等待 15 - 60us
presence = !DQ;
delay_us(420); // 等待 480 - 960us
return presence;
}
// 向 DS18B20 寫一個字節
void ds18b20_write_byte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay_us(60); // 使用精確延時函數
DQ = 1;
dat >>= 1;
}
}
// 從 DS18B20 讀一個字節
unsigned char ds18b20_read_byte(void) {
unsigned char i, dat = 0;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = 1;
_nop_();
if (DQ) {
dat |= (1 << i);
}
delay_us(60); // 使用精確延時函數
}
return dat;
}
// 讀取 DS18B20 的溫度值
float ds18b20_read_temp(void) {
unsigned char low_byte, high_byte;
int temp_value;
float temperature;
int retry = 3; // 重試次數
int reset_failure_count = 0;
while (retry--) {
if (ds18b20_reset()) {
reset_failure_count++;
continue; // 復位失敗,重試
}
ds18b20_write_byte(0xCC); // 跳過 ROM 操作
ds18b20_write_byte(0x44); // 啟動溫度轉換
delay_ms(750); // 等待轉換完成
low_byte = ds18b20_read_byte();
high_byte = ds18b20_read_byte();
temp_value = (high_byte << 8) | low_byte;
temperature = (float)temp_value * 0.0625;
return temperature;
}
}
// 外部中斷 0 服務函數,用于檢測心率脈沖
void External0_ISR() interrupt 0 {
pulse_count++;
}
// 主程序
void main() {
float temperature = 0.0;
unsigned int time_count = 0;
timer1_init(); // 修正拼寫錯誤,正確調用定時器初始化函數
// 初始化 LCD
lcd_init();
lcd_string("Heart: ");
lcd_command(0xC0); // 第二行
lcd_string("Temp: ");
// 初始化外部中斷 0
IT0 = 1; // 下降沿觸發
EX0 = 1; // 使能外部中斷 0
EA = 1; // 使能全局中斷
while(1) {
// 每 1 秒計算一次心率
delay_ms(1000);
time_count++;
if (time_count >= 1) {
heart_rate = pulse_count - prev_pulse_count;
prev_pulse_count = pulse_count;
display_heart_rate(heart_rate);
time_count = 0;
}
// 獲取溫度
temperature = ds18b20_read_temp();
display_temperature(temperature);
delay_ms(1000);
}
}
lcd上一直顯示溫度為0
求大佬解決一下,幫一下感謝
作者:
WL0123
時間:
2025-2-18 21:21
不要把delay當萬精油,超過1ms慎用!
作者:
WL0123
時間:
2025-2-19 14:34
溫度讀取異常主要還是時序問題,心率采樣和計算也不對。給你改了,仿真無誤。
無標題.jpg
(166.02 KB, 下載次數: 0)
下載附件
2025-2-19 14:32 上傳
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define DASE 60000
// 定義 LM016L 引腳
sbit RS = P2^3;
sbit RW = P2^2;
sbit EN = P2^1;
// 定義 DS18B20 引腳
sbit DQ = P1^4;
// 定義心率引腳
sbit HeartRateSensor = P3^2;
#define LCD_DATA P0
// 函數聲明
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void lcd_init();
void lcd_command(unsigned char cmd);
void lcd_data(unsigned char dat);
void lcd_string(const char *str);
void display_heart_rate(unsigned int heart_rate);
void display_temperature(float temperature);
// DS18B20 相關函數聲明
bit ds18b20_reset(void);
void ds18b20_write_byte(unsigned char dat);
unsigned char ds18b20_read_byte(void);
float ds18b20_read_temp(void);
uint D_num; //定時器中斷計數變量
// 聲明 str 數組為全局變量
static unsigned char str[10];
// 全局變量用于心率計算
unsigned int pulse_count = 0;
unsigned int prev_pulse_count = 0;
unsigned int heart_rate = 0;
uint temp; //臨時變量
uint count;//計數
float tempF;
bit flag_S=0;
// 定時器0初始化函數
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay_ms(unsigned int ms)//@12MHz
{
unsigned i,j;
for(i=ms;i>0;i--)
for(j=120;j>0;j--);
}
// 初始化 LCD
void lcd_init()
{
delay_ms(15);
lcd_command(0x38); // 設置 16x2 顯示,5x7 點陣,8 位數據
delay_ms(5);
lcd_command(0x38);
delay_ms(5);
lcd_command(0x38);
lcd_command(0x0C); // 打開顯示,關閉光標
lcd_command(0x06); // 光標右移,字符不移動
lcd_command(0x01); // 清屏
delay_ms(5);
}
// 發送 LCD 命令
void lcd_command(unsigned char cmd)
{
RS = 0;
RW = 0;
LCD_DATA = cmd;
delay_ms(1);
EN = 1;
_nop_();
EN = 0;
}
// 發送 LCD 數據
void lcd_data(unsigned char dat)
{
RS = 1;
RW = 0;
LCD_DATA = dat;
delay_ms(1);
EN = 1;
_nop_();
EN = 0;
}
// 發送字符串到 LCD
void lcd_string(const char *str)
{
while (*str)
{
lcd_data(*str++);
}
}
// 顯示心率
void display_heart_rate(unsigned int heart_rate)
{
lcd_command(0x87); // 設置顯示位置
sprintf(str, "%d bpm ", heart_rate);
lcd_string(str);
}
// 顯示溫度
void display_temperature(float temperature)
{
lcd_command(0xC7); // 設置顯示位置
if (temperature == -1)
{
sprintf(str, "Err");
}
else
{
sprintf(str, "%.1f C", temperature);
}
lcd_string((const char *)str);
}
/*
// 修改復位函數使用精確延時
bit ds18b20_reset(void)
{
bit presence;
DQ = 0;
delay_us(480); // 拉低至少 480us
DQ = 1;
delay_us(60); // 等待 15 - 60us
presence = !DQ;
delay_us(420); // 等待 480 - 960us
return presence;
}
// 向 DS18B20 寫一個字節
void ds18b20_write_byte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay_us(60); // 使用精確延時函數
DQ = 1;
dat >>= 1;
}
}
// 從 DS18B20 讀一個字節
unsigned char ds18b20_read_byte(void)
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
DQ = 1;
_nop_();
if (DQ)
{
dat |= (1 << i);
}
delay_us(60); // 使用精確延時函數
}
return dat;
}
// 讀取 DS18B20 的溫度值
float ds18b20_read_temp(void)
{
unsigned char low_byte, high_byte;
int temp_value;
float temperature;
int retry = 3; // 重試次數
int reset_failure_count = 0;
while (retry--)
{
if (ds18b20_reset())
{
reset_failure_count++;
continue; // 復位失敗,重試
}
ds18b20_write_byte(0xCC); // 跳過 ROM 操作
ds18b20_write_byte(0x44); // 啟動溫度轉換
delay_ms(750); // 等待轉換完成
low_byte = ds18b20_read_byte();
high_byte = ds18b20_read_byte();
temp_value = (high_byte << 8) | low_byte;
temperature = (float)temp_value * 0.0625;
return temperature;
}
}*/
void delay(uint t)//@12T 1us
{
while(t--);
}
void Init_DS18b20()//18b20初始化函數
{
DQ = 1; //DQ復位
delay(8);
DQ=0; //釋放DQ
delay(80); //DS18B20收到信號后延時
DQ=1; //讀取DQ
delay(30);
}
void write_byte(uchar dat)//寫時序
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;//寫1,在15微秒內拉低
delay(5);//寫0,拉低60微秒
DQ=1;
dat>>=1;
}
delay(4);
}
uchar read_byte()//讀時序
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;//拉低ds18b20單總線
dat>>=1;
DQ=1;//15微秒內拉釋放總線
if(DQ)
dat|=0x80;
delay(4);
}
return (dat);
}
//void Read_Temperature()//讀取溫度函數
float ds18b20_read_temp(void)
{
Init_DS18b20(); //初始化18b20
write_byte(0xcc);//跳過讀寫序列號
write_byte(0x44);//啟動溫度轉換
Init_DS18b20(); //初始化18b20
write_byte(0xCC);//跳過讀寫序列號
write_byte(0xBE);//讀溫度寄存器
temp=read_byte();//讀取溫度低8位
temp=read_byte()<<8|temp;//讀取溫度高8位
tempF=temp*0.0625;
return tempF;
}
void Timer0Interrupt() interrupt 1
{
static uint i;
TH0 = 0xFC;
TL0 = 0x18;
count++;
i++;
if(i>=500) //0.5秒
{
i=0;
flag_S=1; //0.5秒標志
}
}
// 外部中斷 0 服務函數,用于檢測心率脈沖
void External0_ISR() interrupt 0
{
TR0=0; //關定時器0
D_num=count; //讀取定時器1ms中斷計數值
count=0; //定時器1ms中斷計數值清0
TH0 = 0xFC;
TL0 = 0x18;
TR0=1; //開定時器0
}
// 主程序
void main()
{
float temperature = 0.0;
unsigned int time_count = 0;
// 初始化 LCD
lcd_init();
lcd_string("Heart: ");
lcd_command(0xC0); // 第二行
lcd_string("Temp: ");
InitTimer0();
// 初始化外部中斷 0
IT0 = 1; // 下降沿觸發
EX0 = 1; // 使能外部中斷 0
EA = 1; // 使能全局中斷
IE0 = 0; //INT0中斷請求標志清0
while(1)
{
if(flag_S)//0.5秒
{
flag_S=0;
heart_rate = DASE/D_num; //計算心率
display_heart_rate(heart_rate);
// 獲取溫度
temperature = ds18b20_read_temp();
display_temperature(temperature);
}
}
}
復制代碼
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1