找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5665|回复: 8
收起左侧

请大家看看这程序,单片机STC15F2K60S2

[复制链接]
ID:63752 发表于 2014-8-9 16:23 | 显示全部楼层 |阅读模式
    用定时器0,控制LED的闪灯频率。按K1,LED常亮,再按K1,LED5HZ闪烁,三按K1,LED1HZ闪烁,四按K1,LED灭。第一次上电,LED工作顺序是正常的,当按到第五次K1,LED就不是常亮,是1HZ的闪烁,顺序反过来亮了,真不解,下面是我们程序,请大家帮忙看看,谢谢~~
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sfr AUXR=0x8e;
sbit LED=P3^3;
sbit key=P2^6;
unsigned char counter;
unsigned char keycnt;
unsigned char i=0;
void Delay(uint x)
{
    uint a,b;
    for(a=x;a>0;a--)
       for(b=110;b>0;b--);
}   
void main()
{   
    //AUXR|=0x80;    //定时器0为1T模式//
AUXR&=0x7f;    //定时器0为12T模式//
    LED=1;
key=1;
TMOD=0x00;   //设置定时器0为模式0
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   //定时值初值
counter=0;
keycnt=2;
EA=1;  //开总中断//
    ET0=1; //开启内部定时器中断0;
TR0=0;  //打开定时器0
while(1)
  {
    if(key==0)
    {
      Delay(10);
    if(key==0)
     {
        i++;
     
        if(i==1)
      {
       TR0=0;
    LED=0;
      }
      if(i==2)
       {
     TR0=1;
    }   
        if(i==3)
     {
       TR0=1;
     keycnt=keycnt+28;
     if(keycnt>30)
        {
      keycnt=2;
     }
         }
      if(i==4)
         {
       TR0=0;
       LED=1;
       i=0;
      }
    }            
         }        
   
   while(!key);
   Delay(10);
  }
}

void KEYtime2() interrupt 1
{
   
TF0=0;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   //定时值初值
counter++;
if(counter>=keycnt)
  {
   counter=0;
   LED=~LED;
  }
   
}
回复

使用道具 举报

ID:19715 发表于 2014-8-9 23:03 | 显示全部楼层
本帖最后由 明白 于 2014-8-9 23:12 编辑

LED 5HZ闪烁,有点不现实,
效果要好一点的话,点亮的占空比要小一些
回复

使用道具 举报

ID:19715 发表于 2014-8-9 23:51 | 显示全部楼层
#include "reg51.h"
unsigned char count,LEDmod;
sbit KEY=P2^6;
sbit LED=P3^3;
#define LEDon LED=0
#define LEDoff LED=1
void delayms(void)
{
unsigned char i,j;
         for(i=0;i<5;i++)
         {
         for(j=0;j<200;j++);
         }
}
void main()
{
    TMOD = 0x01;      
    TL0 = 0x00;                //10毫秒@11.0592MHz设置定时初值
   TH0 = 0xDC;                //10毫秒@11.0592MHz设置定时初值
   TR0 = 1;                        
     ET0 = 1;                        
     EA = 1;                        
    count = 0;  
    LEDon;
    KEY=1;
    LEDmod=0;                  
    while (1)
        {
         if(KEY==0)
         {
          delayms();if(!KEY){++LEDmod;while(!KEY);}
         }
        }                     
}
void tm0_isr() interrupt 1
{
        TL0 = 0x00;                //10毫秒@11.0592MHz设置定时初值
        TH0 = 0xDC;                //10毫秒@11.0592MHz设置定时初值
        switch(LEDmod)
         {
         case 0:LEDon;break;
         case 1:if (++count >= 50) {count = 0;LED = ! LED;}break;
         case 2:if (++count >= 20) count = 0;
                if (count < 8) LEDon;
                        else LEDoff;
                                          break;  
         case 3:LEDoff;        break;
         case 4:LEDmod=0;break;
         default:LEDmod=0;break;
         }
}
回复

使用道具 举报

ID:63752 发表于 2014-8-10 00:44 来自手机 | 显示全部楼层
原来switch语句可以放到中断里的啊。能指点一下我那程序有什么问题吗?看了很久看不出什么原因
回复

使用道具 举报

ID:64910 发表于 2014-8-10 07:23 | 显示全部楼层
我最近也没搞定
回复

使用道具 举报

ID:63752 发表于 2014-8-10 07:44 来自手机 | 显示全部楼层
一起研究
回复

使用道具 举报

ID:63752 发表于 2014-8-11 12:44 | 显示全部楼层
没有人指导一下吗?帮帮忙呢。
回复

使用道具 举报

ID:19715 发表于 2014-8-11 14:53 | 显示全部楼层
XUSHENG 发表于 2014-8-11 12:44
没有人指导一下吗?帮帮忙呢。

#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sfr AUXR=0x8e;
sbit LED=P3^3;
sbit key=P2^6;
unsigned char counter;
unsigned char keycnt;
unsigned char i;
void Delay(uint x)
{
    uint a,b;
    for(a=x;a>0;a--)
       for(b=110;b>0;b--);
}
void disp(void)
{
    if(i==0){TR0=0;    LED=0;}
    if(i==1){TR0=1; keycnt=2;}
          if(i==2){TR0=1;keycnt=10;}   
    if(i==3){TR0=0;           LED=1;}
}  
void main()
{   
        AUXR&=0x7f;    //定时器0为12T模式//
    LED=1;
        key=1;
        TMOD=0x00;   //设置定时器0为模式0
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   //定时值初值
        counter=0;
        EA=1;  //开总中断//
    ET0=1; //开启内部定时器中断0;
        TR0=0;  //打开定时器0
        i=3;    //开始状态
   while(1)
   {
    if(key==0)
            {
              Delay(10);
                    if(key==0)
                     {
                if(++i>3) i=0;  
                        while(!key)disp();  
                }            
            }
    disp();
   }
}
void KEYtime2() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   //定时值初值
  if(++counter>=keycnt)
          {
           counter=0;
           LED=~LED;
          }
}
回复

使用道具 举报

ID:63752 发表于 2014-8-13 12:55 | 显示全部楼层
明白 发表于 2014-8-11 14:53
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int

明白了,谢谢~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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