找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3284|回复: 5
打印 上一主题 下一主题
收起左侧

利用单片机定时器(T0或T1都行)产生定时时钟 各位大神进来看看好不好?

[复制链接]
跳转到指定楼层
楼主
ID:100391 发表于 2017-8-7 17:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
       利用定时器(T0或T1都行)产生定时时钟,使用P3口控制八个LED灯。要求产生以下现象: 首先点亮第一个LED,并使其1秒钟闪烁10次(就是亮50毫秒 灭50毫秒),然后轮到下一个灯闪烁(亮50毫秒 灭50毫秒),依次循环。  PS:其实就是会闪烁的流水灯(第一个灯闪烁之后轮到下一个闪烁,以此类推)。

最佳答案

查看完整内容

//按你的要求,给你写了一个程序,有详细注释,已经过实验验证 #include #include #define uint unsigned int //宏定义数据类型uint #define uchar unsigned char //宏定义数据类型uchar uchar Cnt50ms=0; //中断计时 uchar num=0xfe; //中间变量 bit sign=0; //使能标志 /***********定时器初始化程序****************/ void Timer0Init(void) //50毫秒@12.000MHz { TMOD &= 0xF0; //设置定 ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2017-8-7 17:25 | 只看该作者
//按你的要求,给你写了一个程序,有详细注释,已经过实验验证
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int                 //宏定义数据类型uint
#define uchar unsigned char         //宏定义数据类型uchar
uchar Cnt50ms=0;                                        //中断计时
uchar num=0xfe;                                        //中间变量
bit sign=0;                                                        //使能标志
/***********定时器初始化程序****************/
void Timer0Init(void)                        //50毫秒@12.000MHz
{
        TMOD &= 0xF0;                                        //设置定时器模式
        TMOD |= 0x01;                                        //设置定时器模式
        TL0 = 0xB0;                                                //设置定时初值
        TH0 = 0x3C;                                                //设置定时初值
        TF0 = 0;                                                        //清除TF0标志
        TR0 = 1;                                                        //定时器0开始计时

        EA=1;                                                                //开总中断
        ET0=1;                                                        //开定时器0中断       
}
/***************主程序****************/
void main()
{
        Timer0Init();                                        //定时器初始化
        while(1)
        {
                if(sign==0)
                        P3=num;
                else P3=0xff;
        }
}
/**************中断服务程序*****************/
void timer0() interrupt        1
{
        TL0 = 0xB0;                                                //设置定时初值
        TH0 = 0x3C;                                                //设置定时初值
        Cnt50ms++;                                                //中断变量Cnt50ms自+1
        sign=~sign;                                                //使能标志取反
        if(Cnt50ms>=20)                                //1秒
        {
                Cnt50ms=0;                                        //清0
                num=_crol_(num,1);                //左移循环一位
        }
}
回复

使用道具 举报

板凳
ID:100391 发表于 2017-8-7 23:16 | 只看该作者
wulin 发表于 2017-8-7 17:25
//按你的要求,给你写了一个程序,有详细注释,已经过实验验证
#include
#include

谢谢大神,我已经用实验板验证过你的程序了,是可行的。在这里谢谢你。  另外经过一个下午加一个晚上的时间,我自己居然想出来了怎么写程序了,一下是我写的程序:
#include<reg52.h>
#include <intrins.h>
unsigned char i,t,j;
void main()                                 
{
          TMOD=0x10;//设置定时器0位工作模式        1
          TH0=(65536-50000)/256;
          TL0=(65536-50000)%256; //装初值

          EA=1;//开总中断
          ET1=1;//开定时器1中断
          TR1=1;//启动定时器1
           j=0xfe;                       
                while(1)
                 {                          
                                  if(t==1)
                                {
                                        P2=j;
                                }
                               
                                if(t==2)
                                {
                                        t=0;
                                        P2=0xff;
                                        i++;
                                }
                                 
                                 if(i==10)
                                  {
                                          i=0;
                                           j=_crol_(j,1);

                                  }
                 }                          
}

void waibuzhongduan0() interrupt 3        //中断函数不需要声明
{
         TH0=(65536-50000)/256;
         TL0=(65536-50000)%256; //装初值
         t++;                         
}
回复

使用道具 举报

地板
ID:123289 发表于 2017-8-8 10:38 | 只看该作者
这样简单的程序,自己也不愿意攻一下,建议改学CEO专业。
回复

使用道具 举报

5#
ID:100391 发表于 2017-8-8 13:22 | 只看该作者
yzwzfyz 发表于 2017-8-8 10:38
这样简单的程序,自己也不愿意攻一下,建议改学CEO专业。

我攻了。。。。只是一开始没有攻克,不过经过一晚的时间,才想出来。
回复

使用道具 举报

6#
ID:100391 发表于 2017-8-8 14:18 | 只看该作者
不好意思。。。。初值装错了,装到T0的初值去了  现在更改过来了  如下程序

#include<reg52.h>
#include <intrins.h>
unsigned char i,t,j;
void main()                                 
{
          TMOD=0x10;//设置定时器0位工作模式        1
          TH1=(65536-50000)/256;
          TL1=(65536-50000)%256; //装初值

          EA=1;//开总中断
          ET1=1;//开定时器1中断
          TR1=1;//启动定时器1
           j=0xfe;                       
                while(1)
                 {                          
                                  if(t==1)
                                {
                                        P2=j;
                                }
                                
                                if(t==2)
                                {
                                        t=0;
                                        P2=0xff;
                                        i++;
                                }
                                 
                                 if(i==10)
                                  {
                                          i=0;
                                           j=_crol_(j,1);

                                  }
                 }                          
}

void waibuzhongduan0() interrupt 3        //中断函数不需要声明
{
         TH1=(65536-50000)/256;
         TL1=(65536-50000)%256; //装初值
         t++;                          
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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