完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 马永贵11 于 2016-4-13 21:23 编辑
仿真如图片所示,LED数码管不显示。程序如下 /*********************头文件***********************/ #include #include #include #include unsigned int wendu,shidu; unsigned char code table_h[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; unsigned char code table_l[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /********************************定义p1口******************/ ***it d1=P1^2; ***it d2=P1^3; ***it d3=P1^4; ***it Sp=P1^7; #define uchar unsigned char #define uint unsigned int void LED_init(void); void LED_xianshi(void); void delay_n10us(uint n); void LED_init(void) { d1=1; d2=1; d3=1; P0= 0xff; P2= 0xff; } /****************************LED显示***************/ void LED_xianshi(void) { uint i; uchar a,b,c,u,v,w; for(i=0;i<51;i++) { P0=0xff; P2=0xff; delay_n10us(200); a=(wendu/10); b=(wendu%10); c=wendu-10*a-b; u=(shidu/10); v=(shidu%10); w=shidu-10*u-v; d1=1; P0=table_h[a]; P2=table_l[a]; delay_n10us(1000); d2=0; d3=1; P0=table_h[c]; P2=table_l[w]; delay_n10us(1000); d3=0; } } /*************************延时**************************/ void delay_n10us(uint n) { uint i; for(i=n;i>0;i--) { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); } } ***it SCK =P1^1; ***it DATA=P1^0; typedef union { unsigned int i; float f; } value; enum {TEMP,HUMI}; #define noACK 0 #define ACK 1 #define STATUS_REG_W 0x06 #define STATUS_REG_R 0x07 #define MEASURE_TEMP 0x03 #define MEASURE_HUMI 0x05 #define RESET 0xle void s_transstart(void); void s_connectionreset(void); char s_write_byte(unsigned char value); char s_read_byte(unsigned char ack); char s_measure(unsigned char*p_value,unsigned char*p_checksum,unsigned char mode); void calc_dht10(float*p_humidity,float*p_temperature); void s_transstrat(void) { DATA=1; SCK=0; _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; } /****************复位*************/ void s_connectionreset(void) { unsigned char i; DATA=1; SCK=0; for(i=0;i<9;i++) { SCK=1; SCK=0; } s_transstart(); } /************************写字节*****************/ char s_write_byte(unsigned char value) { unsigned char i,error=0; for(i=0x80;i>0;i/=2) { if(i&value)DATA=1; else DATA=0; SCK=1; _nop_();_nop_();_nop_(); SCK=0; } DATA=1; SCK=1; error=DATA; _nop_();_nop_();_nop_(); SCK=0; DATA=1; return error; } /***************************读字节*********************/ char s_read_byte(unsigned char ack) { unsigned char i,val=0; DATA=1; for(i=0x80;i>0;i/=2) { SCK=1; if(DATA)val=(val|i); _nop_();_nop_();_nop_(); SCK=0; } if(ack==1)DATA=0; else DATA=1; _nop_();_nop_();_nop_(); SCK=1; _nop_();_nop_();_nop_(); SCK=0; _nop_();_nop_();_nop_(); DATA=1; return val; } /*************************************测量***********************/ char s_measure(unsigned char*p_value,unsigned char*p_checksum,unsigned char mode) { unsigned error=0; unsigned int i; s_transstart(); switch(mode){ case TEMP :error+=s_write_byte(MEASURE_TEMP);break; case HUMI :error+=s_write_byte(MEASURE_HUMI);break; default :break; } for(i=0;i<65535;i++)if(DATA==0)break; if(DATA)error+=1; *(p_value)=s_read_byte(ACK); *(p_value+1)=s_read_byte(ACK); *p_checksum=s_read_byte(noACK); return error; } void calc_dht10(float*p_humidity,float*p_temperature) { const float C1=-4.0; const float C2=+0.0405; const float C3=-0.0000028; const float T1=+0.01; const float T2=+0.00008; float rh=*p_humidity; float t=*p_temperature; float rh_lin; float rh_true; float t_C; t_C=t*0.01-40; rh_lin=C3*rh*rh+C2*rh+C1; rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; if(rh_true>99)rh_true=99; if(rh_true<0.1)rh_true=0.1; *p_temperature=t_C; *p_humidity=rh_true; } uint long2string (uint INum,uchar chWord[]) //转成 { uint i=0; uint j=0; uint cnt=0; uchar chTemp; //依次取整数的末位,存入chWord while(INum!=0) { chWord='0'+INum%10; //转换为数字的ASCIIA码 i++; INum=INum/10; } cnt=i; //字符串最后一位加 chWord=' '; //将字符串逆序 for(j=0;j { chTemp =chWord[j]; chWord[j]=chWord[i-1-j]; chWord[i-1-j]=chTemp; } return cnt; } /*******************************发送************************/ void Send(uint num,uint num1) { uint i; uint cnt=0; uint cnt1=0; uchar trdata[10]; uchar trdata1[10]; SCON=0x40; //串口方式1 PCON=0; //SMOD=0 REN=1; //允许接收 TMOD=0x20; //定时器1定时方式2 TH1=0xfd; //11.0592M9600波特率 TL1=0xfd; TR1=1; //启动定时器 cnt=long2string(num,trdata); trdata[cnt+1]=0x0a; trdata[cnt+2]=0x00; i=0; while(trdata!=0x00) { SBUF=trdata; while(TI==0); TI=0; i++; } cnt1=long2string(num1,trdata1); trdata1[cnt+1]=0x0a; trdata1[cnt+2]=0x00; i=0; while(trdata1!=0x00) { SBUF=trdata1; while(TI==0); TI=0; i++; } } void main(void) { value humi_val,temp_val; unsigned char error,checksum; LED_init(); s_connectionreset(); while(1) { error=0; error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); if(error!=0) { P0=0x86; P2=0xc0; s_connectionreset(); } else { humi_val.f=(uint)humi_val.i; temp_val.f=(uint)temp_val.i; calc_dht10(&humi_val.f,&temp_val.f); wendu=temp_val.f; shidu=humi_val.f; LED_xianshi(); if(wendu>40|wendu<0) { Sp=0; delay_n10us(10000); } Sp=1; delay_n10us(4000); Send(wendu,shidu); //传送采集的温度 delay_n10us(1000); } } },
|
|
相关推荐
3个回答
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
单片机应用技术的ISIS professional电路设置仿真老是报错怎么办
6157 浏览 0 评论
7373 浏览 2 评论
14530 浏览 3 评论
15762 浏览 1 评论
15913 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-5-9 22:20 , Processed in 0.537746 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ringvoyeur.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191