打印
[STC单片机]

STC8F2K08S2使用中遇到的迷惑,求指点!

[复制链接]
1680|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
很简单,做了一个电子表,入门级水平。P1直连4位共阴数码管A-G和秒点,是发光管正极,8个脚全设置成推挽输出。4个公共端直连单片机的另4个管脚,也全部设置为推挽输出。结果,数字能正常显示,只是P1.6连的D段特别亮,看了原理图和PCB图,找不到原因。因为是测试,程序中4个公共端的打开时间很短,所以显示的数字特别暗,唯独4个数字的D段很亮,基本达到正常工作的亮度。

55285009-A6E3-486A-B3E4-90B32F72246C.jpeg (27.32 KB )

55285009-A6E3-486A-B3E4-90B32F72246C.jpeg

使用特权

评论回复

相关帖子

沙发
ahongW| | 2020-11-22 18:31 | 只看该作者
加没加限流电阻?

使用特权

评论回复
板凳
bb688| | 2020-11-22 18:52 | 只看该作者
程序问题,扫描要定时处理

使用特权

评论回复
地板
jekey| | 2020-11-22 18:57 | 只看该作者
大概率软件原因

使用特权

评论回复
5
coody| | 2020-11-22 21:17 | 只看该作者
基本可以确定是软件群体,就算不加限流电阻,也不会这样。
最简单的办法,示波器看一下波形就知道了。

使用特权

评论回复
6
小小沙沙粒| | 2020-11-22 22:02 | 只看该作者
扫描时间不一样,D段时间停留最长就这样子显示了,应该用定时器来扫描,显示亮度就一致了

使用特权

评论回复
7
chineseboyzxy|  楼主 | 2020-11-22 22:10 | 只看该作者
MOV  P1,A    所有笔段是同时赋值,不存在单独点亮的问题!

使用特权

评论回复
8
xyz549040622| | 2020-11-22 22:16 | 只看该作者
专业术语,应该是叫消隐吧。需要对数码管进行消隐,切换期间关闭一切输出。

使用特权

评论回复
9
chineseboyzxy|  楼主 | 2020-11-23 08:14 | 只看该作者
DISPLAY:
MOV DPTR,#TAB
MOV A,36H
MOVC A,@A+DPTR
MOV P1,A
CLR DIG1
CALL Delay
SETB DIG1
质疑程序有问题的看一下,简单到入门级、初学者的程序,有问题吗?
质疑电路有问题的,我再解释一下,单片机管脚和数码管直接连接,P1的8个脚直连A-G的7个段和秒点正极;另有4个管脚直连4个数字位的公共负极,秒点负极和第1个数字的公共负极共用。而且这些跟限流电阻没一毛钱关系。除了D段过亮,其它段显示都正常啊。。。。

使用特权

评论回复
10
bb688| | 2020-11-23 08:28 | 只看该作者
把程序填全了,要不咋看?

使用特权

评论回复
11
ayb_ice| | 2020-11-23 08:30 | 只看该作者
需要加限流电阻,可能是某个IO电流输出太大,导致其它IO输出能力受影响了,时间长了芯片可能会挂的

使用特权

评论回复
12
chongdongchen| | 2020-11-23 08:41 | 只看该作者
你看下D有没有和VCC短路了,另外限流电阻还是别省了。

使用特权

评论回复
13
谭翬| | 2020-11-23 09:11 | 只看该作者
sbit L0=P2^0;
sbit L1=P2^1;
sbit L2=P2^2;
sbit L3=P2^3;
code uchar  ledasc[10]={  
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"};
delay(unsigned int i)
{
next:
if(i!=0){_nop_();_nop_();goto next;}
}
uchar disbuf[4];
unsigned int js=0;
mian()
{
unsigned int i=0;
//P1 口为强推输出
//P2 口为普通输入输出
L0=1;L1=1;L2=1;L3=1;
start:
         disbuf[0]=js%10;
         disbuf[1]=js/10%10;
         disbuf[2]=js/100%10;
         disbuf[3]=js/1000%10;
         P1=ledasc[disbuf[0]];L0=0;delay(100);L0=1;
         P1=ledasc[disbuf[1]];L1=0;delay(100);L1=1;
         P1=ledasc[disbuf[2]];L2=0;delay(100);L2=1;
         P1=ledasc[disbuf[3]];L3=0;delay(100);L3=1;
         i++;if(i>99){i=0;js++;}
         if(js>9999){js=0;}
        goto start;
}

使用特权

评论回复
14
谭翬| | 2020-11-23 09:12 | 只看该作者
//
delay(unsigned int i)
{
next:
if(i!=0){i--;_nop_();_nop_();goto next;}
}

使用特权

评论回复
15
谭翬| | 2020-11-23 09:18 | 只看该作者
1、推挽输出最大电流最大20mA,可以不用限流电阻;
2、P1口全部输出1时,会出现各段亮度不一;
3、采用段扫描可以解决:

使用特权

评论回复
16
谭翬| | 2020-11-23 09:23 | 只看该作者
  段扫描方法:
         P1=ledasc[disbuf[0]]&0xf0;L0=0;delay(50);P1=ledasc[disbuf[0]]&0x0f;delay(50);L0=1;
         P1=ledasc[disbuf[1]]&0xf0;L1=0;delay(50);P1=ledasc[disbuf[1]]&0x0f;delay(50);L1=1;
         P1=ledasc[disbuf[2]]&0xf0;L2=0;delay(50);P1=ledasc[disbuf[2]]&0x0f;delay(50);L2=1;
         P1=ledasc[disbuf[3]]&0xf0;L3=0;delay(50);P1=ledasc[disbuf[3]]&0x0f;delay(50);L3=1;

使用特权

评论回复
17
ahongW| | 2020-11-23 09:28 | 只看该作者
chineseboyzxy 发表于 2020-11-23 08:14
DISPLAY:
MOV DPTR,#TAB
MOV A,36H

8个LED全加上限流电阻,你就知道与限流电阻有没有关系了

使用特权

评论回复
18
laocuo1142| | 2020-11-23 11:41 | 只看该作者
应该是显示延时时间不够

使用特权

评论回复
19
bb688| | 2020-11-23 12:21 | 只看该作者
这个逗比没用定时中断,在主程序里扫的

使用特权

评论回复
20
chineseboyzxy|  楼主 | 2020-11-23 12:40 | 只看该作者
bb688 发表于 2020-11-23 12:21
这个逗比没用定时中断,在主程序里扫的

SB人物,以后说话文明点儿,说脏话生孩子没屁眼儿的。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

452

帖子

0

粉丝