完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
个人感觉是是“uchar wendu[]={10,1,4,11}; //温度显示缓存”和uchar disp_buf[]={0x00,0x00,0x00}; //温度显示数据缓冲区没有联系起来,又不会弄,谁帮忙改下
程序如下: #include /***********************************************************************/ #define uchar unsigned char//常用符号定义 #define uint unsigned int //寄存器宏定义 #define DECODE_MODE 0x09 //译码控制寄存器 #define INTENSITY 0x0A //亮度控制寄存器 #define SCAN_LIMIT 0x0B //扫描界限寄存器 #define SHUT_DOWN 0x0C //关断模式寄存器 #define DISPLAY_TEST 0x0F //测试控制寄存器 ***it shi_zhong=P2^5; //595时钟端 ***it shu_ju=P2^6; //595数据端 ***it suo_cun=P2^7; //595锁存端 ***it DQ=P3^7; //DS18B20数据I/O口 uchar code tab[]={ //不带分隔符阿拉伯数字 0x3C,0x7E,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x3C,/*"未命名文件",0*/ 0x10,0x18,0x1C,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x3C,/*"未命名文件",0*/ 0x3C,0x7E,0x66,0x66,0x60,0x60,0x30,0x30,0x18,0x18,0x0C,0x0C,0x06,0x06,0x7E,0x7E,/*"未命名文件",0*/ 0x3C,0x7E,0x66,0x60,0x60,0x60,0x60,0x7C,0x7C,0x60,0x60,0x60,0x60,0x66,0x7E,0x3C,/*"未命名文件",0*/ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0xFE,0xFE,0x60,0x60,0x60,0x60,0x60,/*"未命名文件",0*/ 0x3C,0x7E,0x06,0x06,0x06,0x06,0x06,0x3E,0x7C,0x60,0x60,0x60,0x60,0x66,0x7E,0x3C,/*"未命名文件",0*/ 0x3C,0x7E,0x66,0x06,0x06,0x06,0x06,0x3E,0x7E,0x66,0x66,0x66,0x66,0x66,0x7E,0x3C,/*"未命名文件",0*/ 0x3C,0x7E,0x66,0x66,0x66,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,/*"未命名文件",0*/ 0x3C,0x7E,0x66,0x66,0x66,0x66,0x66,0x3C,0x3C,0x66,0x66,0x66,0x66,0x66,0x7E,0x3C,/*"未命名文件",0*/ 0x3C,0x7E,0x66,0x66,0x66,0x66,0x66,0x7E,0x7C,0x60,0x60,0x60,0x60,0x66,0x7E,0x3C,/*"未命名文件",0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //不显示 0x00,0x06,0x09,0x09,0x06,0x70,0x88,0x04,0x04,0x04,0x04,0x04,0x04,0x88,0x70,0x00//温度符号 }; uchar code tab7[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//清屏 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//清屏 0xC0,0x00,0x88,0x21,0xFC,0x7F,0x0E,0x30,0xF4,0x1F,0xC0,0x02,0x60,0x04,0x30,0x0C, 0xF8,0x1F,0x90,0x09,0x80,0x01,0xF0,0x0F,0x80,0x01,0x80,0x01,0x80,0x21,0xFC,0x7F,//室 0x80,0x00,0x80,0x01,0x80,0x01,0x84,0x41,0xFC,0xFF,0x8C,0x61,0x8C,0x61,0xCC,0x63, 0xCC,0x66,0x6C,0x6C,0x2C,0x7C,0x1C,0x68,0x0C,0x60,0x0C,0x60,0x0C,0x78,0x04,0x20,//内 0x84,0x20,0x88,0x7F,0x98,0x31,0x88,0x3F,0x82,0x31,0xA4,0x31,0xAC,0x3F,0x94,0x10, 0x50,0x40,0xD8,0xFF,0xCA,0x6A,0xCC,0x6A,0xCC,0x6A,0xDC,0x6A,0xFC,0xFF,0x08,0x00,//温 0x00,0x02,0x08,0x46,0xF8,0xFF,0x98,0x08,0x98,0x59,0xF8,0xFF,0x98,0x19,0x98,0x1F, 0x98,0x28,0xD8,0x7F,0x98,0x31,0x0C,0x1B,0x0C,0x0E,0x04,0x3B,0x82,0xF1,0x60,0x40,//度 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//清屏 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00//清屏 }; uchar wendu[]={10,1,4,11}; //温度显示缓存 uchar disp_buf[]={0x00,0x00,0x00}; //温度显示数据缓冲区 uchar Tem_H,Tem_L; //用于存储温度转换值高8位和低8位 bit Flag=0; //正、负温度值符号标志位,0为正,1为负 /***********函数声明***************************/ void fasong_shuju(uchar dat595,c); void delay(uint n); void disp(uchar DM); void zuo_yi(uchar tab[],uchar n); void dispmove(void); void shujuf_enjie(void); //数据分解 void delay_DS18B20(int us); //延时函数 bit Init_DS18B20(void); //DS18b20初始化函数 uchar Read_bit(void); //DS18b20读一个字节 void Write_bit(uchar val_bit); //DS18b20写一个字节 uchar Read_byte(void); //DS18B20读字节函数 void Write_byte(uchar com); //DS18B20写字节函数 int ReadTemperature(void); //DS18b20读取温度 void adj_dat(void); //显示字节调整函数 void DelayMs(uint msec); uchar GeKey(void); void key (void); void shujutiaozheng(void); /***********主函数***************************/ main() //主程序 { while(1) { { dispmove(); //显示 adj_dat(); } } } /***************595发送8位扫描段码子程*********/ void fasong_shuju(uchar dat595,c) { uchar dat=dat595; uchar i; for(i=0;i dat<<=1; shu_ju=CY; shi_zhong=0; shi_zhong=1; } } /*****************延时子程序*******/ void delay(uint n) { uint i,j; for(i=0;i } /*********************分屏显示数字************************/ void disp(uchar DM) { uchar i,row,j,m; uint g; for(j=0;j<100;j++) //动态显示5次后,再移动 { row=0x08; //74138的编码初值08 第一行有效 for(i=0;i<16;i++) //16行循环有效 { suo_cun=0; //595锁存端无效 switch(DM) { case 4:{ for(m=4;m>0;m--) { g=i+wendu[m-1]*16; fasong_shuju(~tab[g],8); } }break; } P2=row; //对应行输出 row++; //行号加1 suo_cun=1; //595锁存数据 delay(0); //延时后刷屏 } } } void dispmove(void) { disp(0); zuo_yi(tab7,8); disp(4); } void zuo_yi(uchar tab[],uchar n) { uchar i,row,j,m,k,n1; uint g; for(n1=0;n1<(n-2);n1++) //左移字数 { for(k=16;k>0;k--) //左移16位 { for(j=0;j<1;j++) //动态显示1后,再移动 { row=0x08; //74138的编码初值08 第一行有效 for(i=0;i<16;i++) //16行循环有效 { suo_cun=0; //595锁存端无效 if(k>8) { for(m=3;m>0;m--) //4组16×16数据发送循环 { if(m>1) { g=2*i+m*32-32+n1*32; fasong_shuju(~tab[g+1],8); fasong_shuju(~tab[g],8); } else { g=2*i+m*32-32+n1*32; fasong_shuju(~tab[g+1],8); fasong_shuju(~tab[g],k-8); } } } else { for(m=3;m>0;m--) { if(m>1) { g=2*i+m*32-32+n1*32;//取字模 fasong_shuju(~tab[g+1],8); //上半屏 fasong_shuju(~tab[g],8); //下半屏 } else { g=2*i+m*32-32+n1*32;//取字模 fasong_shuju(~tab[g+1],k); //上半屏 fasong_shuju(~tab[g],0); //下半屏 } } } P2=row; //对应行输出 row++; //行号加1 suo_cun=1; //595锁存数据 } } } } } /**********************延时函数**************************/ void delay_DS18B20(int us) { int i; for(i=0;i /*******************DS18B20复位函数***********************/ bit Init_DS18B20(void) { bit res; DQ=0; //拉低DQ线 delay_DS18B20(29); //延时480us DQ=1; //DQ线置高 delay_DS18B20(10); //延时 res=DQ; //读取复位响应信号 delay_DS18B20(10); return(res); //返回响应值 } /*******************DS18B20读位函数***********************/ uchar Read_bit(void) { uchar i; DQ=0; //拉低DQ线 DQ=1; //DQ线置高 for(i=0;i<3;i++); //延时15us return(DQ); //返回当前读取值 } /*******************DS18B20写位函数***********************/ void Write_bit(uchar val_bit) { DQ=0; //拉低DQ if(val_bit==1)DQ=1; //从DQ线发送1 delay_DS18B20(5); //延时 DQ=1; } /********************DS18B20读字节函数*********************/ uchar Read_byte(void) { uchar i; uchar temp=0; for(i=0;i<8;i++) { if(Read_bit())temp|=0x01< delay_DS18B20(6); } return(temp); //返回读取字节 } /*********************DS18B20写字节函数*******************/ void Write_byte(uchar com) { uchar i,temp; for(i=0;i<8;i++) { temp=com>>i; //右移i次取低位发送 temp&=0x01; Write_bit(temp); } delay_DS18B20(5); } /*****************温度值正负判断程序******************/ uint Get_Tem(uchar dath,uchar datl) { uint temp=0,temp_h=0,temp_l; temp_h=(uint)dath; temp=temp_h&0x00ff; temp_l=(uint)datl; temp_l&=0x00ff; temp=(temp<<8)|temp_l; //去掉符号值后合并成16位数据 if((dath&0x80)==0x80) { Flag=1; temp=~temp+1; //负数时求补 } else { Flag=0; } return(temp); } int ReadTemperature(void) { uint temp=0; float temp1=0; while(!(Init_DS18B20())); Write_byte(0xCC); //跳过读序号列号的操作 Write_byte(0x44); //启动温度转换 while(!(Init_DS18B20())); Write_byte(0xCC); //跳过读序号列号的操作 Write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 Tem_L=Read_byte(); //低位 Tem_H=Read_byte(); //高位 temp=Get_Tem(Tem_H,Tem_L); temp1=temp*0.0625; temp=temp1*10+0.5; return(temp); } void adj_dat(void) { uint temp; EA=0; temp=ReadTemperature(); //读温度 if(Flag) disp_buf[0]=10; else disp_buf[0]=11; disp_buf[1]=temp%1000/100; //显示十位 if(disp_buf[1]==0) { disp_buf[1]=disp_buf[0]; } disp_buf[2]=temp%100/10; //显示个位 EA=1; } /***************************************************************************************************************************/ |
|
相关推荐
3 个讨论
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-常见网络服务搭建之NFS服务搭建
2 浏览 0 评论
求助:辉芒微芯片 FDM B11GBMH 的信息及开发环境安装
4 浏览 0 评论
731 浏览 0 评论
嵌入式 学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之输入输出重定向
629 浏览 0 评论
求助大佬,多位数码管如何同时亮并间隔一段时间再灭?``` ‸
1659 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11285 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-27 15:35 , Processed in 0.603124 second(s), Total 42, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号