欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
請問一下protues模擬ds18b20顯示總是是15.93是什么原因呢
[打印本頁]
作者:
jinzhijie
時間:
2021-10-1 19:11
標題:
請問一下protues模擬ds18b20顯示總是是15.93是什么原因呢
1.png
(117.39 KB, 下載次數: 39)
下載附件
2021-10-1 19:15 上傳
#include"reg52.h"
#include"myled.h"
#include"ds18b20.h"
#include"delay.h"
#include"lcd1602.h"
#include"stdio.h"
//#include "temp.h"
void Timer0_Init(void);
unsigned char menuflag,ds18b20_timer;
unsigned char timer_us;
unsigned int timer_ms;
unsigned int timer_xs;
void main()
{
unsigned int ack;
int ds18b20_temp;//用來接收數據
int inttemp,dectemp;//保存分離溫度inttemp整數部分和dectemp小數部分
unsigned char str[12];//用來保存數據轉換成的字符串ascll碼
unsigned char len;
Timer0_Init();
lcd1602_init();
delay1ms(10);
EA = 1;
while (1)
{
if(menuflag)
{
// inttemp = 6;
// ack = ds18b20_giveOrder(inttemp);
// lcd1602set_position(0,1);
// lcd1602_write_dat(ack + '0');
ack = ds18b20_giveOrder(0);
if(ack)
{
inttemp = ack>>4;//保留整數部分,即去高4位
dectemp = ack&0x0f;//取小數部分,就是低4位
len = lcd1602_integertostr(inttemp,str);//len就是inttemp的長度,這個函數就是計算長度的
str[len++] = '.';
dectemp = (dectemp*100)/16; //*0.0625
str[len++] = dectemp/10+'0'; //
str[len++] = dectemp%10+'0'; //
str[len] = '\0'; //結束符
while(len < 6)
{
str[len++] = ' ';//空格填滿
}
lcd1602_shwo_str(0,0,str);
}
// led_display(timer_ms);
}
}
}
void Timer0_Init(void) //10微秒@12.000MHz
{
// AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x88; //設置定時初始值
TH0 = 0xFF; //設置定時初始值
TF0 = 0; //清除TF0標志
ET0 = 1;
TR0 = 1; //定時器0開始計時
}
void timer0_isr() interrupt 1
{
TR0 = 0;
ds18b20_timer = 1;
if(ds18b20_timer == 1)
{
timer_us++;
if(timer_us >= 10)
{
timer_us = 0;
timer_ms++;
if(timer_ms >= 500)
{
timer_ms = 0;
menuflag = ~menuflag;
timer_xs++;
if(timer_xs >= 1000)
{
}
}
}
}
TL0 = 0x88; //設置定時初始值
TH0 = 0xFF; //設置定時初始值
TR0 = 1;
}
#include"ds18b20.h"
#include"intrins.h"
void delay_us(uchar us)//約2us延時函數
{
while(--us);
}
/*******************************************************************************
* 函 數 名 : Ds18b20ReadByte
* 函數功能 : 讀取一個字節
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
unsigned char ds18b20_readbyte()
{
uchar i,dat;
for(i=0;i<8;i++)
{
ds18b20=0;
dat>>=1;
ds18b20=1;
if(ds18b20)
dat|=0x80;
delay_us(25);
}
return (dat);
}
/*******************************************************************************
* 函 數 名 : ds18b20_wretebyte
* 函數功能 : 向18B20寫入一個字節
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void ds18b20_writebyte(unsigned char dat)
{
uchar i;
for(i=0;i<8;i++)
{
ds18b20=0;
ds18b20=dat&0x01;
delay_us(25);//延時
ds18b20=1;//釋放總線準備下一次數據的寫入
dat>>=1;
}
}
bit ds18b20_init()
{
bit i;
ds18b20=1;
delay_us(5);
ds18b20=0;
delay_us(200);//拉低總線499.45us,總線上的溫度傳感器將會被全部復位
delay_us(200);
ds18b20=1;//釋放總線
delay_us(50);//延時37.95us,等待溫度傳感器發回存在信號
i=ds18b20;
delay_us(25);//延時141.95us,讀取溫度傳感器存在的時間
return (i);
}
unsigned int ds18b20_giveOrder(u16 dat)//下達指令
{
unsigned int mynum;
unsigned char msb,lsb;
//初始化ds18b20
if(dat==0)
{
ds18b20_init();
ds18b20_writebyte(0xcc); //跳過ROM操作命令
ds18b20_writebyte(0x44); //發送溫度轉換
delay1ms(5);
ds18b20_init();
ds18b20_writebyte(0xcc); //跳過ROM操作命令
ds18b20_writebyte(0xbe); //發送讀取溫度命令
lsb = ds18b20_readbyte();
msb = ds18b20_readbyte();
msb<<=8;
mynum = ((int)msb<<8)+lsb;
}
return mynum;
}
#ifndef _DS18B20_H_
#define _DS18B20_H_
#include"reg52.h"
#include"delay.h"
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef u16
#define u16 unsigned char
#endif
sbit ds18b20 = P3^7;
unsigned int ds18b20_giveOrder(u16 dat1);//下達指令
#endif
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include"reg52.h"
#include"delay.h"
#define lcd1602_dat P0
//#define LCD1602_4PINS
sbit lcd1602_rs = P2^0;
sbit lcd1602_rw = P2^1;
sbit lcd1602_en = P2^2;
void lcd1602_readbf();
void lcd1602_init();
void lcd1602_write_cmd(unsigned char cmd);
void lcd1602_write_dat(unsigned char dat);
void lcd1602_shwo_str(unsigned char x,unsigned char y,unsigned char *str);
unsigned char lcd1602_integertostr(long dat,unsigned char *str);
void lcd1602set_position(unsigned char x,unsigned char y);
#endif
#include"lcd1602.h"
#ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時
void lcd1602_readbf()//讀lcd忙函數
{
unsigned char state;
unsigned char i;
lcd1602_dat= 0xff;//IO 口置1 做輸入
lcd1602_dat |= 0xf0;//接四路高四位 口置1 做輸入
lcd1602_rs = 0;
lcd1602_rw = 1;
do
{
lcd1602_en = 1;
state = lcd1602_dat;//一個脈沖只接四位 第一次為高四位
lcd1602_en = 0;
i++; //lcd1602_dat就是p0總io口
if(i>50)
break;
}
while(state & 0x80);
}
#else
void lcd1602_readbf()//讀lcd忙函數
{
unsigned char state;
unsigned char i;
// lcd1602_dat= 0xff;//IO 口置1 做輸入
//1602必須要接高四位
lcd1602_dat |= 0xf0;//接四路高四位 口置1 做輸入
lcd1602_rs = 0;
lcd1602_rw = 1;
do
{
lcd1602_en = 1;
state = lcd1602_dat;//一個脈沖只接四位 第一次為高四位
lcd1602_en = 0;
delay1ms(1); //lcd1602_dat就是p0總io口
lcd1602_en = 1;
state |= lcd1602_dat; //再次發送 得到低四位
lcd1602_en = 0;
i++;
if(i>50)
break;
}
while(state & 0x80);
}
#endif
#ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時
void lcd1602_write_cmd(unsigned char cmd)
{
lcd1602_readbf();//忙檢測
lcd1602_rs = 0;//函數
lcd1602_rw = 0;//寫
lcd1602_dat= cmd;//lcd1602_dat就是p0總io口
delay1ms(1);
lcd1602_en = 1;
lcd1602_en = 0;
}
#else
void lcd1602_write_cmd(unsigned char cmd)
{
lcd1602_readbf();//忙檢測
lcd1602_rs = 0;//函數
lcd1602_rw = 0;//寫
lcd1602_dat= cmd;//高四位不需要處理,因為接的是高四位
delay1ms(5);
lcd1602_en = 1;
delay1ms(1);
lcd1602_en = 0;
lcd1602_dat = cmd << 4;
delay1ms(5);
lcd1602_en = 1;
delay1ms(1);
lcd1602_en = 0;
}
#endif
#ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時
void lcd1602_write_dat(unsigned char dat)
{
lcd1602_readbf();//忙檢測
lcd1602_rs = 1;//數據
lcd1602_rw = 0;//寫
lcd1602_dat= dat;//高四位不需要處理,因為接的是高四位
delay1ms(1);
lcd1602_en = 1;
lcd1602_en = 0;
}
#else
void lcd1602_write_dat(unsigned char dat)
{
lcd1602_readbf();//忙檢測
lcd1602_rs = 1;//數據
lcd1602_rw = 0;//寫
lcd1602_dat= dat;//高四位不需要處理,因為接的是高四位
delay1ms(5);
lcd1602_en = 1; //lcd1602_dat就是p0總io口
delay1ms(1);
lcd1602_en = 0;
lcd1602_dat = dat << 4;//低四位需要左移 因為接的是高四位所以數據需要左移
delay1ms(5);
lcd1602_en = 1;
delay1ms(1);
lcd1602_en = 0;
}
#endif
#ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時
void lcd1602_init()
{
lcd1602_write_cmd(0x02);//歸位就是復位
lcd1602_write_cmd(0x06);//進入設置模式
lcd1602_write_cmd(0x0c);//顯示開
lcd1602_write_cmd(0x38);//8位8位數據口,兩行,5*8點陣
lcd1602_write_cmd(0x01);//清屏
}
#else
void lcd1602_init()
{
lcd1602_write_cmd(0x02);//歸位就是復位
lcd1602_write_cmd(0x06);//進入設置模式
lcd1602_write_cmd(0x0c);//顯示開
// lcd1602_write_cmd(0x38);//8位8位數據口,兩行,5*8點陣
lcd1602_write_cmd(0x33);
delay1ms(5);
lcd1602_write_cmd(0x32);
lcd1602_write_cmd(0x28);//4位8位數據口,兩行,5*8點陣
lcd1602_write_cmd(0x01);//清屏
}
#endif
void lcd1602_shwo_str(unsigned char x,unsigned char y,unsigned char *str)//定位加*str指針方式發送字符串
{
lcd1602_write_cmd(0x38);
if(y == 0)
{
lcd1602_write_cmd(0x80 + x);
}else{
lcd1602_write_cmd(0xc0 + x);
}
while(*str != '\0')// '\0'這個是結束符的意思
{
lcd1602_write_dat(*str++);
}
}
unsigned char lcd1602_integertostr(long dat,unsigned char *str)
{
unsigned int i = 0;
unsigned char len = 0;
unsigned char buf[11];
if(dat < 0)
{
dat = -dat;//如果是負數,取絕對值
*str++ = '-';
len++;
// dat = Numerical_conversion(dat);
for(i=0;dat>9; i++)
{
buf[i] = dat%10; //先遇10取余
dat /=10;
len++;
}
*str++ = dat%10 + '0'; //轉換ascll碼 + '0'或者*0x30
len++;
for(i=len;i>2;i--)
{
*str++ = buf[i-3] + '0';
}
*str = '\0';
}
if(dat > 0)
{
for(i=0;dat>9; i++)
{
buf[i] = dat%10; //先遇10取余
dat /=10;
len++;
}
*str++ = dat%10 + '0'; //轉換ascll碼 + '0'或者*0x30
len++;
for(i=len;i>1;i--)
{
*str++ = buf[i-2] + '0';
}
*str = '\0';
}
return len;
}
復制代碼
作者:
wulin
時間:
2021-10-1 20:42
給你一個示例對照查找問題。
ds18b20 0~120度PWM恒溫控制LCD顯示 仿真.zip
(161.62 KB, 下載次數: 17)
2021-10-1 20:42 上傳
點擊文件名下載附件
作者:
gqzjl
時間:
2021-10-4 09:11
延時要長點
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1