标题:
单片机数码管显示问题 总是有一些不是很亮的块出现,实在找不到原因
[打印本页]
作者:
weilan
时间:
2017-3-19 21:20
标题:
单片机数码管显示问题 总是有一些不是很亮的块出现,实在找不到原因
/*数码显示总是有一些不是很亮的块出现,实在找不到原因,单独显示一个数码管正常,超过两个显示就出问题,什么重影、消隐都试过了就是找不到问题原因,已经困扰我3天了!!!*/
#include <reg52.h>
#define uchar unsigned char
void show_num(uchar num,uchar wela_num);//数数码管显示指定数字【0-9】,参数二为位选数值
int num;
uchar code num_table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数字编码表
uchar code wela_tab[6] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选表
uchar aa = 0x80;//数码管编码与本变量位或,则增加小数点
uchar min, sec,ten_ms;//分、秒、10毫秒
sbit dula = P2^6;
sbit wela = P2^7;
int main(void)
{
uchar i,j;
int a=100; //延时用
uchar min_temp,sec_temp,ten_temp;
dula = 0;
wela = 0;
EA = 1;
TMOD = 0x01;//使用16位定时器
ET0 = 1;
TR0 = 1;
TH0 = (65536-9174)/256;//定时器初始值,,11.0592MHz晶振,定时10毫秒
TL0 = (65536-9174)%256;
while(1)
{
min_temp = min;
sec_temp = sec;
ten_temp = ten_ms;
a=800;
while(a--)
{
i=min_temp/10;
j=min_temp%10;
show_num(num_table[i],wela_tab[0]);
show_num(num_table[j]|aa,wela_tab[1]);
i=sec_temp/10;
j=sec_temp%10;
show_num(num_table[i],wela_tab[2]);
show_num(num_table[j]|aa,wela_tab[3]);
i=ten_temp/10;
j=ten_temp%10;
show_num(num_table[i],wela_tab[4]);
show_num(num_table[j]|aa,wela_tab[5]);
}
}
}
void show_num(uchar num,uchar wela_num)//数数码管显示指定数字【0-9】,参数二为位选数值
{
/*P0 = 0xff;
wela = 1;
P0 = wela_tab[0];//wela_num;
wela = 0;
P0 = 0x00;
dula = 1;
P0 = num_table[0];//num;
dula = 0; */
P0 = 0xff;
wela = 1;
P0 = wela_num;
wela = 0;
P0 = 0x00;
dula = 1;
P0 = num;//num;
dula =0;
}
void svtime(void) interrupt 1 //定时器0中断服务程序
{
TH0 = (65536-9174)/256;//定时器初始值,,11.0592MHz晶振,定时10毫秒
TL0 = (65536-9174)%256;
ten_ms++;
if(ten_ms == 100)
{
ten_ms = 0;
sec++;
}
if(sec == 60)
{
min++;
sec = 0;
}
if(min == 60)
{
sec = 0;
ten_ms = 0;
min = 0;
}
}
复制代码
作者:
yitiaoyelang
时间:
2017-3-19 21:43
说说你程序的目的是要显示什么
作者:
weilan
时间:
2017-3-19 22:08
yitiaoyelang 发表于 2017-3-19 21:43
说说你程序的目的是要显示什么
像秒表一样计数
作者:
wc86110
时间:
2017-3-19 23:48
LZ,是用啥驱动数码管?
作者:
imxuheng
时间:
2017-3-20 08:43
wc86110 发表于 2017-3-19 23:48
LZ,是用啥驱动数码管?
应该是P0口是段驱动,P2.6、P2.7通过三极管驱动位
作者:
imxuheng
时间:
2017-3-20 08:44
有进行仿真吗,先在仿真附件上试试
作者:
zl2168
时间:
2017-3-20 10:48
程序问题
作者:
weilan
时间:
2017-3-20 11:31
wc86110 发表于 2017-3-19 23:48
LZ,是用啥驱动数码管?
74h537锁存器
作者:
weilan
时间:
2017-3-20 11:31
74H537锁存器
作者:
啦啦啦1234
时间:
2017-3-20 22:11
#include <reg52.h>
#define uchar unsigned char
sbit duan=P2^6;//段锁存
sbit wei=P2^7;//位锁存
uchar min, sec,ten_ms;//分、秒、10毫秒
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void DelayUs2x(uchar t)
{
while(--t);
}
void DelayMs(uchar t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
void Display()
{
wei=1;
P0=0xfe;
wei=0;
P0=0xff;
duan=1;
P0=table[min/10]; //显示分 十位
duan=0;
DelayMs(2);
wei=1;
P0=0xfd;
wei=0;
P0=0xff;
duan=1;
P0=table[min%10]; //显示分 个位
duan=0;
DelayMs(2);
wei=1;
P0=0xfb;
wei=0;
P0=0xff;
duan=1;
P0=0x40; //显示“——”
duan=0;
DelayMs(2);
wei=1;
P0=0xf7;
wei=0;
P0=0xff;
duan=1;
P0=table[sec/10]; //显示秒 十位
duan=0;
DelayMs(2);
wei=1;
P0=0xef;
wei=0;
P0=0xff;
duan=1;
P0=table[sec%10]; //显示秒 个位
duan=0;
DelayMs(2);
wei=1;
P0=0xdf;
wei=0;
P0=0xff;
duan=1;
P0=0x40; //显示“——”
duan=0;
DelayMs(2);
wei=1;
P0=0xbf;
wei=0;
P0=0xff;
duan=1;
P0=table[ten_ms/10]; //显示微秒 十位
duan=0;
DelayMs(2);
wei=1;
P0=0x7f;
wei=0;
P0=0xff;
duan=1;
P0=table[ten_ms%10]; //显示微秒 个位
duan=0;
DelayMs(2);
}
main()
{
min=0;
sec=0;
ten_ms=0;
EA=1;
TMOD=0x01;//使用16位定时器
ET0=1;
TR0=1;
TH0=(65536-9174)/256;//定时器初始值,,11.0592MHz晶振,定时10毫秒
TL0=(65536-9174)%256;
while(1)
{
Display();
}
}
void svtime(void) interrupt 1 //定时器0中断服务程序
{
TH0=(65536-9174)/256;//定时器初始值,,11.0592MHz晶振,定时10毫秒
TL0=(65536-9174)%256;
ten_ms++;
if(ten_ms==100)
{
ten_ms=0;
sec++;
}
if(sec==60)
{
min++;
sec=0;
}
if(min==60)
{
sec=0;
ten_ms=0;
min=0;
}
}
作者:
yzwzfyz
时间:
2017-3-20 22:34
楼主是不是扫描显示LED的,如果是,则问题出在扫描时间不均匀上,需要仔细安排扫描的方法。
作者:
WJD917108
时间:
2017-3-20 22:43
用驱动了吗???
作者:
sjtsongjian
时间:
2017-3-20 23:04
新手希望给学习机会
作者:
啦啦啦1234
时间:
2017-3-21 06:53
显示函数说明里最后是毫秒显示,太晚了写错了
作者:
surubu
时间:
2017-3-21 20:09
应该是硬问题,没上拉电阻,没原理图很难分析
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1