久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機ds18b20測溫oled顯示程序
[打印本頁]
作者:
孫文超
時間:
2020-12-20 17:00
標題:
單片機ds18b20測溫oled顯示程序
D0 P0.0
D1 P0.1
RES P0.2
DC P0.3
CS P0.4
DS18B20 P0.7
80F86B74AD9ED0C058A20CAC2B3CA4CA.jpg
(218.1 KB, 下載次數: 59)
下載附件
2020-12-20 17:00 上傳
單片機源程序如下:
#include<reg52.h>
#define u8 unsigned char
#define u32 unsigned int
sbit DQ = P0^7;
sbit CS=P0^4; //片選
sbit RST =P0^2;//復位
sbit DC =P0^3;//數據/命令控制
sbit SCL=P0^0;//時鐘 D0(SCLK?
sbit SDIN=P0^1;//D1(MOSI) 數據
u8 TempData[7]; //溫度存儲顯示值
bit ReadTempFlag; //讀時間標志
void WriteOneChar(u8 dat); //寫入DS18B20一個字節
u8 ReadOneChar(void); //讀取DS18B20一個字節
u32 ReadTemperature(void); //讀取DS18B20溫度值
bit Init_DS18B20(void); //初始化DS18B20
void Time0(void); //定時器初始化
void Delay2us(u8 t); //2微秒延時函數
void Delay1ms(u8 t); //1毫秒延時函數
void OLED_Init(); //設置顯示模式
void delay100us(u32 x); //100us延時程序
unsigned char code Hzk[][32]={
{0x10 ,0x22, 0x64 ,0xC ,0x80, 0x0 ,0xFE, 0x92, 0x92, 0x92 ,0x92, 0x92 ,0xFF ,0x2 ,0x0, 0x0 }, /* wen */
{0x4, 0x4, 0xFE, 0x1, 0x40, 0x7E, 0x42 ,0x42 ,0x7E, 0x42, 0x7E, 0x42, 0x42, 0x7E, 0x40, 0x0}, /*1*/
{0x0, 0x0, 0xFC, 0x24 ,0x24, 0x24 ,0xFC ,0xA5 ,0xA6, 0xA4 ,0xFC, 0x24, 0x34, 0x26, 0x4, 0x0}, /* du */
{0x40 ,0x20, 0x9F, 0x80, 0x42, 0x42, 0x26, 0x2A, 0x12, 0x2A, 0x26, 0x42, 0x40, 0xC0, 0x40, 0x0}, /*2*/
{0x0, 0x0 ,0x0 ,0x0, 0x80, 0xC0 ,0xC0, 0x80 ,0x0, 0x0 ,0x0 ,0x0, 0x0, 0x0, 0x0, 0x0}, /* : */
{0x0, 0x0, 0x0, 0x0, 0x31 ,0x7B, 0x7B ,0x31, 0x0 ,0x0, 0x0, 0x0 ,0x0 ,0x0, 0x0, 0x0}, /*3*/
};
unsigned char code Sz[][32]={
{0x0, 0x0 ,0xC0 ,0xE0 ,0xF0 ,0x18 ,0x8, 0x8 ,0x8, 0x8 ,0x8, 0x30, 0xF0, 0xE0, 0xC0, 0x0},
{0x0 ,0x0 ,0x7, 0x1F, 0x1F, 0x30, 0x20 ,0x20, 0x20 ,0x20 ,0x20, 0x38, 0x1F ,0xF ,0x7, 0x0},
{0x0 ,0x0, 0x0 ,0x0 ,0x10, 0x10 ,0x10, 0xF0, 0xF8, 0xF8, 0x0 ,0x0, 0x0, 0x0 ,0x0, 0x0},
{0x0 ,0x0 ,0x0, 0x0, 0x20, 0x20 ,0x20 ,0x3F, 0x3F, 0x3F, 0x20, 0x20, 0x20, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x20, 0x70 ,0x78, 0x8, 0x8 ,0x8, 0x8, 0x8 ,0x8 ,0xD8, 0xF0, 0x70, 0x0 ,0x0},
{0x0 ,0x0 ,0x30 ,0x30, 0x28 ,0x28 ,0x24 ,0x24, 0x22, 0x22, 0x21, 0x21, 0x30, 0x38, 0x0, 0x0},
{0x0, 0x0, 0x20, 0x30, 0x38, 0x0, 0x8 ,0x8, 0x8, 0x88, 0x88, 0xF8, 0x70, 0x20, 0x0 ,0x0},
{0x0, 0x0, 0x18, 0x18, 0x38 ,0x20 ,0x20, 0x21, 0x21 ,0x21 ,0x21 ,0x33 ,0x1E, 0x1E ,0x0 ,0x0},
{0x0 ,0x0, 0x0, 0x0 ,0x0, 0x80, 0x40, 0x20, 0x20, 0xF0, 0xF8 ,0xF8, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x6 ,0x2, 0x1, 0x0, 0x0 ,0x20, 0x20 ,0x3F ,0x3F, 0x3F, 0x20, 0x20 ,0x20, 0x0},
{0x0, 0x0, 0x0, 0xF8, 0xF8, 0x88, 0x88 ,0x88, 0x88, 0x88 ,0x88 ,0x88, 0x8 ,0x8, 0x0, 0x0},
{0x0, 0x0, 0x18, 0x19, 0x39 ,0x20 ,0x20, 0x20 ,0x20 ,0x20 ,0x20, 0x31 ,0x1F, 0xF, 0x4, 0x0},
{0x0, 0x0, 0xC0, 0xE0, 0xF0, 0x10, 0x88 ,0x88, 0x88, 0x88, 0x88, 0x98, 0x98, 0x10, 0x0, 0x0},
{0x0 ,0x0 ,0xF ,0x1F, 0x1F, 0x31, 0x20 ,0x20 ,0x20, 0x20 ,0x20 ,0x21 ,0x1F, 0x1F ,0xE, 0x0},
{0x0, 0x0, 0x20, 0x38, 0x18, 0x8 ,0x8, 0x8, 0x8 ,0x88 ,0xC8, 0x28, 0x18 ,0x18, 0x8 ,0x0},
{0x0 ,0x0, 0x0, 0x0, 0x0, 0x0, 0x3C, 0x3E, 0x3F ,0x1 ,0x0 ,0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x60, 0x70, 0xD8, 0x88, 0x88, 0x88, 0x88 ,0x8, 0x88, 0x88, 0xF0, 0x70, 0x0, 0x0 },
{0x0 ,0x8 ,0x1C ,0x1E, 0x23 ,0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x23, 0x1E, 0x1C, 0x8, 0x0},
{0x0, 0x40, 0xE0, 0xF0, 0x18, 0x8, 0x8, 0x8, 0x8 ,0x8, 0x8, 0x18 ,0xF0, 0xE0, 0xC0, 0x0},
{0x0 ,0x0, 0x1, 0x31, 0x33, 0x32, 0x22, 0x22 ,0x22, 0x22, 0x33 ,0x1D ,0xF, 0x7 ,0x3, 0x0},
};
void delay_ms(unsigned int ms)
{
unsigned int a;
while(ms)
{
a=1800;
while(a--);
ms--;
}
return;
}
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
if(cmd)
DC=1;
else
DC=0;
CS=0;
for(i=0;i<8;i++)
{
SCL=0;
if(dat&0x80)
{
SDIN=1;
}
else
SDIN=0;
SCL=1;
dat<<=1;
}
CS=1;
DC=1;
}
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,0); //設置頁地址(0~7)
OLED_WR_Byte (0x00,0); //設置顯示位置—列低地址
OLED_WR_Byte (0x10,0); //設置顯示位置—列高地址
for(n=0;n<128;n++)OLED_WR_Byte(0,1);
} //更新顯示
}
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,0);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,0);
OLED_WR_Byte((x&0x0f)|0x01,0);
}
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{
u8 t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],1);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],1);
adder+=1;
}
}
void OLED_Showshuzi(u8 m,u8 n,u8 su)
{
u8 p,adder=0;
OLED_Set_Pos(m,n);
for(p=0;p<16;p++)
{
OLED_WR_Byte(Sz[2*su][p],1);
adder+=1;
}
OLED_Set_Pos(m,n+1);
for(p=0;p<16;p++)
{
OLED_WR_Byte(Sz[2*su+1][p],1);
adder+=1;
}
}
void OLED_Init(void)
{
RST=1;
delay_ms(100);
RST=0;
delay_ms(100);
RST=1;
OLED_WR_Byte(0xAE,0);//--turn off oled panel
OLED_WR_Byte(0x00,0);//---set low column address
OLED_WR_Byte(0x10,0);//---set high column address
OLED_WR_Byte(0x40,0);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,0);//--set contrast control register
OLED_WR_Byte(0xCF,0); // Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,0);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,0);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,0);//--set normal display
OLED_WR_Byte(0xA8,0);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,0);//--1/64 duty
OLED_WR_Byte(0xD3,0);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,0);//-not offset
OLED_WR_Byte(0xd5,0);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,0);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,0);//--set pre-charge period
OLED_WR_Byte(0xF1,0);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,0);//--set com pins hardware configuration
OLED_WR_Byte(0x12,0);
OLED_WR_Byte(0xDB,0);//--set vcomh
OLED_WR_Byte(0x40,0);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,0);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,0);//
OLED_WR_Byte(0x8D,0);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,0);//--set(0x10) disable
OLED_WR_Byte(0xA4,0);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,0);// Disable Inverse Display On (0xa6/a7)
OLED_WR_Byte(0xAF,0);//--turn on oled panel
OLED_WR_Byte(0xAF,0); /*display ON*/
OLED_Clear();
OLED_Set_Pos(0,0);
}
void main()
{
u32 temp,i,j;
long tempM;
u8 TempH;
Time0(); //定時器初始化
OLED_Init(); //設置顯示模式
while(1)
{
if(ReadTempFlag==1) //定時標志
{
ReadTempFlag=0;
temp=ReadTemperature();//讀取溫度
tempM=temp*0.0625*100; //換算為10進制溫度值再放大100倍 12位精度直接乘0.625
TempH=tempM/100; //取整數
i=(TempH%100)/10; //顯示十位溫度
j=(TempH%100)%10; //顯示個位溫度
// k=TempL/10; //顯示溫度小數1位
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(18,0,1);
OLED_ShowCHinese(36,0,2);
OLED_Showshuzi(54,0,0);
OLED_Showshuzi(72,0,i);
OLED_Showshuzi(90,0,j);
OLED_ShowCHinese(108,0,1);
}
}
}
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Time0(void)
{
TMOD = 0x01; //使用模式1,16位定時器
TH0=(65536-5000)/256; //給定初值,定時5ms
TL0=(65536-5000)%256;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器T0開關打開
}
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Time0r(void) interrupt 1
{
static u32 num; //局部變量定義
TH0=(65536-5000)/256; //重新賦值 5ms
TL0=(65536-5000)%256;
num++;
if(num>=25)
{
num = 0;
ReadTempFlag=1; //讀標志位置1
}
}
void Delay2us(u8 t)
{
while(--t);
}
void Delay1ms(u8 t)
{
while(t--)
{
//大致延時1mS
Delay2us(245);
Delay2us(245);
}
}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ復位
Delay2us(5); //稍做延時
DQ = 0; //單片機將DQ拉低
Delay2us(200); //精確延時 大于 480us 小于960us
Delay2us(200);
DQ = 1; //拉高總線
Delay2us(50); //15~60us 后 接收60-240us的存在脈沖
dat=DQ; //如果x=0則初始化成功, x=1則初始化失敗
Delay2us(25); //稍作延時返回
return dat;
}
/*------------------------------------------------
讀取一個字節
------------------------------------------------*/
u8 ReadOneChar(void)
{
u8 i=0;
u8 dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
Delay2us(25);
}
return(dat);
}
/*------------------------------------------------
寫入一個字節
------------------------------------------------*/
void WriteOneChar(u8 dat)
{
u8 i=0;
for(i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay2us(25);
DQ = 1;
dat>>=1;
}
Delay2us(25);
}
/*------------------------------------------------
讀取溫度
------------------------------------------------*/
u32 ReadTemperature(void)
{
u8 a=0;
u32 b=0;
u32 t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換 44H開啟溫度轉換
Delay1ms(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
/*******100us延時程序********/
void delay100us(u32 x)
{
u32 a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
復制代碼
所有程序51hei提供下載:
新建文件夾.rar
(41.09 KB, 下載次數: 54)
2020-12-20 17:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
777zyz色资源站在线观看
|
成人动慢
|
成人不卡
|
国产一区二区视频在线
|
欧美国产视频
|
99久久精品免费看国产高清
|
欧美aaa
|
在线观看免费观看在线91
|
99视频免费在线观看
|
久久久精品视频一区二区三区
|
91免费看片
|
日韩中文字幕
|
综合婷婷
|
狠狠的操
|
国产精品久久毛片av大全日韩
|
成人在线中文字幕
|
午夜综合
|
亚洲九九色
|
欧美黑人巨大videos精品
|
久草免费在线视频
|
国产精品视频在线观看
|
精品国产一区二区国模嫣然
|
午夜爽爽爽男女免费观看影院
|
欧美一区精品
|
91免费版在线观看
|
欧美成人免费在线视频
|
黄 色 毛片免费
|
欧美天堂
|
亚洲a一区
|
久久久久无码国产精品一区
|
五月婷婷丁香婷婷
|
亚洲少妇综合网
|
亚洲精品一区二区三区
|
一级全黄少妇性色生活免费看
|
久久精品国产一区二区三区不卡
|
在线观看中文字幕
|
国产一区在线免费
|
精品国产乱码久久久久久果冻传媒
|
成人免费视频
|
午夜影视大全
|
91麻豆精品国产91久久久久久久久
|