七彩灯的程序问题

2019-07-15 20:09发布

       我最近在实验七彩灯,但是亮了第十种颜 {MOD}之后程序就卡死了,剩下的颜 {MOD}无法出现。我用UV4反汇编窗口,甚至用串口发程序运行的数据到电脑都找不出问题。请大神们帮我看看这是怎么回事。谢谢!!!!
        我用的七彩灯是四只脚的,共阳。用了八个灯,占用了32个IO口。芯片是STC89C52RC。我的程序的想法是这样的:比如要亮橙 {MOD},找出RGB值“0xff,0x66,0”,然后我用PWN同时实现R,G,B相对应的亮度,就可以亮出漂亮的橙 {MOD}。
        本来我想亮出三十多种颜 {MOD}的,但亮到第十种颜 {MOD}后程序就不动了。我程序里有单片机与电脑的串口通信,每隔段时间换一种颜 {MOD}就发颜 {MOD}序号给STC串口助手,开始能正常发送,但单片机卡死后就像疯了似的猛发 “0”或“F0”给电脑,让我疑惑不解。下面是我的灯





    这是程序
#include <REGX52.H>
#define red P0                 //红 {MOD}
#define green P2        //绿 {MOD}
#define blue P3                //蓝 {MOD}
unsigned char jishu=0;    //定时器0中断一次加一
unsigned char code shuju[]={
                                                        0xff,0,0,  0xff,0x33,0,  0xff,0x66,0,  0xff,0x99,0,  0xff,0xcc,0,  0xff,0xff,0,
                                                        0xcc,0xff,0,  0x99,0xff,0,   0x66,0xff,0,  0x33,0xff,0,  0,0xff,0,
                                                        0,0xff,0x33,  0,0xff,0x66,  0,0xff,0x99,  0,0xff,0xcc,  0,0xff,0xff,
                                                        0,0xcc,0xff,  0,0x99,0xff,  0,0x66,0xff,  0,0x33,0xff,  0,0,0xff,
                                                        0x33,0,0xff,  0x66,0,0xff,  0x99,0,0xff,  0xcc,0,0xff,  0xff,0,0xff,
                                                        0xff,0,0xcc,  0xff,0,0x99,  0xff,0,0x66,  0xff,0,0x33,  0xff,0,0
                                                        };        //每一种颜 {MOD}的三种RGB值。值越大,对应亮度越大
void main()
{
  unsigned char a;
  unsigned char color=0;
  EA=1;
  ET0=1;                   //开定时器0
  TMOD=0X22;           //定时器0和1都用模式2,自动填装
  SCON=0X50;           //串口中断用模式1
  TH0=0XD8;                   //40微妙中断一次
  TL0=0XD8;
  TH1=0XF3;                   //2400波特率的初值,板子使用12M晶振,初值=256-12000000/32/12/2400
  TL1=0XF3;
  TR0=1;
  TR1=1;
  while(1)
  {
    for(a=0;a<100;a++) //决定了颜 {MOD}转换的时间间隔
        {
          do
          {
                    if(jishu<shuju[color*3])
                        {
                          red=0;
                        }
                        else red=0xff;
                        if(jishu<shuju[color*3+1])
                        {
                           green=0;
                        }
                         else green=0xff;
                         if(jishu<shuju[color*3+2])
                        {
                           blue=0;
                        }
                         else blue=0xff;
          }while(jishu<255);        //用PWN增大或减小相应RGB的亮度,形成 {MOD}彩
          
           jishu=0;
        }
        color++;   //换下一个颜 {MOD}
        SBUF=color;          //把对应颜 {MOD}通过RS232发送到电脑上
        while(ti==0);
    TI=1;
        if(color>30)color=0;          
  }
}
void timer0()interrupt 1
{
  TR0=0;
  jishu++;
  TR0=1;
}

来自小组: 朱海生
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
bj2008wyou
1楼-- · 2019-07-16 01:47
本帖最后由 bj2008wyou 于 2014-4-17 00:07 编辑

虽然不知道,但一看程序,就想,为何定义一个颜 {MOD}不用结构体呢

typedef struct color
{
    unsigned char R;
    unsigned char G;
    unsigned char B;
}COLOR;

COLOR colorTbl[] ={……};
这样还省去了你那样用乘法算下表耗时……
bj2008wyou
2楼-- · 2019-07-16 02:56
是不是因为没有在中断里给定时器中断清除标志?

然后是你这中断时间太短了,可不太好,说不定在某一次进入do while()时,刚比较完前面2次,在第三次将要用到jishu这个变量时,中断来了,就修改了jishu的值,使得在这一次do while()循环里,可能本该是三次比较所用到的jishu变量的值是一样的,结果变成了前两次是一样,后一次就跟前2次不一样了……
君临也
3楼-- · 2019-07-16 07:18
bj2008wyou 发表于 2014-4-17 00:16
是不是因为没有在中断里给定时器中断清除标志?

然后是你这中断时间太短了,可不太好,说不定在某一次进入 ...

  感谢你的热心!!!谢谢你为了我费了那么多精力!!!
  你说用结构体这个建议很好,不用浪费那么多时间。而且中断时间也实在不能这么短。我改正了之后彩灯就可以正常转换颜 {MOD}了!!你真是一语中的!!但是那个串口通信的的中断标志我的确有清零,但单片机仍旧不断的向电脑串口助手发送“0”  或“0f0”,令人疑惑不解

一周热门 更多>