急求一个stc12c5a60s2引脚图 12MHz DHT11+MQ-5+lcd1602显示程序

求帮忙看一下我的程序哪里出问题了,dht11+stc12c5a60s2+LCD1602 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求帮忙看一下我的程序哪里出问题了,dht11+stc12c5a60s2+LCD1602
16:48:08  
LCD1602能够正常显示,但是读取到的温湿度数据保持不变,并且明显是错误的数据。程序下载:
(35.73 KB, 下载次数: 9)
16:47 上传
点击文件名下载附件
下载积分: 积分 -1 分
QQ图片25.jpg (36.99 KB, 下载次数: 5)
16:47 上传
#include&reg51.h&
#include&intrins.h&
#include&1602.h&
#define uchar unsigned char
#define uint unsigned int
sbit Data=P3^6;& &//定义数据线
uchar rec_dat[9];& &//用于显示的接收数据数组
void delay_us(uchar n)
{
& & & &
& & while(--n);
& & & & for(a=3;a&0;a--);
}
void delay_ms(uint z)
{
& &
& &unsigned char a,b,c;
& &for(i=z;i&0;i--)
& & & & & & for(c=1;c&0;c--)
& && &&&for(b=43;b&0;b--)
& && && && &for(a=127;a&0;a--);
}
void DHT11_start()
{
& &Data=1;
& &delay_us(1);
& &Data=0;
& &delay_ms(20);& &//延时18ms以上
& &Data=1;
& &delay_us(40);
}
uchar DHT11_rec_byte()& && &//接收一个字节
{
& &uchar i,dat=0;
&&for(i=0;i&8;i++)& & //从高到低依次接收8位数据
& &{& && && &
& && && & & & while(!Data);& &//等待50us低电平过去
& && && & & & delay_us(70);& &&&//延时60us,如果还为高则数据为1,否则为0
& && && & & & dat&&=1;& && && &&&//移位使正确接收8位数据,数据为0时直接移位
& && && & & & if(Data==1)& & & & & & & &&&//数据为1时,使dat加1来接收数据1
& & & && &&&{&&
& && && && & & & dat+=1;
& & & & & & & & }
& && && & & & while(Data);&&//等待数据线拉低& &
& & }&&
& &
}
void DHT11_receive()& && &//接收40位的数据
{
& & uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,
& & DHT11_start();
& & if(Data==0)
& & {
& && &&&while(Data==0);& &//等待拉高& &&&
& && &&&delay_us(90);&&//拉高后延时80us
& && &&&R_H=DHT11_rec_byte();& & //接收湿度高八位&&
& && &&&R_L=DHT11_rec_byte();& & //接收湿度低八位&&
& && &&&T_H=DHT11_rec_byte();& & //接收温度高八位&&
& && &&&T_L=DHT11_rec_byte();& & //接收温度低八位
& && &&&revise=DHT11_rec_byte(); //接收校正位
& && &&&delay_us(25);& & //结束
& && &&&if((R_H+R_L+T_H+T_L)==revise)& && &//校正
& && &&&{
& && && &&&& & & & RH=R_H;
& && && && &RL=R_L;
& && && && &TH=T_H;
& && && && &TL=T_L;
& && &&&}
& && &&&/*数据处理,方便显示*/
& && &&&rec_dat[0]='0'+(RH/10);
& && &&&rec_dat[1]='0'+(RH%10);
& && &&&rec_dat[2]='%';
& && &&&rec_dat[3]='R';
& && &&&rec_dat[4]='H';
& && &&&rec_dat[5]=' ';
& && &&&rec_dat[6]='0'+(TH/10);
& && &&&rec_dat[7]='0'+(TH%10);
& && &&&rec_dat[8]='C';
& & }
}
void main()
{
& && &
& &Init_LCD1602();& &//lcd1602初始化
& &displaystring(0, 0, &Happy new year!&);
& &while(1)
& &{
& && & & & & & & & & & & && && &
& && & & & & & delay_ms(1500);& & //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
& && & & & & & DHT11_receive();
& && & & & & & for(i=0;i&9;i++)& & & && & & & & &
&&& & & & & & & & displaychar(i,1, rec_dat[i]);//写入当前字符并显示
& & & && & & & & &
& && && && && && && && && &
& &}
}复制代码
//使用方法: 使用前调用Init_LCD1602()初始化,显示方法displaystring(0, 0, &This is a test.&);
#ifndef _LCD1602_
#define _LCD1602_
#define uchar unsigned char
#define uint&&unsigned int
//#define _PORT_REV_& && && && &//如果数据端口高低位交换,请去掉此注释
#include &intrins.h&& && && && &//包含_nop_()指令
sbit LCD1602_RS = P2^0;& && && &//控件引脚定义,移植请修改
sbit LCD1602_RW = P2^1;
sbit LCD1602_E&&= P2^2;
#define LCD_PORT& && && && &P1&&//输出数据总线端口定义,移植请修改
#define LCD_COMMAND& && && &0& && & // Command
#define LCD_DATA& && && && &1& && & // Data
#define LCD_CLEAR_SCREEN& & 0x01& & // 清屏
#define LCD_HOMING& && && & 0x02& & // 光标返回原点
#define LCD_SHOW& && && && &0x04& & //显示开
#define LCD_HIDE& && && && &0x00& & //显示关& && &
#define LCD_CURSOR& && && & 0x02& & //显示光标
#define LCD_NO_CURSOR& && & 0x00& & //无光标& && && && &
#define LCD_FLASH& && && &&&0x01& & //光标闪动
#define LCD_NO_FLASH& && &&&0x00& & //光标不闪动
#define LCD_AC_UP& && && &&&0x02
#define LCD_AC_DOWN& && && &0x00& & // default
#define LCD_MOVE& && && && &0x01& & // 画面可平移
#define LCD_NO_MOVE& && && &0x00& & //default
void delay10us(unsigned char t)& &//误差 -0.234375us
{& & & &
& & & & while(--t)
& & & & {
& &
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & i = 24;
& & & & while (--i);}
}
/*********************************************************************************************
函数名:8位数据高低位交叉互换
调&&用:uchar = DataReverse(uchar);
参&&数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:交换后的8位数据
结&&果:交换数据高低位D7→D0,D6→D1.....,D0→D7,并返回交换后的结果
备&&注:
/**********************************************************************************************/
unsigned char DataReverse(unsigned char datOld)
{
& & unsigned char datNew=0,i;
& & for (i=0; i&8; i++)
& & {
& && &&&if (datOld & (1&&i))& && &&&//如果某位为1,则或上一个1
& && && && &datNew |= (0x80&&i);
& & }
& & return datN
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:LCD1602等待函数
调&&用:uchar = LCD_Wait();
参&&数:无
返回值:LCD1602数据总线的值
结&&果:等待LCD1602内部指令执行完成
备&&注:返回结果可不用
/**********************************************************************************************/
unsigned char LCD_Wait(void)
{
& & LCD1602_RS = 0;
& & LCD1602_RW = 1; delay10us(2);
& & LCD1602_E = 1;&&delay10us(2);
#ifdef _PORT_REV_& && && && && && && &&&//如果数据线高低位交换,则需要处理数据
& & while(DataReverse(LCD_PORT)&0x80);
& & LCD1602_E = 0;
& & return DataReverse(LCD_PORT);
#else& && && && && && && && && && && &&&//正常情况下不需要交换
& & while(LCD_PORT&0x80);
& & LCD1602_E = 0;
& & return LCD_PORT;
#endif
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:LCD1602数据写函数
调&&用:LCD_Wait(bit, uchar);
参&&数:数据类型,数据值
返回值:无
结&&果:将指定数据类型的数据写入1602
备&&注:数据类型:LCD_COMMAND(0)、LCD_DATA(1)
/**********************************************************************************************/
void LCD_Write(bit DataStyle, unsigned char DAT)
{
& & LCD1602_E = 0;
& & LCD1602_RS = DataS
& & LCD1602_RW = 0;& & delay10us(2);
#ifdef _PORT_REV_
& & LCD_PORT = DataReverse(DAT);
#else
& & LCD_PORT = DAT;
#endif
& & _nop_();
& & LCD1602_E = 1;& &&&delay10us(2);//注意顺序
& & LCD1602_E = 0;& &&&delay10us(2);
& & LCD_Wait();& && && && && &&&//等待1602内部执行完,Proteus仿真时请注释此句
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:LCD1602显示设置函数
调&&用:LCD_SetDisplay(uchar);
参&&数:显示模式
返回值:无
结&&果:正常设置1602显示模式
备&&注:内部函数,初始化时调用
/**********************************************************************************************/
void LCD_SetDisplay(unsigned char DisplayMode)
{
& & LCD_Write(LCD_COMMAND, 0x08|DisplayMode);& &
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:LCD1602显示设置函数
调&&用:LCD_SetInput(uchar);
参&&数:显示模式
返回值:无
结&&果:正常设置1602显示模式
备&&注:内部函数,初始化时调用
/**********************************************************************************************/
void LCD_SetInput(unsigned char InputMode)
{
& & LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:LCD1602初始化函数
调&&用:Init_LCD1602();
参&&数:无
返回值:无
结&&果:初始化1602函数
备&&注:
/**********************************************************************************************/
void Init_LCD1602()
{
& & LCD_Write(LCD_COMMAND, 0x38);& && && && && &//8位数据端口,2行显示,5*7点阵
& & LCD_Write(LCD_COMMAND, 0x38);
& & LCD_Write(LCD_COMMAND, 0x38);
& & LCD_SetDisplay(LCD_SHOW | LCD_NO_CURSOR);& &//开启显示, 无光标
& & LCD_Write(LCD_COMMAND, LCD_CLEAR_SCREEN);& &//清屏
& & LCD_SetInput(LCD_AC_UP | LCD_NO_MOVE);& && &//AC递增, 画面不动
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:LCD1602数据写函数
调&&用:LCD1602_DispString(uchar, uchar, *uchar);
参&&数:x坐标,y坐标,字符串
返回值:无
结&&果:在指定坐标显示字符串
备&&注:x: 0~15; y:0、1
/**********************************************************************************************/
void displaystring(unsigned char x, unsigned char y, unsigned char *s)
{
& & if(y == 0)
& && &&&LCD_Write(LCD_COMMAND, 0x80|x);
& & if(y == 1)
& && &&&LCD_Write(LCD_COMMAND, 0x80|(x-0x40));
& & while(*s != '\0')
& & {
& && &&&LCD_Write(LCD_DATA, *s);
& && &&&s++;
& & }
}
/**********************************************************************************************/
//字符显示初始地址设置
void LCD_SET_XY(uchar X,uchar Y)
{
&&& & & & if(Y == 0)
& && &&&LCD_Write(LCD_COMMAND, 0x80|X);
& & if(Y == 1)
& && &&&LCD_Write(LCD_COMMAND, 0x80|(X-0x40));
}
//在第X行Y列开始显示Wdata所对应的单个字符
void displaychar(uchar X,uchar Y,uchar Wdata)
{
&&LCD_SET_XY(X,Y);//写地址
&&LCD_Write(LCD_DATA, Wdata);//写入当前字符并显示
}
#endif复制代码
高级工程师
17:50:32  
应该是時序问题!
助理工程师
16:06:25  
我也有这样的问题,换了单片机时序总是或多或少地变了
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司急求用stc12c5a60s2单片机显示dht11温湿度传感器程序,基本的读取和时序程序就行_百度知道
急求用stc12c5a60s2单片机显示dht11温湿度传感器程序,基本的读取和时序程序就行
我有更好的答案
= P2^4 ; void
for(i=0;i&8;i++)
while((!DHT11_1)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
if(DHT11_1)U8temp=1;
while((DHT11_1)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata&&=1;
U8comdata|=U8
}//-------------------------------- //-----湿度读取子程序 ------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM();
//--------------------------------void RH1() {
//主机拉低18ms
DHT11_1=0;
Delay(180);
DHT11_1=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
DHT11_1=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DHT11_1)
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DHT11_1)&&U8FLAG++);
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DHT11_1)&&U8FLAG++);
//数据接收状态
U8RH_data_H_temp=U8
U8RH_data_L_temp=U8
U8T_data_H_temp=U8
U8T_data_L_temp=U8
U8checkdata_temp=U8
DHT11_1=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
U8RH_data_H=U8RH_data_H_
U8RH_data_L=U8RH_data_L_
U8T_data_H=U8T_data_H_
U8T_data_L=U8T_data_L_
U8checkdata=U8checkdata_
采纳率:44%
有AT89S52的,1602显示。程序都一样的
为您推荐:
其他类似问题
您可能关注的内容
dht11的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&>&基于STC89C52RC和STC12C5A60S2单片机的DHT11驱动程序
基于STC89C52RC和STC12C5A60S2单片机的DHT11驱动程序
上传大小:2KB
基于STC89C52RC和STC12C5A60S2单片机的DHT11驱动程序打包,无偿贡献给需要的朋友,经过本人的辛苦调试之后,保证100%可以用,代码已经整理过了,改个io口就可以用。
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有1条
只有部分dht11的驱动代码
pang9998回复qq_
文件里面包含了STC89C52和STC12C5A60S2单片机的DHT11驱动程序,把该驱动程序引入到工程即可
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
基于STC89C52RC和STC12C5A60S2单片机的DHT11驱动程序
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
基于STC89C52RC和STC12C5A60S2单片机的DHT11驱动程序程序不知哪出问题了一直显示0,12MHZ晶振,STC12C5A60S2单片机 LCD1602
#include &STC12C5A.H&#include &intrins.h&#define uchar unsigned char
//宏定义#define uint unsigned intsbit
DHTIO = P1^4;
//管脚定义,DHT11总线输入输出;sbit
LCDRS = P2^2;
//管脚定义,1602液晶RS控制端;sbit
LCDWR = P2^1;
//管脚定义,1602液晶W/R控制端;sbit
LCDEN = P2^0;
//管脚定义,1602液晶EN使能端;uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};uchar data_uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Cvoid LCD_Init();
//声明LCD_Init液晶初始化函数;void LCD_Display();
//声明LCD_Display液晶显示函数;void Rec_DHT();
//声明Rec_DHT,DHT11接收数据函数; //主函数void main(){
LCD_Init();
Rec_DHT();
LCD_Display();
}}/*********延时函数********/void delay(uint z)
//延时1ms{uint i,j;for(i=0;i&z;i++)
for(j=0;j&=168;j++);}/***延时10us***/void delay1()
_nop_(); _nop_(); _nop_(); i = 24; while (--i);} /********主机发出开始信号*******/void DHT11_Start()
//请结合时序图分析{
delay(200);
//保持电平时间大于18ms
//延迟等待20-40us
delay1();}/********DHT11接收一个字节数据*******/uchar receive_data(){
uchar i,temp,
data_byte=0;
for(i=0;i&8;i++)
while((!DHTIO)&&count++);//等待50us低电平结束
delay1();delay1();delay1();delay1();
if(DHTIO==1)
while((DHTIO)&&count++);
if(count==1)
data_byte&&=1;
data_byte|=
return data_}/********DHT11接收数据*******/void Rec_DHT(){
DHT11_Start();//主机发出开始信号
//拉高等待DHT11响应
if(!DHTIO)
//从机发出响应信号
while((!DHTIO) && flag++);
//判断从机是否发出 80us 的低电平响应信号是否结束
while(DHTIO && flag++);
//判断从机是否发出 80us 的高电平,若发出则开始采集数据
Tem_Z = receive_data();
//采集湿度整数部分
Tem_X = receive_data();
//采集湿度小数部分
Hum_Z = receive_data();
//采集温度整数部分
Hum_X = receive_data();
//采集温度小数部分
Check = receive_data();
//采集校验位
DHTIO = 1;
}}/*******指令码*******/void write_com(uchar com)
{LCDEN=0;LCDRS=0;LCDWR=0;P0=delay(2);LCDEN=1;
delay(2);LCDEN=0;}/*******数据码*******/void write_data(uchar dat){
LCDEN=0;}/*********************//********1602液晶显示初始化*******/void LCD_Init()
//使能低电平
write_com(0x38);
//显示模式设置,设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);
//显示开关及光标设置
write_com(0x06);
write_com(0x01);
delay(2);}/**********1602液晶显示*********/void LCD_Display(){//液晶显示第一行:温度显示;
write_com(0x0c);
write_com(0x81);delay(2);
write_data('T');delay(2);
write_data('e');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0x86);delay(2);
write_data(table[(Tem_Z/10)]);delay(2);
//输出温度的十位
write_data(table[(Tem_Z%10)]);delay(2);
//输出温度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0x8c);delay(2);
write_data(0xdf);delay(2);
write_data(0x43);delay(2);//液晶第二行:湿度显示;
write_com(0xc1);delay(2);
write_data('H');delay(2);
write_data('u');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0xc6);delay(2);
write_data(table[(Hum_Z/10)]);delay(2);
//输出湿度的十位
write_data(table[(Hum_Z%10)]);delay(2);
//输出湿度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0xcc);delay(2);
write_data('%');delay(2);}
没有更多推荐了,DHT11实现温湿度的检测显示于Lcd1602
/******************************************
名称:室内环境监测
功能:利用DHT11进行温湿度的测量,并实时显示在LCD1602
连接方式:
DHT11: VDD 供电 3-5.5VDC
DATA 串行数据,单总线----P1^0口
NC 空脚,请悬空
GND 接地,电源负极
LCD: 1、GND-电源地
2、VCC-+5V
3、V0-对比度调整(接地或者正极)
4、RS-寄存器选择,高电平时候选择数据寄存器,低电平时选择指令寄存器(第四脚)-----P2^0
5、RW-读写信号线,高电平时进行读操作,低电平时进行写操作(第五脚)----P2^1
6、E/EN-使能端,高电平时读取信息,负跳变时执行指令(第六脚)----P2^2
7-14、D0-D7-数据位-P0口八位
15、背光正极
16、背光负极
********************************************/
#include &define.h&
#include &delay.h&
#include &lcd.h&
#include &cl.h&
uchar RH,TH;
/*****主函数*****/
void main()
/*初始化LCD*/
lcd_init();
/*接收数据*/
receive();
/*LCD的第一行显示(湿度) */
display(0x00,'H');
display(0x01,':');
display(0x02,RH/10+0x30); /*0x30表示带字库的LCD的位置放有数字0
RH/10+0x30即表示湿度的十位数字在字库RH/10+0x30的位置处放着*/
display(0x03,RH%10+0x30);
display(0X04,'%');
/*LCD的第二行显示(温度)*/
display(0x40,'T');
display(0x41,':');
display(0x42,TH/10+0x30);
display(0x43,TH%10+0x30);
/*温湿度单位转换*/
display(0x44,0xdf);
display(0x45,0x43);
2、define.h
#ifndef _DEFINE_H_
#define _DEFINE_H_
/*程序所用变量定义*/
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define uint unsigned int
#define uchar unsigned char
extern uchar RH,TH;
extern uchar RL,TL;
extern uchar data_
typedef bit BOOL;//布尔型变量
/*dht11 data端口*/
sbit io=P1^0;
/*设置lcd1602的使能端*/
sbit rw=P2^0;
sbit rs=P2^1;
sbit ep=P2^2;
3、delay.h
#ifndef _DELAY_H
#define _DELAY_H
#include &define.h&
#include &lcd.h&
#include &cl.h&
void delay(uchar ms); //延时模块//
void delay1();
4、delay.c
/*延时处理*/
#include &delay.h&
void delay(uchar ms) //延时模块//
while(ms--)
for(i=0;i&100;i++);
void delay1()/*一个for循环大概需要8个机器周期一个机器周期为1us
晶振为12MHz也就是说本函数延时8us多此延时函数必须德稍微精确一点*/
for(i=0;i&1;i++);
#ifndef _LCD_H_
#define _LCD_H_
#include &define.h&
#include &delay.h&
#include &cl.h&
BOOL lcd_bz();
void write_cmd(uchar cmd);
void write_addr(uchar addr);
void write_byte(uchar dat);
void lcd_init();
void display(uchar addr,uchar q);
/*Lcd相关处理*/
#include &lcd.h&
/*测试lcd忙碌状态返回值为布尔型数值真或假'1'.'0'*/
BOOL lcd_bz()
rs=0; // 读忙信号
result = (BOOL)(P2&0x80);
/*****写指令*****/
void write_cmd(uchar cmd)
while (lcd_bz());
/*****写地址*****/
void write_addr(uchar addr)
write_cmd(addr|0x80);//LCD第一行的首地址为0x80第二行的首地址为0x80+0x40=0xc0
/*****写字节*****/
void write_byte(uchar dat)
while (lcd_bz());
P0=//P0数据端
/*****LCD初始化*****/
void lcd_init()
write_cmd(0x38);//设置LCD两行显示一个数据由5*7点阵表示,数据由根线传输
write_cmd(0x0c);//清除屏幕显示
write_cmd(0x06);//设定输入方式增量不移位
write_cmd(0x01);//开整体显示关光标不闪烁
/****在某一地址上显示内容addr表示的是地址偏移量q表示显示的字符或数字****/
void display(uchar addr,uchar q)
delay(10);
write_addr(addr);
write_byte(q);
delay(1);//修改此时间可以改变LCD上数值跳变的数度
#ifndef _CL_H_
#define _CL_H_
#include &define.h&
#include &delay.h&
#include &lcd.h&
void start();
uchar receive_byte();
void receive();
/*处理数据的接收*/
#include &cl.h&
uchar data_
//uchar RH,TH;
uchar RL,TL;
/*****开始信号*****/
void start()
delay(25);// &18ms保证DHT11
//发送开始信号结束后拉高电平延时20-40us
/*****接收一个字节*****/
uchar receive_byte()
for(i=0;i&8;i++)//接收8bit的数据
while(!io);//等待50us的低电平开始信号结束
delay1();//开始信号结束之后延时26us-28us
temp=0;//时间为26us-28us表示接收的为数据'0'
temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
while(io);//等待数据信号高电平'0'为26us-28us'1'为70us
data_byte&&=1;//接收的数据为高位在前右移
data_byte|=
return data_
/*****接收数据*****/
void receive()
uchar T_H,T_L,R_H,R_L,check,num_check,i;
start();//开始信号
//主机设为输入判断从机DHT11响应信号
if(!io)//判断从机是否有低电平响应信号
while(!io);//判断从机发出 80us 的低电平响应信号是否结束
while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
R_H=receive_byte();//湿度高位
R_L=receive_byte();//湿度低位
T_H=receive_byte();//温度高位
T_L=receive_byte();//温度低位
check=receive_byte();//校验位
io=0; //当最后一bit数据接完毕后从机拉低电平50us
for(i=0;i&7;i++)//50us的延时
io=1;//总线由上拉电阻拉高进入空闲状态
num_check=R_H+R_L+T_H+T_L;
if(num_check==check)//判断读到的四个数据之和是否与校验位相同
check=num_

我要回帖

更多关于 stc12c5a60s2 ad程序 的文章

 

随机推荐