/*-----------------------------------------------------------------------
单片机型号为STC15W204S 内部IRC选择33MHZ
最后编写:2017-6-17 作者:骆 凯
-----------------------------------------------------------------------*/
#include "STC15Fxxxx.H"
#include "oled.h"
#define MAIN_Fosc 33177600L //定义主时钟 最高晶振
#define RX1_Lenth 32 //串口接收缓冲长度
#define BaudRate1 9600UL //选择波特率
#define Timer2_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 2 重装值, 对应300KHZ
sbit DQ=P5^4; /*DS18B20*/
sbit SW=P5^5; /*触摸按键*/
bit SW_R,table;
unsigned char Buf_Switch,uart_buf[32],uart_buf_index,e;
unsigned int check,Tmep_Tvalue,Tmep_Tvalue_CH,PM[3];
/*-----------------------------------------------------------------------
DS18B20延时1微秒
-----------------------------------------------------------------------*/
void delay_us(unsigned int i)//精确延时1微秒
{
unsigned int b,a;
for(b=0;b<i;b++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
a = 5;
while (--a);
}
}
/*-----------------------------------------------------------------------
DS18B20复位
-----------------------------------------------------------------------*/
void ds1820rst()
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_us(4); //延时
DQ = 0; //DQ拉低
delay_us(100); //精确延时大于480us
DQ = 1; //拉高
delay_us(40);
}
/*-----------------------------------------------------------------------
读数据
-----------------------------------------------------------------------*/
unsigned char ds1820rd()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_us(10);
}
return(dat);
}
/*-----------------------------------------------------------------------
写数据
-----------------------------------------------------------------------*/
void ds1820wr(unsigned char wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_us(10);
DQ = 1;
wdata>>=1;
}
}
/*-----------------------------------------------------------------------
读取温度值并转换
-----------------------------------------------------------------------*/
void Read_Temp(void)
{
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0x44); //*启动温度转换*/
delay_us(300);
ds1820rst(); //温度转换需要一点时间
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0xbe); //*读取温度*/
}
/*-----------------------------------------------------------------------
温度值转换并在本机显示
-----------------------------------------------------------------------*/
void Display_Temp()
{
unsigned char a ,b;
Read_Temp();
a=ds1820rd(); //先读的是温度值低位
b=ds1820rd(); //接着读的是温度值高位
Tmep_Tvalue=b;
Tmep_Tvalue<<=8;
Tmep_Tvalue=Tmep_Tvalue|a;
Tmep_Tvalue=Tmep_Tvalue*(0.625);//温度值扩大10倍,精确到1位小数
if(Tmep_Tvalue!=Tmep_Tvalue_CH){//有新数据再刷新
if(Tmep_Tvalue/1000==0){OLED_ShowString(56,0,"?");}else{OLED_ShowChar(56,0,Tmep_Tvalue/1000);}
if(Tmep_Tvalue%1000/100==0){OLED_ShowString(64,0,"?");}else{OLED_ShowChar(64,0,Tmep_Tvalue%1000/100);}
OLED_ShowChar(72,0,Tmep_Tvalue%100/10);
OLED_ShowString(80,0,";");
OLED_ShowChar(88,0,Tmep_Tvalue%10);
}
Tmep_Tvalue_CH=Tmep_Tvalue;
}
/*-----------------------------------------------------------------------
PM值转换并在本机显示
-----------------------------------------------------------------------*/
void Display_PM()
{
unsigned char a;
for(a=1;a<4;a++){
if((PM[a-1]/10000)==0){
if((PM[a-1]%10000/1000)==0){
if((PM[a-1]%1000/100)==0){
if((PM[a-1]%100/10)==0){
OLED_ShowString(56,a*2,"?");
OLED_ShowString(64,a*2,"?");
OLED_ShowString(72,a*2,"?");
OLED_ShowChar(80,a*2,PM[a-1]%10);}
else{
OLED_ShowString(56,a*2,"?");
OLED_ShowString(64,a*2,"?");
OLED_ShowChar(72,a*2,PM[a-1]%100/10);
OLED_ShowChar(80,a*2,PM[a-1]%10);
}}
else{
OLED_ShowString(56,a*2,"?");
OLED_ShowChar(64,a*2,PM[a-1]%1000/100);
OLED_ShowChar(72,a*2,PM[a-1]%100/10);
OLED_ShowChar(80,a*2,PM[a-1]%10);}
}else{
OLED_ShowChar(56,a*2,PM[a-1]%10000/1000);
OLED_ShowChar(64,a*2,PM[a-1]%1000/100);
OLED_ShowChar(72,a*2,PM[a-1]%100/10);
OLED_ShowChar(80,a*2,PM[a-1]%10);}}
else{
OLED_ShowChar(38,a*2,PM[a-1]/10000);
OLED_ShowChar(56,a*2,PM[a-1]%10000/1000);
OLED_ShowChar(64,a*2,PM[a-1]%1000/100);
OLED_ShowChar(72,a*2,PM[a-1]%100/10);
OLED_ShowChar(80,a*2,PM[a-1]%10);
}
}
}
/*-------------------------------------------------
UART_int
-------------------------------------------------*/
void UART_int()
{
S1_8bit(); //8位数据
S1_USE_P30P31(); //UART1 使用P30 P31口 默认
AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2产生
AUXR |= 0x01; //S1 BRT Use Timer2;
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |= (1<<4); //Timer run enable
REN = 1; //允许接收
ES = 1; //允许中断
EA = 1; //允许全局中断
}
/*-------------------------------------------------
init_HMI
-------------------------------------------------*/
void init_HMI()
{
if(table==0){
OLED_ShowString(0,0,"CDBA?:??????"); OLED_ShowString(100,0,"@??");//还原温度单位和名称
OLED_ShowString(0,2,"AB1;0:????"); OLED_ShowString(96,2,"<=>");
OLED_ShowString(0,4,"AB2;5:????"); OLED_ShowString(96,4,"<=>");
OLED_ShowString(0,6,"AB10?:????"); OLED_ShowString(96,6,"<=>");}
else
{
OLED_ShowString(0,0,"???????????????");//整排清空
OLED_ShowCHinese(10,0,0); //颗
OLED_ShowCHinese(28,0,1); //粒
OLED_ShowCHinese(46,0,2); //数
OLED_ShowCHinese(64,0,3); //量
OLED_ShowCHinese(82,0,4); //(
OLED_ShowCHinese(100,0,5); //个
OLED_ShowCHinese(118,0,6); //)
OLED_ShowString(0,2,"AB0;3:????"); OLED_ShowString(96,2,"???");
OLED_ShowString(0,4,"AB0;5:????"); OLED_ShowString(96,4,"???");
OLED_ShowString(0,6,"AB1;0:????"); OLED_ShowString(96,6,"???");}
}
/*-------------------------------------------------
main
-------------------------------------------------*/
void main(void)
{
OLED_Init(); //初始化OLED
OLED_Clear(); //清空画面
UART_int();
init_HMI();
//OLED_ShowString(0,0,"CDBA?:"); OLED_ShowString(100,0,"@");
while (1)
{
if(SW==1 && SW_R==0){ //切换画面
table=!table;
init_HMI();
Tmep_Tvalue_CH=Tmep_Tvalue_CH-1;//让温度传感器刷新数据
}
SW_R=SW; //负责检测上升沿信号
if(table==0){Display_Temp();}//画面一才可以显示温度
Display_PM();
}}
/*-------------------------------------------------
interrupt
-------------------------------------------------*/
void UART1_interrupt (void) interrupt 4
{
//串口模拟数据测试,带数据校准
// 42 4D 00 1C 00 34 00 49 00 53 00 25 00 35 00 46 1B 96 07 A7 01 68 00 16 00 07 00 01 71 00 04 72
// 42 4D 00 1C 00 32 00 45 00 50 00 24 00 33 00 43 1C B9 07 E3 01 44 00 18 00 07 00 02 71 00 04 A2
switch (Buf_Switch)
{
case 0:
if(SBUF==0x42){Buf_Switch=1;}else{Buf_Switch=0;} break;
case 1:
没有合适的资源?快使用搜索试试~ 我知道了~
手持OLED空气质量测试仪STC15W204S单片机源码+PCB
共39个文件
bak:8个
c:3个
h:3个
3星 · 超过75%的资源 需积分: 32 42 下载量 104 浏览量
2017-08-11
22:19:52
上传
评论 1
收藏 271KB ZIP 举报
温馨提示
基于STC15W204S单片机编写的。带触摸功能和温度采集等,传感器使用了PMS1003,带有PCB板 要用eagle打开
资源推荐
资源详情
资源评论
收起资源包目录
PM_V1.3.zip (39个子文件)
PCB_V1.3
PM4.b#6 119KB
PM4.b#8 120KB
PM4.b#7 120KB
PM4.b#3 120KB
PM4.b#2 120KB
PM4.b#4 120KB
PM4.brd 120KB
PM4.b#5 119KB
PM4.b#9 120KB
PM4.b#1 120KB
keil_ V1.4
UART1.build_log.htm 777B
UART1_uvopt.bak 6KB
UART1.Uv2.bak 2KB
UART1 71KB
UART1.uvgui.luokai 69KB
oled.OBJ 36KB
oledfont.h 3KB
UART1_uvproj.bak 13KB
DS18B20L.c 4KB
UART1.opt.bak 1012B
UART1_Opt.Bak 1013B
UART1.hex 11KB
STC15Fxxxx.H 33KB
UART1.uvgui_SIEMENS.bak 72KB
oled.h 3KB
oled.c 5KB
UART1.plg 177B
UART1.uvgui_luokai.bak 69KB
UART1.lnp 54B
main.LST 15KB
UART1.uvproj 14KB
UART1.uvgui.SIEMENS 72KB
UART1.M51 29KB
UART1.uvopt 5KB
main.OBJ 40KB
UART1_Uv2.Bak 2KB
UART1.uvgui.Bitman 70KB
oled.LST 10KB
main.c 9KB
共 39 条
- 1
资源评论
- cz23dsafadf2322019-09-26非常不错的资料,感谢分享!
Bitman_
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功