一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5609|回复: 11

[其他综合] 刚写了个代码,仿真完毕,写的很笨拙,还有待改进,请高人提点

[复制链接]
发表于 2012-8-29 15:02 | 显示全部楼层 |阅读模式
仿真实现 16个LED转圈计数器  要求单片机控
制16个LED单灯左移一圈两个单位数码管数字加1显示。
数据显示范围00~99,单灯左移间隔时间为程序延时1S。
循环进行。

8888.jpg


/*
一、99走马灯
要求:仿真实现 16个LED转圈计数器  要求单片机控
制16个LED单灯左移一圈两个单位数码管数字加1显示。
数据显示范围00~99,单灯左移间隔时间为程序延时1S。
循环进行。
*/
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit D1 = P1^0;
sbit D2 = P1^1;
char code SEG7[] = {0xC0,0xF9,0xA4,0xB0,0x99,
        0x92,0x82,0xF8,0x80,0x90
         };//0,1,2,3,4,5,6,7,8,9            
//char code  LED[] = {0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE,0XFF};
void delay(uint16 k)
{
uint16 a,b;
for(a=0;a<k;a++)
  for(b=0;b<120;b++);
}
void urint()
{
P0=0XFF;
P2=0xFF;
P3=0xFF;
D1=1;
D2=1;
}
void led_play()
{
uint8 m;

for(m=0;m<10;m++)
{
  P3 = 0X7F;
  delay(1000);
  P3 = 0XBF;
  delay(1000);
  P3 = 0XDF;
  delay(1000);
  P3 = 0XEF;
  delay(1000);
  P3 = 0XF7;
  delay(1000);
  P3 = 0XFB;
  delay(1000);
  P3 = 0XFD;
  delay(1000);
  P3 = 0XFE;
  delay(1000);
  P3 = 0XFF;
  P2 = 0X7F;
  delay(1000);
  P2 = 0XBF;
  delay(1000);
  P2 = 0XDF;
  delay(1000);
  P2 = 0XEF;
  delay(1000);
  P2 = 0XF7;
  delay(1000);
  P2 = 0XFB;
  delay(1000);
  P2 = 0XFD;
  delay(1000);
  P2 = 0XFE;
  delay(1000);
  P2 = 0XFF;
  P0 = SEG7[m];
}
}
void main()
{
urint();
while(1)
{
  led_play();
}
}
发表于 2012-8-29 15:14 | 显示全部楼层
唉,不懂程序啊,只能看的份
回复

使用道具 举报

发表于 2012-8-29 15:31 | 显示全部楼层
老虎机
回复

使用道具 举报

发表于 2012-8-29 15:53 | 显示全部楼层
//char code  LED[] = {0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE,0XFF};8 c! _2 ~, @- R$ T( y
不是有这个数组吗,为什么不用呢?
回复

使用道具 举报

发表于 2012-8-29 16:36 | 显示全部楼层
回复 4# xrff_z


    可能这个是共阴的数组,而楼主用的是共阳的数码管
回复

使用道具 举报

发表于 2012-8-29 16:43 | 显示全部楼层
程序不行啊,数码管是动态扫描的,用个中断不就得了。计时器TH1做20ms延时,计时50次触发中断函数,x+1(x是我新设的),char code  LED【x】数组移位(也就是led走一个)。然后你还要另写一个数码管显示函数,然后主程序设一个变量Y(等于0就行)并把那个y给予数码管显示函数一直执行下去,什么时候中断了,y+1然后再给数码管显示函数一直执行下去。(实际上中断时数码管会灭一下,但是时间太短你看不出来)
回复

使用道具 举报

发表于 2012-8-29 17:10 | 显示全部楼层
本帖最后由 384065902 于 2012-8-29 17:12 编辑

回复 1# 酷爱diy


   才看到啊,你那个数码管显示是同一位数。不过还是不行,因为单片机输出高电平=悬空,仿真可过,实际完全不行。数码管要用共阳的。d0,d1低电平选通,输出接PNP三极管然后再驱动数码管
回复

使用道具 举报

 楼主| 发表于 2012-8-29 20:05 | 显示全部楼层
谢谢大家的指点,我现在还不想用中断定时的;先用简单的语句实现效果,现在正在想用一种语句替代2个端口;还在考虑中;数码管用的是共阳的;只是倒过来写了,电路实物的这样是不可行的,我明白怎样设计硬件,谢谢高人的指点,呵呵
今晚在写别的代码,再画别的仿真电路,不断地更新,分享我的学习效果过程
回复

使用道具 举报

发表于 2012-8-30 08:52 | 显示全部楼层
其实你可以用位移的方式来点LED的,不用这么复杂的全写出来。。。
回复

使用道具 举报

发表于 2012-8-30 10:58 | 显示全部楼层
楼上正解~~

这电路就是老虎机嘛~~
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-3 17:25 , Processed in 0.036264 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表