专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
proteus
adc0808好像不工作了
2019-07-18 11:11
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
proteus
6701
6
1257
在
仿真
的时候用的dht11和adc0808,在做实物的时候用的dht11,修改程序后发现adc工作不正常,求大神指点,附程序
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
helloY
1楼-- · 2019-07-18 13:49
#include<reg51.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uchar DHT11[5],RTflag=0;
uchar FLAG; //超时标志位
uchar a;
static uchar DateString1[12]={"A12B34C56D89"}; //串口发送数据存储数组
unsigned char getdata;
long int i,T=50,H=150;
float num=0;
void LcdDisplay(int temp); //lcd显示
bit flg=1;
#define uchar unsigned char
#define uint unsigned int
uchar str[7];
#define noACK 0 //用于判断是否结束通讯
#define ACK 1 //结束数据传输
//adr command r/w
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
sbit dat=P2^1;
sbit RS=P2^5;
sbit RW=P2^0;
sbit EN=P2^7;
uchar table[5];
uint wd,sd;
sbit EOC=P3^2;
sbit CLK=P3^3;
sbit ST=P3^4;
sbit OE=P3^5;
sbit S= P2^6;
sbit K1= P2^2;
sbit K2= P2^3;
sbit K3= P2^4;
sbit K4= P3^7;
sbit P12=P3^6;
void KEY(void);
void usart_init(void)
{
TL1=0xfd;TH1=0xfd;
SCON=0x50;
PCON &= 0xef;
TR1=1;
// IE=0x00;
}
void zhuanhuan(float a)//浮点数转换成字符串函数
{
memset(str,0,sizeof(str));
sprintf (str,"%f", a);
}
void Delay_t(uint j)
{ uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void) //10us延时函数
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void delay(uint z)//1毫秒延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_write_com(uchar com) //1602写指令
{
RS=0;
RW=0;
EN=1;
P0=com;
delay(1);
EN=0;
}
void lcd_init() //1602初始化
{
lcd_write_com(0x38);
delay(1);
lcd_write_com(0x08);
delay(1);
lcd_write_com(0x01);//1602清屏指令
delay(1);
lcd_write_com(0x06);
delay(1);
lcd_write_com(0x0C);
delay(1);
}
void lcd_write_data(uchar date)//1602写数据
{
RS=1;
RW=0;
EN=1;
P0=date;
delay(1);
EN=0;
}
void write_str(uchar x,uchar y,uchar *s)//在任意地址写符号字母或数字
{
if(y==0)
lcd_write_com(0x80+x);
else
lcd_write_com(0xc0+x);
while(*s)
{
lcd_write_data(*s);
s++;
}
}
void write_shu(uchar x,uchar y,uchar num)//数据显示函数
{
uchar s,g;
if(y==0)
lcd_write_com(0x80+x);
else
lcd_write_com(0xc0+x);
s=num/10;// 数据分离显示
lcd_write_data(0x30+s);
g=num%10;//数据分离显示
lcd_write_data(0x30+g);
}
uchar write_byte1() //读一个字节
{
uchar i,comdata,temp1;
for(i=0;i<8;i++)
{
FLAG=2;
while((!dat)&&FLAG++);//判断数据位是0还是1
Delay_10us();
Delay_10us();
Delay_10us();
temp1=0;
if(dat)temp1=1; // 如果高电平高过预定0高电平值则数据位为 1
FLAG=2;
while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1
if(FLAG==1)break; //超时则跳出for循环
comdata<<=1;//左移一位 高位在前 低位在后
comdata|=temp1;
}
return (comdata);
}
void DHT11_5() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验
{
uchar i,temp;
//主机拉低18ms
dat=0;
Delay_t(180);
dat=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
dat=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!dat) //T !
{
FLAG=2; //超时标志位
while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
FLAG=2;
while((dat)&&FLAG++); //判断从机拉高80us是否结束
for(i=0;i<5;i++)//数据接收状态
{
DHT11[i]=write_byte1();
}
dat=1; //释放数据总线 为下一次读取做好准备
temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
if(temp==DHT11[4]) //数据校验
{
RTflag=1;
}
if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
{
RTflag=0;
// tm[0]=DATARHT[0]/10;
// tm[1]=DATARHT[0]%10;
// tm[2]=DATARHT[1]/10; //湿度
// tm[3]=DATARHT[2]/10;
// tm[4]=DATARHT[2]%10;
// tm[5]=DATARHT[3]/10; //温度
write_str(0,0,"H: ");//第一行显示湿度
write_shu(3,0,DHT11[0]);
write_str(5,0,"RH");
write_str(8,0,"T: ");//第二行为显示温度
write_shu(11,0,DHT11[2]);
write_str(13,0,"^C");
}
}
}
void main()
{
// value humi_val,temp_val;
// unsigned char error,checksum;
char L=0;
// s_connectionreset();
ST=0;
OE=0; //定时器初始化
ET0=1;
EA=1;
TMOD=0x22;
TH0=216;
TL0=216;
TR0=1;
K1=1;
K2=1;
// K3=1;
// K4=1;
usart_init();
P12=1;
lcd_init(); //1602初始化
delay(1000); //等待DHT11温湿度传感器数据稳定 开始激活DHT11
while(1)//循环读取 并更新数据显示
{
i=0;
while(DateString1[i]!=' ')
{
SBUF=DateString1[i];
while(!TI);
TI=0;
i++;
}
i=0;
delay(1000);//等待DHT11温湿度传感器数据稳定 开始激活DHT11
write_byte1();//读一个字节
DHT11_5(); //读数据
delay(1000); //延时等待
if(EOC==1)
{
L++;
if(L%2==0)
S=0;
else
S=1;
OE=1;
getdata=P1;
OE=0;
i=getdata*196;
i=i/5;
ST=1;
ST=0;
}
if(S==1)
{
// LcdWriteCom(0x80); //数据写到LCD1602显示
// LcdWriteData('L');
// LcdWriteData('I');
// LcdWriteData('G');
// LcdWriteData('H');
// LcdWriteData(':');
// LcdWriteData(i/10000+0x30);
i=i%10000;
// LcdWriteData(i/1000+0x30);
DateString1[7]=i/1000+0x30;
i=i%1000;
// LcdWriteData(i/100+0x30);
DateString1[8]=i/1000+0x30;
write_str(0,1,"L: ");//第一行显示湿度
write_shu(3,1,DateString1[7]);
// write_str(5,1,"RH");
// write_str(8,1,"T: ");//第二行为显示温度
write_shu(4,1,DateString1[7]);
write_str(5,1,"Lx");
}
else if(S==0)
{
// LcdWriteCom(0x80+0X0D-5); //数据写到LCD1602显示
// LcdWriteData('C');
// LcdWriteData('O');
// LcdWriteData('2');
// LcdWriteData(' ');
// LcdWriteData(':');
// LcdWriteData(i/10000+0x30);
i=i%10000;
// LcdWriteData(i/1000+0x30);
DateString1[10]=i/1000+0x30;
i=i%1000;
// LcdWriteData(i/100+0x30);
DateString1[11]=i/1000+0x30;
write_str(8,1,"CO2: ");//第一行显示湿度
write_shu(12,1,DateString1[10]);
// write_str(5,1,"RH");
// write_str(8,1,"T: ");//第二行为显示温度
write_shu(13,1,DateString1[11]);
write_str(14,1,"%");
}
}
}
加载中...
wangjun19820
2楼-- · 2019-07-18 18:26
精彩回答 2 元偷偷看……
加载中...
wangjun19820
3楼-- · 2019-07-18 23:58
在PROTUES里使用ADC0809替代ADC0808,两者使用上没有多大区别。
加载中...
武力戡乱
4楼-- · 2019-07-19 02:12
问题解决了吗?
加载中...
wfudyz
5楼-- · 2019-07-19 02:51
0808不能工作。好好看看CLK信号,是1MHZ吗?!
加载中...
wfudyz
6楼-- · 2019-07-19 08:40
哥们,你这程序里面,好像也没有0808的函数啊?!它怎么工作?!
加载中...
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
为什么Proteus 仿真点阵字体缺笔画 而且速度奇慢
7 个回答
2012~~单片机C语言程序设计实训100例-基于8051+Proteus仿真(第2版)
27 个回答
新手求帮忙解决proteus的问题
1 个回答
大家好,请问用三菱plc仿真软件跟mcgs组态软件怎么样连接?
1 个回答
proteus出问题,不能用
3 个回答
数字频率计 求编程(汇编或C语言)
1 个回答
求单片机与PC机串行通信
2 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
proteus
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uchar DHT11[5],RTflag=0;
uchar FLAG; //超时标志位
uchar a;
static uchar DateString1[12]={"A12B34C56D89"}; //串口发送数据存储数组
unsigned char getdata;
long int i,T=50,H=150;
float num=0;
void LcdDisplay(int temp); //lcd显示
bit flg=1;
#define uchar unsigned char
#define uint unsigned int
uchar str[7];
#define noACK 0 //用于判断是否结束通讯
#define ACK 1 //结束数据传输
//adr command r/w
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
sbit dat=P2^1;
sbit RS=P2^5;
sbit RW=P2^0;
sbit EN=P2^7;
uchar table[5];
uint wd,sd;
sbit EOC=P3^2;
sbit CLK=P3^3;
sbit ST=P3^4;
sbit OE=P3^5;
sbit S= P2^6;
sbit K1= P2^2;
sbit K2= P2^3;
sbit K3= P2^4;
sbit K4= P3^7;
sbit P12=P3^6;
void KEY(void);
void usart_init(void)
{
TL1=0xfd;TH1=0xfd;
SCON=0x50;
PCON &= 0xef;
TR1=1;
// IE=0x00;
}
void zhuanhuan(float a)//浮点数转换成字符串函数
{
memset(str,0,sizeof(str));
sprintf (str,"%f", a);
}
void Delay_t(uint j)
{ uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void) //10us延时函数
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void delay(uint z)//1毫秒延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_write_com(uchar com) //1602写指令
{
RS=0;
RW=0;
EN=1;
P0=com;
delay(1);
EN=0;
}
void lcd_init() //1602初始化
{
lcd_write_com(0x38);
delay(1);
lcd_write_com(0x08);
delay(1);
lcd_write_com(0x01);//1602清屏指令
delay(1);
lcd_write_com(0x06);
delay(1);
lcd_write_com(0x0C);
delay(1);
}
void lcd_write_data(uchar date)//1602写数据
{
RS=1;
RW=0;
EN=1;
P0=date;
delay(1);
EN=0;
}
void write_str(uchar x,uchar y,uchar *s)//在任意地址写符号字母或数字
{
if(y==0)
lcd_write_com(0x80+x);
else
lcd_write_com(0xc0+x);
while(*s)
{
lcd_write_data(*s);
s++;
}
}
void write_shu(uchar x,uchar y,uchar num)//数据显示函数
{
uchar s,g;
if(y==0)
lcd_write_com(0x80+x);
else
lcd_write_com(0xc0+x);
s=num/10;// 数据分离显示
lcd_write_data(0x30+s);
g=num%10;//数据分离显示
lcd_write_data(0x30+g);
}
uchar write_byte1() //读一个字节
{
uchar i,comdata,temp1;
for(i=0;i<8;i++)
{
FLAG=2;
while((!dat)&&FLAG++);//判断数据位是0还是1
Delay_10us();
Delay_10us();
Delay_10us();
temp1=0;
if(dat)temp1=1; // 如果高电平高过预定0高电平值则数据位为 1
FLAG=2;
while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1
if(FLAG==1)break; //超时则跳出for循环
comdata<<=1;//左移一位 高位在前 低位在后
comdata|=temp1;
}
return (comdata);
}
void DHT11_5() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验
{
uchar i,temp;
//主机拉低18ms
dat=0;
Delay_t(180);
dat=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
dat=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!dat) //T !
{
FLAG=2; //超时标志位
while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
FLAG=2;
while((dat)&&FLAG++); //判断从机拉高80us是否结束
for(i=0;i<5;i++)//数据接收状态
{
DHT11[i]=write_byte1();
}
dat=1; //释放数据总线 为下一次读取做好准备
temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
if(temp==DHT11[4]) //数据校验
{
RTflag=1;
}
if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
{
RTflag=0;
// tm[0]=DATARHT[0]/10;
// tm[1]=DATARHT[0]%10;
// tm[2]=DATARHT[1]/10; //湿度
// tm[3]=DATARHT[2]/10;
// tm[4]=DATARHT[2]%10;
// tm[5]=DATARHT[3]/10; //温度
write_str(0,0,"H: ");//第一行显示湿度
write_shu(3,0,DHT11[0]);
write_str(5,0,"RH");
write_str(8,0,"T: ");//第二行为显示温度
write_shu(11,0,DHT11[2]);
write_str(13,0,"^C");
}
}
}
void main()
{
// value humi_val,temp_val;
// unsigned char error,checksum;
char L=0;
// s_connectionreset();
ST=0;
OE=0; //定时器初始化
ET0=1;
EA=1;
TMOD=0x22;
TH0=216;
TL0=216;
TR0=1;
K1=1;
K2=1;
// K3=1;
// K4=1;
usart_init();
P12=1;
lcd_init(); //1602初始化
delay(1000); //等待DHT11温湿度传感器数据稳定 开始激活DHT11
while(1)//循环读取 并更新数据显示
{
i=0;
while(DateString1[i]!=' ')
{
SBUF=DateString1[i];
while(!TI);
TI=0;
i++;
}
i=0;
delay(1000);//等待DHT11温湿度传感器数据稳定 开始激活DHT11
write_byte1();//读一个字节
DHT11_5(); //读数据
delay(1000); //延时等待
if(EOC==1)
{
L++;
if(L%2==0)
S=0;
else
S=1;
OE=1;
getdata=P1;
OE=0;
i=getdata*196;
i=i/5;
ST=1;
ST=0;
}
if(S==1)
{
// LcdWriteCom(0x80); //数据写到LCD1602显示
// LcdWriteData('L');
// LcdWriteData('I');
// LcdWriteData('G');
// LcdWriteData('H');
// LcdWriteData(':');
// LcdWriteData(i/10000+0x30);
i=i%10000;
// LcdWriteData(i/1000+0x30);
DateString1[7]=i/1000+0x30;
i=i%1000;
// LcdWriteData(i/100+0x30);
DateString1[8]=i/1000+0x30;
write_str(0,1,"L: ");//第一行显示湿度
write_shu(3,1,DateString1[7]);
// write_str(5,1,"RH");
// write_str(8,1,"T: ");//第二行为显示温度
write_shu(4,1,DateString1[7]);
write_str(5,1,"Lx");
}
else if(S==0)
{
// LcdWriteCom(0x80+0X0D-5); //数据写到LCD1602显示
// LcdWriteData('C');
// LcdWriteData('O');
// LcdWriteData('2');
// LcdWriteData(' ');
// LcdWriteData(':');
// LcdWriteData(i/10000+0x30);
i=i%10000;
// LcdWriteData(i/1000+0x30);
DateString1[10]=i/1000+0x30;
i=i%1000;
// LcdWriteData(i/100+0x30);
DateString1[11]=i/1000+0x30;
write_str(8,1,"CO2: ");//第一行显示湿度
write_shu(12,1,DateString1[10]);
// write_str(5,1,"RH");
// write_str(8,1,"T: ");//第二行为显示温度
write_shu(13,1,DateString1[11]);
write_str(14,1,"%");
}
}
}
一周热门 更多>