我最近在实验七彩灯,但是亮了第十种颜 {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;
}
来自小组:
朱海生
虽然不知道,但一看程序,就想,为何定义一个颜 {MOD}不用结构体呢
typedef struct color
{
unsigned char R;
unsigned char G;
unsigned char B;
}COLOR;
COLOR colorTbl[] ={……};
这样还省去了你那样用乘法算下表耗时……
一周热门 更多>