打印
[MSP430]

用proteus仿真的时候 动态显示 数码管产生一闪一闪的现象

[复制链接]
11923|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
proteus仿真的时候,数码管发生一闪一闪的现象 我没有加驱动电路 这个需要加吗?怎么加?我上网查过很多资料,都试过,结果还是不行,请说详细点,谢谢。然后我问过老师之后,他让我改一个4位共阳极的数码管试试,请问,这个4位共阳极数码管怎么连接,如何加驱动电路,加了驱动电路以后程序怎么改?谢谢,小弟初来乍到,请各位大神多多包涵.最好有图。

相关帖子

沙发
jxw82284134| | 2014-5-22 11:22 | 只看该作者
扫描时间是不是有点长了

使用特权

评论回复
板凳
叶伤| | 2014-5-22 13:00 | 只看该作者
修改数码管的参数,把时间调长一点。好像叫延迟时间还是余辉时间来着。

使用特权

评论回复
地板
chengang992215|  楼主 | 2014-5-22 18:59 | 只看该作者
叶伤 发表于 2014-5-22 13:00
修改数码管的参数,把时间调长一点。好像叫延迟时间还是余辉时间来着。

数码管参数怎么改?我点击数码管的时候只有电压和电流两个参数

使用特权

评论回复
5
呆板书生| | 2014-5-22 19:17 | 只看该作者
proteus 本来就是这样,硬件正常不一定仿真正常,仿真正常不一定硬件正常,

使用特权

评论回复
6
lmx89| | 2014-5-22 21:03 | 只看该作者
proteus仿真数码管时,是可以不加驱动电路的,仿真毕竟是相对理想的状态,只要管脚连接正确就可以正常点亮的。你说的一闪一闪,应该是扫描时间偏长(要控制在20ms以内),这个是通过修改单片机的delay时长(这是在学校的做法)。

使用特权

评论回复
7
chengang992215|  楼主 | 2014-5-22 21:10 | 只看该作者
lmx89 发表于 2014-5-22 21:03
proteus仿真数码管时,是可以不加驱动电路的,仿真毕竟是相对理想的状态,只要管脚连接正确就可以正常点亮 ...

我已经改过延时时间了啊 但还是不行 我改成了1ms

使用特权

评论回复
8
lmx89| | 2014-5-22 21:14 | 只看该作者
本帖最后由 lmx89 于 2014-5-22 21:29 编辑

那你贴下程序贴下图,才会有人帮你看。其实你的问题,找度娘是可以解决的!

使用特权

评论回复
9
chengang992215|  楼主 | 2014-5-22 21:25 | 只看该作者
#include  <msp430f2491.h>
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
const int a[10]={0xc0,0xf9,0xa4,0x60,0x99,0x92,0x82,0xf8,0x80,0x90};
int juli_cm[4];
int T_COUNT;
float d;
int D;
void init_port( )
{
    P1DIR=0x10;   //P1端口输入模式
    P2DIR=0xFF;   //P2端口输出模式
    P1SEL=0x10;   //P1端口引脚功能选择器,变为功能端口,作为中断使用
    P1IE=0x01;    //P1端口允许中断
    P1IES=0x00;   //P1端口上升沿产生中断
    P4DIR=0xFF;   //P4端口初始化,为输出模式
    P6DIR=0xFF;   //P6端口初始化,为输出模式
}
void disp( )      //显示模块
{
  //P6OUT=0x01;     //依次使用数码管,再将值赋给数码管
//P4OUT=a[1];  
  P6OUT=0x07;
  delay_us(1000);
  P4OUT=juli_cm[3];
//   P4OUT=a[2];
  delay_us(1000);
  P6OUT=0x0B;
  delay_us(1000);
  P4OUT=juli_cm[2];
  delay_us(1000);
  
// P4OUT=a[3];
  P6OUT=0x0D;
  delay_us(1000);
  P4OUT=juli_cm[1];
  delay_us(1000);

//   P4OUT=a[4];
   P6OUT=0x0E;
   delay_us(1000);
   P4OUT=juli_cm[0];
   delay_us(1000);
}
#pragma vector=PORT1_VECTOR    //中断服务子程序
__interrupt void P1_IRQ(void)
{   
//  while(P1IN&0x01==0x01);        //如果持续着高电平,就让中断程序等在那边等待低电平调变
   TACTL=0x02C0;   //中断模式关闭
   T_COUNT=TAR;
   TAR=0;
   d=T_COUNT*0.017;
   D=d*10+0.5;
   juli_cm[3]=a[D/1000];
   juli_cm[2]=a[D%1000/100];
   juli_cm[1]=a[D%100/10];
   juli_cm[0]=a[D%10];
   P1IFG=0x00;
}

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
  init_port();               //调入初始化函数   
  _EINT();
  P1IFG=0x00;
  while(1)                    //进入循环
  {
   P2OUT=0x01;                //P2端口输出高电平
   TACTL=0x02E0;              //中断模式开启,同时进行计数,连续计数模式
   delay_us(1);              //延时20us
   P2OUT=0x00;                //P2端口跳变为低电平
   delay_us(1);              //延时20us
   P2OUT=0x01;
   disp( );                   //调入显示模块  
  }
  
}
这是我的程序 麻烦大神们看一下

使用特权

评论回复
10
chengang992215|  楼主 | 2014-5-22 21:25 | 只看该作者
lmx89 发表于 2014-5-22 21:14
那你贴下程序贴下图,才会有人帮你看

已经发了

使用特权

评论回复
11
lmx89| | 2014-5-22 22:02 | 只看该作者
本帖最后由 lmx89 于 2014-5-22 22:07 编辑
chengang992215 发表于 2014-5-22 21:25
已经发了

430没接触过,最好带上电路图。

使用特权

评论回复
12
chengang992215|  楼主 | 2014-5-22 22:05 | 只看该作者
有的

图片1.png (188.88 KB )

图片1.png

使用特权

评论回复
13
chengang992215|  楼主 | 2014-5-22 22:06 | 只看该作者
chengang992215 发表于 2014-5-22 21:25
已经发了

发了 哎 我要崩溃了 都不知道应该怎么改 什么都试过了 就是不行

使用特权

评论回复
14
lmx89| | 2014-5-22 22:54 | 只看该作者
chengang992215 发表于 2014-5-22 22:06
发了 哎 我要崩溃了 都不知道应该怎么改 什么都试过了 就是不行

虽然程序有很多需要改进和优化的地方,总体上没什么大问题(中断我不知道你有没配置正确)。建议先将中断屏蔽,直接在主程序while(1)里只运行disp(),仿真电路也只接数码管(其他都不用)测试,一步一步调试,最后会找到问题所在的

使用特权

评论回复
15
nuaabob| | 2014-5-23 19:41 | 只看该作者
用四位的数码管试试,不要用分立数码管。

使用特权

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

本版积分规则

5

主题

14

帖子

0

粉丝