注册 登录
编程论坛 VB6论坛

AT89C51

huhangbin011 发布于 2015-05-26 14:41, 840 次点击
求高手帮写个AT89C51的程序,题目是倒计时30秒后8盏LED灯闪烁,准备要交作业了,还一窍不通,求高手帮帮忙吧。。谢谢
13 回复
#2
huhangbin0112015-05-26 14:43
只有本站会员才能查看附件,请 登录
这个是原理图噢
#3
huhangbin0112015-05-26 15:31
急急急,哪位大神帮帮忙呗,感激不尽啊
#4
风吹过b2015-05-26 16:03
文件格式打不开。这里应该没有电子工程学的人。
请不要上传专用格式文件。
#5
huhangbin0112015-05-26 16:07
只有本站会员才能查看附件,请 登录
我错了,这几张图片是原理图图片噢
#6
lianyicq2015-05-26 16:10
P1端口接了8个发光二极管,控制很简单的吧.设置一下定时器,中断都不需要.你那电路中很多器件都不需要.BBCN有专门的单片机版块,不过不动脑不动手地求作业,估计没人会帮你。
#7
huhangbin0112015-05-26 16:23
好吧,谢谢啦
#8
风吹过b2015-05-26 16:42
看了一下图,这个程序需要使用 C 或汇编来写。我不会。

闪烁,看了你的接线图,一个字节,8位,接8个灯。
可以使用 循环延时的方式 ,
然后 对数据取反的 形式来输出。只需要输出一个字节就行。
如第一次输出 &HAA ,1,3,5,7 灯亮,延时后,改为 &H55,0,2,4,6 灯亮

--------------
要么自己写,要么到单片机那边去问吧。
希望 你自己写。这个程序还是很简单的。

--------------
不会使用定时器的话,也可以直接使用循环延时来走秒。
但你要计算好一秒需要多少次循环。
先写好循环次数后,然后汇编,点指令条数,然后再手动计算一次就可以了。
#9
wmf20142015-05-26 16:53
我有个51的实验板,花了我整1000元,做跑马灯实在小case啊。
#10
lianyicq2015-05-26 16:56
回复 9楼 wmf2014
1000!价太高了吧.有些什么接口和芯片在上面?我还有十个CC2430也才一千多
#11
wmf20142015-05-26 17:12
回复 10楼 lianyicq
现在不知丢哪了。08年买的,上面从led灯到步进电机到串并口到液晶显示的都有,我好像只做了跑马灯和步进电机控制实验就丢一边没玩了。
#12
lianyicq2015-05-26 17:22
都忘了08年有没有淘宝。有了淘宝就便宜了。
#13
风吹过b2015-05-26 17:45
见过51的板,写过跑马灯,写过 8 位数码管,用过了那个 4 X 4 的键盘。但都忘掉了,必竞没学过 C 来。
#14
lianyicq2015-05-28 11:14
回复 楼主 huhangbin011
看了看单片机论坛,人气不旺。
P1接8个共阴极发光管,P3.7接按钮再到地,P2口接2个74ls48。P3.7按下开始倒计时,计时到,发光管开始走马。
一门课程完结远不至这点应用,应该还有改进和练手的地方。自己多琢磨。
我就抛块砖,给你一点信心,自己多学学。
程序代码:
#include <mcs51reg.h>
#include <stdbool.h>
void delay(unsigned int interval)//Delay function,unit is ms
  { unsigned int i;
     for(;interval>0;interval--)
     {for(i=0;i<124;i++)
         {;}}
  }

 
unsigned char shift(unsigned char i,unsigned char j,bool direction)//loop shift function,j is bits
  {
     if (direction==true) return (i>>(8-j)|(i<<j));
     else return (i<<(8-j)|(i>>j));
  }
unsigned char dis(unsigned char i)
  { unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    return num[i];}


 unsigned char bcd(unsigned char i)//8bits convert to 2*4bits BCD.Example 79(0100 1111) to 0111 1001
  {return(((i/10)<<4)&0xf0 |(i%10));}
   

 void main(void)

 {   //bool a=false;
     unsigned i;
     P1=0x00;
     i=30;
     while (P3_7)
     {;}
     for(;i>0;i--)
     { P2=bcd(i);
       delay(1000);}
       P2=bcd(0);
       P1=0x01;
    while(1)
    {   
       P1=shift(P1,1,true);
       delay(200); }
   

 }


1