找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2079|回复: 10
收起左侧

通过单片机定时器的方式实现流水灯延时,求指导实现思路

[复制链接]
ID:938403 发表于 2021-11-17 21:08 | 显示全部楼层 |阅读模式
通过定时器的方式实现流水灯延时,并通过外部中断改变流水灯样式。两种样式分别为:(1)4个led为一组交替亮灭,延时1s;(2)从左往右逐个点亮(同一时刻只有一个灯亮),延时1s。用C51程序编写
回复

使用道具 举报

ID:752974 发表于 2021-11-18 08:48 | 显示全部楼层
自己按要求画个流程图,按着流程图的步骤写就可以了。不然的话如何进步!
回复

使用道具 举报

ID:123289 发表于 2021-11-18 13:40 | 显示全部楼层
是来布置作业的,哪位学生来做啊。
回复

使用道具 举报

ID:938403 发表于 2021-11-19 09:52 | 显示全部楼层
#include <reg51.h>
#define uchar unsigned char
uchar count;
sbit k=P3^2;
void main(void)
{EA=1;
IT0=1;
EX0=1;
TMOD=0x01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;       
P1=0x0F;
while(1)
;}
void INTO()interrupt 0
{
uchar i;
while(1)
{
P1=0x0f;
for(i=0;i<8;i++)
{P1>>=1;}
}
}
void timer0() interrupt 1
{
        TH0=0X3C;
        TL0=0XB0;
        count++;
        if(k==0)
        {
        if(count==20)
        {
                count=0;
                P1=~P1;}
        }
        else
        {if(count==20)
                {
                        count=0;
                        P1>>1;}}}
这个程序烧录进去失败了,哪里有问题呀?
回复

使用道具 举报

ID:938403 发表于 2021-11-19 09:56 | 显示全部楼层
munuc_w 发表于 2021-11-18 08:48
自己按要求画个流程图,按着流程图的步骤写就可以了。不然的话如何进步!

#include <reg51.h>
#define uchar unsigned char
uchar count;
sbit k=P3^2;
void main(void)
{EA=1;
IT0=1;
EX0=1;
TMOD=0x01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;       
P1=0x0F;
while(1)
;}
void INTO()interrupt 0
{
uchar i;
while(1)
{
P1=0x0f;
for(i=0;i<8;i++)
{P1>>=1;}
}
}
void timer0() interrupt 1
{
        TH0=0X3C;
        TL0=0XB0;
        count++;
        if(k==0)
        {
        if(count==20)
        {
                count=0;
                P1=~P1;}
        }
        else
        {if(count==20)
                {
                        count=0;
                        P1>>1;}}}
这个为什么失败了?
回复

使用道具 举报

ID:624769 发表于 2021-11-19 10:18 来自手机 | 显示全部楼层
不管你有没有按键,你的count都会定时++,你想象一下,等你按键的时候已经count=21了,会怎么样?
回复

使用道具 举报

ID:938403 发表于 2021-11-19 10:42 | 显示全部楼层
188610329 发表于 2021-11-19 10:18
不管你有没有按键,你的count都会定时++,你想象一下,等你按键的时候已经count=21了,会怎么样?

那不用按键吗?
回复

使用道具 举报

ID:938403 发表于 2021-11-19 10:44 | 显示全部楼层
188610329 发表于 2021-11-19 10:18
不管你有没有按键,你的count都会定时++,你想象一下,等你按键的时候已经count=21了,会怎么样?

那如何通过外部中断改变两种样式?
回复

使用道具 举报

ID:624769 发表于 2021-11-19 11:07 来自手机 | 显示全部楼层
手机编辑太麻烦,简单跟你讲吧,你把k==0,和紧跟下面count互换一下,
回复

使用道具 举报

ID:624769 发表于 2021-11-19 11:53 | 显示全部楼层
不明白你需要达到什么效果, 我就瞎猜吧
void timer0() interrupt 1
{
        TH0=0X3C;
        TL0=0XB0;
        count++;
//        if(k==0)      //搬下去
        if(count==20) // 搬上来
        {
//        if(count==20)  //搬上去
        count=0;   //合二为一 到这里
        if(k==0)      //搬下来
        {
//                count=0;   //合二为一
                P1=~P1;}
        }
        else
        {if(count==20)
                {
//                count=0;   //合二为一
                        P1>>1;}}}
回复

使用道具 举报

ID:624769 发表于 2021-11-19 12:34 | 显示全部楼层
整理后,如下:

void timer0() interrupt 1
{
        TH0=0X3C;
        TL0=0XB0;
        count++;
        if(count==20)
        {
                count=0;
                if(k==0)        P1=~P1;
                else    P1 >>=1;
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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