//实例90:DS18B20温度检测及其液晶显示(修正负温度显示异常问题)
#include<reg51.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字
unsigned char code Str[]={"Test by DS18B20"}; //说明显示的是温度
unsigned char code Error[]={"Error!Check!"}; //说明没有检测到DS18B20
unsigned char code Temp[]={"Temp:"}; //说明显示的是温度
unsigned char code Cent[]={"Cent"}; //温度单位
unsigned char fuhao;
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0; //将E恢复低电平
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delaynms(5); //延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delaynms(5); //延时5ms ,给硬件一点反应时间
WriteInstruction(0x38); //连续三次,确保初始化成功
delaynms(5); //延时5ms ,给硬件一点反应时间
WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
delaynms(5); //延时5ms ,给硬件一点反应时间
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delaynms(5); //延时5ms ,给硬件一点反应时间
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delaynms(5); //延时5ms ,给硬件一点反应时间
}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbit DQ=P3^3;
unsigned char time; //设置全局变量,专门用于严格延时
/*****************************************************
函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag
***************************************************/
bit Init_DS18B20(void)
{
bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ = 1; //先将数据线拉高
for(time=0;time<2;time++) //略微延时约6微秒
;
DQ = 0; //再将数据线从高拉低,要求保持480~960us
for(time=0;time<200;time++) //略微延时约600微秒
; //以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1; //释放数据线(将数据线拉高)
for(time=0;time<10;time++)
; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕
;
return (flag); //返回检测成功标志
}
/*****************************************************
函数功能:从DS18B20读取一个字节数据
出口参数:dat
***************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat; //储存读出的一个字节数据
for (i=0;i<8;i++)
{
DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1;
_nop_(); //等待一个机器周期
DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++)
; //延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80; //如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
for(time=0;time<8;time++)
; //延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat); //返回读出的十进制数据
}
/*****************************************************
函数功能:向DS18B20写入一个字节数据
入口参数:dat
***************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序
DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1; //将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++)
没有合适的资源?快使用搜索试试~ 我知道了~
51单片机经典实例程序带Proteus仿真100个
共414个文件
c:106个
hex:103个
dbk:101个
5星 · 超过95%的资源 需积分: 49 330 下载量 124 浏览量
2010-06-17
23:29:54
上传
评论 26
收藏 2.83MB RAR 举报
温馨提示
以MCS-51系列单片机为主体,结合大量实例详细介 绍了单片机开发必备的基础知识和软/硬件条件,并 介绍了单片机的硬件结构及常用接口技术和典型芯 片的应用等。所有实例均采用仿真软件Priteus进行 仿真和实验板进行实验。
资源推荐
资源详情
资源评论
收起资源包目录
51单片机经典实例程序带Proteus仿真100个 (414个子文件)
ex98.c 14KB
ex90.c 13KB
ex89.c 11KB
ex86.c 11KB
ex79.c 9KB
ex94.c 9KB
ex84.c 8KB
ex87.c 8KB
ex100.c 7KB
ex83.c 6KB
ex93.c 6KB
ex83.c 6KB
ex88-read.c 6KB
ex75.c 5KB
ex92.c 5KB
ex80.c 5KB
ex88-write.c 5KB
ex77.c 5KB
ex91.c 5KB
ex82.c 5KB
ex81.c 4KB
ex49.c 4KB
ex97.c 4KB
ex66.c 4KB
ex96.c 4KB
ex72.c 4KB
ex76.c 3KB
ex71.c 3KB
ex73.c 3KB
ex64.c 2KB
ex65.c 2KB
ex78.c 2KB
ex47.c 2KB
ex74.c 2KB
ex34.c 2KB
ex67.c 1KB
ex99.c 1KB
send.c 1KB
ex55.c 1KB
ex46.c 1KB
ex32.c 1KB
ex8.c 1KB
send.c 1KB
ex58.c 1KB
ex20.c 1KB
ex52.c 1KB
ex7.c 1KB
ex45.c 1KB
ex33.c 1KB
receive.c 1KB
ex28.c 1KB
ex48.c 1KB
receive.c 1023B
ex59.c 1021B
ex21.c 999B
ex6.c 995B
ex61.c 986B
celiang.c 957B
ex23.c 912B
ex30.c 900B
fagnbo.c 896B
fangbo.c 896B
ex70.c 873B
ex25.c 851B
ex43.c 849B
ex4.c 843B
celiang.c 820B
ex31.c 818B
ex44.c 814B
ex42.c 789B
ex27.c 788B
fangbo.c 727B
ex24.c 721B
ex53.c 702B
ex37.c 691B
ex62.c 683B
ex10.c 681B
ex10.c 678B
ex36.c 663B
ex63.c 657B
ex22.c 646B
moni.c 619B
ex12.c 599B
ex18.c 571B
ex29.c 540B
jishu.c 538B
ex38.c 537B
ex95.c 515B
ex5.c 503B
ex26.c 494B
ex19.c 440B
ex40.c 415B
ex69.c 375B
ex17.c 353B
ex68.c 339B
ex39.c 326B
ex9.c 322B
ex41.c 278B
ex11.c 257B
ex35.c 227B
共 414 条
- 1
- 2
- 3
- 4
- 5
HUANGCHENG4212
- 粉丝: 3
- 资源: 53
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
- SpringBoot整合mongodb学习MongoTemplate和MongoRepository两种方式CRUD使用.zip
- SpringBoot整合MongoDB实现对数据库的CRUD小demo.zip
- Python操作MongoDB数据库的基本一些操作 .zip
- NOSQL数据库监控工具,目前实现了对Redis、MongoDB的监控功能 .zip
- mongoDB数据库的增删改查,以及所需要的配置.zip
- mongodb数据库idea测试.zip
- koa 分别 连接 mysql、mongodb数据库操作.zip
- 基于pytorch实现的人体部件分割源码+模型.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页