发新帖我要提问
12
返回列表
打印

这是神马情况啊!程序没错的,为什么仿真不对

[复制链接]
楼主: 雷影少年
手机看帖
扫描二维码
随时随地手机跟帖
21
这个玩意,搞搞数字逻辑还可以,你还想用来仿真电气特性?别折腾了。

使用特权

评论回复
22
m564522634| | 2012-6-26 11:22 | 只看该作者
我看你电路是用的共阳数码管了,但你的程序开位选的时候怎么开的是D=0XFE呀不是开D=0X01吗

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
雷影少年 + 1 我很赞同
23
m564522634| | 2012-6-26 11:24 | 只看该作者
程序要实现的功能是12345678吧

使用特权

评论回复
24
雷影少年|  楼主 | 2012-6-26 11:27 | 只看该作者
楼主别仿真了,就在开发板上弄吧。
NE5532 发表于 2012-6-26 10:23

好吧!我不较真了。
做别的去

使用特权

评论回复
25
m564522634| | 2012-6-26 11:29 | 只看该作者
把d=0xfe改为d=0x01;试下

使用特权

评论回复
26
雷影少年|  楼主 | 2012-6-26 11:43 | 只看该作者
我看你电路是用的共阳数码管了,但你的程序开位选的时候怎么开的是D=0XFE呀不是开D=0X01吗
m564522634 发表于 2012-6-26 11:22

我也在纠结这个呢给的原理图是说共阳数码管的,但是只有这样写才正确,公共端要为0的时候对应的数码管才亮,但是我的段码有确实是共阳管的段码,不明白这是什么原因?是不是原理图有问题

使用特权

评论回复
27
lnak| | 2012-6-26 11:57 | 只看该作者
三极管通了,加上拉电阻试试!

使用特权

评论回复
28
雷影少年|  楼主 | 2012-6-26 16:12 | 只看该作者
本帖最后由 雷影少年 于 2012-6-26 16:13 编辑

感谢各位的帮助,程序总算是搞定了,以我目前的水平只能写这么次的程序了
不论好坏都传上来吧!再给前辈们一个批评的的机会,给比我飞得慢的菜鸟们一个例子吧!
加了点注释,程序的功能就是8为数码管动态显示0~7,8个数字,回头再加别的功能吧!
下面是程序:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};  //数码管段码
void delay(uchar x)  //延时程序
{
uchar a,b;
for(a=x;a>0;a--)
  for(b=100;b>0;b--);
}
void main()      //主程序
{
uint c=0;   //段码选择变量
uchar d=0x7f;   //最左侧数码管亮(选位)
while(1)     
{  
  P0=0xff;    //段码清零,防止数码管出现余辉
  P2=d;   //选位
  P0=seg[c];  //调用段码表
  delay(10);    //延时
  c++;    //段码加1
  if(c==8)   //是否显示到数字7
  c=0;    //重新装载段码选择变量
  d=_cror_(d,1); //位选变量右移一位
}
}
这是效果
欢迎各位前辈继续批斗:@ ,你们不批评我不知道错在哪啊:'(

使用特权

评论回复
29
雷影少年|  楼主 | 2012-6-26 16:15 | 只看该作者
给他在加个左移的功能让0~F16个数左移显示出来,看看要多久才能写出来

使用特权

评论回复
30
雷影少年|  楼主 | 2012-6-26 17:00 | 只看该作者
本帖最后由 雷影少年 于 2012-6-26 17:05 编辑

这个写的挺快的,就是还有个小BUG:每当8~F出现后全部数码管会有个短暂的显示8.而后才重新显示0~7
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};         //数码管段码
void delay(uchar x)                //延时程序
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=100;b>0;b--);
}
void main()                           //主程序
{
        uint c=0;                        //段码选择变量
        uchar d=0x7f;                 //最左侧数码管亮(选位)
        while(1)                  
        {  
                P0=0xff;           //段码清零,防止数码管出现余辉
                P2=d;                        //选位
                P0=seg[c];                //调用段码表
                delay(10);           //延时
                c++;                  //段码加1
                if(c==8)          //是否显示到数字7
                c=0;                  //重新装载段码选择变量
                d=_cror_(d,1); //位选变量右移一位
        }
}

使用特权

评论回复
31
NE5532| | 2012-6-26 22:28 | 只看该作者
对初学者来说,程序没有好次,能跑对就是成功。楼主既然在开发板上弄对了,那就是对了,好不好是另外的话。

使用特权

评论回复
32
雷影少年|  楼主 | 2012-6-27 08:12 | 只看该作者
对初学者来说,程序没有好次,能跑对就是成功。楼主既然在开发板上弄对了,那就是对了,好不好是另外的话。
NE5532 发表于 2012-6-26 22:28

刚醒来的时候突然想把程序的左移方式改下,由原来的F出现后重新显示0~7,改为循环显示,即出现8~F的下一状态为9~F~0,仅仅改了几个变量就OK了,修改的地方加了红色
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};  //数码管段码
void delay(uchar x)  //延时程序
{
uchar a,b;
for(a=x;a>0;a--)
  for(b=100;b>0;b--);
}
void main()      //主程序
{
uchar c,d=0x7f,e,i,il;  //c:数码管段选偏移量;d:数码管位选变量;e:数码管段码地址变量
while(1)     
{   
  for(il=100;il>0;il--)
  {
   e=c;
   for(i=8;i>0;i--)
   {
    P0=0xff;    //段码清零,防止数码管出现余辉
    P2=d;   //选位
    P0=seg[e];  //调用段码表
    delay(10);    //延时
    e++;    //段码加1
    if(e==c+8)   //是否最后一个数码管
    {e=c;}
    if(e==16)
    e=0;    //重新装载段码地址变量
    d=_cror_(d,1); //位选变量右移一位
   }
  }
  c++;
  if(c>15)
  c=0;

}
}

使用特权

评论回复
33
雷影少年|  楼主 | 2012-6-27 08:13 | 只看该作者
做时钟去:lol

使用特权

评论回复
34
yushiqian2012| | 2012-6-27 18:31 | 只看该作者
dakaiyanjie

使用特权

评论回复
35
sedatefire| | 2012-7-1 00:29 | 只看该作者
哎,新手上路,各种纠结,何况是软件硬件都要搞,慢慢来

使用特权

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

本版积分规则