我C语言写了一个C51单片机的流水灯定时一秒的程序,有如下问题,求助高手改错

程序:#include<reg51.h>inti,a;voidmain(){TMOD=0x01;TH0=0xd8;TL0=0xf0;EA=1;ET0=1;TR0=1;i=... 程序:
#include<reg51.h>
int i, a;
void main()
{ TMOD=0x01;

TH0=0xd8; TL0=0xf0;
EA=1; ET0=1; TR0=1;
i=0;a=0x01;
while(1);}
void time0_int(void) interrupt 1
{ TH0=0xd8; TL0=0xf0;
i++;
if(i==100)
{P1=a;a=a<<1;
if(a==0x00)
a=0x01;
i=0;
} }
在仿真软件上运行了有如下问题:
(1)刚开始运行时八个灯全都亮了,然后才是一个一的亮。
(2)每个灯亮的时间超过了一秒。
(3)灯全都亮一边后要等挺长时间才会进行第二遍。
PS:我是读大一,还没学单片机,想进学校实验室自学的,请帮我把问题讲清楚点,谢谢!谢谢!谢谢!
要采用中断与定时器和计数器的方法,谢谢!
展开
 我来答
sting549
2011-05-04 · TA获得超过201个赞
知道答主
回答量:63
采纳率:0%
帮助的人:70.5万
展开全部
1.单片机启动时,端口为高电平即P1 = 0xff,时间比较的短,则会刚开始运行时八个灯全都亮。
2.可以50ms定时20次,即TH0 = 0x3c,TL0 = 0xb0,这样误差会小一点。
3.因为a为int型,16位的,而P1为8位的,所以第一遍和第二遍相差约8秒;将int a 改为
unsigned char a;就不会出现这样的情况了。

呵呵,希望对你有帮助,祝你顺利!
所谓的大人
2011-05-04 · TA获得超过806个赞
知道答主
回答量:128
采纳率:0%
帮助的人:112万
展开全部
#include<reg51.h>
void delay(void)
{
unsigned char i,j;
for(i = 0;i < 255;i++) for(j = 0;j < 255;j++);
}
void main(void)
{
unsigned char j = 0x01;
while(1)
{
j = j << 1;
if(j == 0x00) j = 0x01;
P0 = j;
delay(225);//括号你们的数字随便你调吧!我以前用的时候好像250是1S钟,你自己调节一下吧
}
1;启动就全亮,是因为你没对P1口进行复位,默认的为高电平,所以会全亮
你在最前面加句P0=0X00;就可以解决了。
2建议你使用Delay函数比较好,这个延时自己可以调节的,就改变括号的数字就可以了。
好像有它的时间计算公式的,我忘记的,大致1S是250吧。
3你那个while语句用的我不太理解,怎么跑一死循环,但是里面又没给语句呢?也没看见
你有什么结束语句的。你还是好好看看while语句的用法吧!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jxjsyg
2011-05-04 · 超过16用户采纳过TA的回答
知道答主
回答量:124
采纳率:0%
帮助的人:50.8万
展开全部
#include<reg51.h>
unsigned char i;
void main()
{ TMOD=0x01;
TH0=0xd8; TL0=0xf0;
EA=1; ET0=1; TR0=1;
i=0;P1=0x01;
while(1);}
void time0_int(void) interrupt 1
{ TH0=0xd8; TL0=0xf0;
i++;
if(i==100)
{P1=P1<<1;
if(P1==0x00)
P1=0x01;
i=0;
} }
帮你改了一下程序,你再看看吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xiaobin0602
2011-05-04 · 超过31用户采纳过TA的回答
知道答主
回答量:159
采纳率:0%
帮助的人:104万
展开全部
所谓的大人 你的3问题 亮了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式