103222 发表于 2017-5-23 00:52 换一高人程序便可, 自个脑力仍需精进。 |
屏新时间不一样,前两个显示的时间短。 |
不是排阻问题。。 |
不是排阻问题 |
跟排阻有关 |
换成2k试下 |
10K电阻太大了啊 |
有关的换成1k的试试 |
我不知道啊 |
|
P3扫描显示完毕之后清屏试试 |
动态扫描时,每一位数码管点亮的时间差别太多,所以亮度差别很多,在亮度不够的数码管点亮程序后加上几毫秒的延时就可以了。 |
直接加个数字逻辑芯片就好了 |
排阻没有问题,问题是排阻的值太大,可并联一个3k-10k的排阻,即可排除故障并大幅提高亮度。 这是我最近做试验刚得出的经验: http://www.51hei.com/bbs/dpj-84657-1.html |
不是阻排问题 |
#include<reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit DATA = P3^7; //DS18B20接入口 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; char bai,shi,ge; //定义变量 /*延时子函数*/ void delay(uint num) { while(num--) ; } /*************DS18b20温度传感器函数*********************/ Init_DS18B20(void) //传感器初始化 { uchar x=0; DATA = 1; //DQ复位 delay(10); //稍做延时 DATA = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us //450 DATA = 1; //拉高总线 delay(20); x=DATA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30); } //读一个字节 ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DATA = 0; // 给脉冲信号 dat>>=1; DATA = 1; // 给脉冲信号 if(DATA) dat|=0x80; delay(8); } return(dat); } //写一个字节 WriteOneChar(unsigned char dat) { uchar i=0; for (i=8; i>0; i--) { DATA = 0; DATA = dat&0x01; delay(10); DATA = 1; dat>>=1; } delay(8); } //读取温度 int ReadTemperature(void) { uchar a=0; uchar b=0; int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar();//低位 b=ReadOneChar();//高位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; return(t); } /*显示子函数*/ void display(int bai,int shi,int ge) { P3=0XFB; //显示小数点 P1=0X80; //显示小数点 delay(50);//显示小数点 P3=0xf7; P1=table[bai];//显示千位 delay(50);//一小段延时动态显示 P3=0xfb; P1=table[shi];//显示百位 delay(50); P3=0xfd; P1=table[ge];//显示十位 delay(50); } void main() { int temp; while(1) { temp=ReadTemperature();//读温度 bai=temp%1000/100;//显示百位 shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 display(bai,shi,ge);//显示函数 } } ///////////////////////////// 不是排阻问题,程序如何修改? 多谢 |
#include<reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit DATA = P3^7; //DS18B20接入口 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; char bai,shi,ge; //定义变量 /*延时子函数*/ void delay(uint num) { while(num--) ; } /*************DS18b20温度传感器函数*********************/ Init_DS18B20(void) //传感器初始化 { uchar x=0; DATA = 1; //DQ复位 delay(10); //稍做延时 DATA = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us //450 DATA = 1; //拉高总线 delay(20); x=DATA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30); } //读一个字节 ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DATA = 0; // 给脉冲信号 dat>>=1; DATA = 1; // 给脉冲信号 if(DATA) dat|=0x80; delay(8); } return(dat); } //写一个字节 WriteOneChar(unsigned char dat) { uchar i=0; for (i=8; i>0; i--) { DATA = 0; DATA = dat&0x01; delay(10); DATA = 1; dat>>=1; } delay(8); } //读取温度 int ReadTemperature(void) { uchar a=0; uchar b=0; int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar();//低位 b=ReadOneChar();//高位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; return(t); } /*显示子函数*/ void display(int bai,int shi,int ge) { P3=0XFB; //显示小数点 P1=0X80; //显示小数点 delay(50);//显示小数点 P3=0xf7; P1=table[bai];//显示千位 delay(50);//一小段延时动态显示 P3=0xfb; P1=table[shi];//显示百位 delay(50); P3=0xfd; P1=table[ge];//显示十位 delay(50); } void main() { int temp; while(1) { temp=ReadTemperature();//读温度 bai=temp%1000/100;//显示百位 shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 display(bai,shi,ge);//显示函数 } } ////////////////////////////// 我又试了,不是排阻问题,程序如何修改? 多谢 |
什么意思? |
加驱动 |
把程序贴出来。开始显示的时候,你有“位”选择,同时就关闭了前面的一位的显示,而最后一位显示完后没有再选择其他的位,所以他就一直开着,直到下次再调用显示程序时才改变“位”,所以最后一位很亮。这是许多新手容易忽视的问题。 最后一位显示完后,将“位选”关闭即可。 |
显示时间问题 数码管2MS刷新一次 差距就不明显了 定时中断2MS 显示程序放中断里 就能解决 |
应该不是排阻问题 |
这背部的线路我也是醉了![]() |
如果是全部不是太亮,可能是排阻的问题。 你的问题则不然,最后一位太亮,是因为你的显示程序停在了最后一位上,没有关闭。直到下次显示第一位时才关闭,比其他两位亮的时间长所致。 |
在实物上对比一下,就知道接与不接有没有关系了 |