📄 ledtest.c
字号:
/***************************************************************************************************************
** 文件名: ledtest.c
** 版 本: 1.2 备注:24M晶振, 64级亮度,单步约250us*64=16ms=63Hz
** 日 期: 2006-12-17 亮度变化1/64s 64Hz
** 描 述: 30LED循环闪烁程序
** 创建人:
/***************************************************************************************************************
** 修改人:
** 版 本:
** 日 期:
** 描 述:
****************************************************************************************************************/
#include <reg51.h>
#include <led_define.h>
#define uchar unsigned char
#define uint unsigned int
#define off 0 //led的高电平或低电平点亮设置
#define on 1
#define scan_initial_value 64 //定义亮度级数(需同时定义non_linearit数组和timer0(void)的循环值)
#define pace_time 255 //led灯队列步进时间 x * 25ms (如12*25ms等于 0.3s)
#define T0H 0xc2;//0x85; //T0的初值 设置每个LED的闪烁周期,
#define T0L 0xf7;//0xee; //设置方法:假设闪烁周期为1s, 则计算出(1s/32)的定时器初值,如1s的初值为0x85,0xee;
// 2s的初值为0x0b,0xdc;
// 0.5s的初值为0xc2,0xf7
/*------全局变量--------*/
uchar nonce_locality0; //led循环队列的当前首位置(0-29)
uchar scan1; //PWM扫描
uchar timer1_counter; //定时器1临时计数器
uchar lum[6]; //非线性亮度队列
uchar led_control[30]; //LED控制开关数组
uchar refe[6]; //时序亮度表
uchar code non_linearit[128]= //非线性亮度表 一个周期 1s,中间部位为峰值,数值范围在0~16之间,大于16则为最高亮度16
//修改该数组时千万注意数组长度为32个,值在0~16之间
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,
31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
//{0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,16,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//调试用
//{16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//调试用
//{16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16};//调试用
//{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//调试用
//{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//调试用
//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
//{0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,12,12,13,13,14,14,15,15,16,16};
/*********************************************************************************************************
** 函数名称: clr_tail
** 功能描述: 清零LED队列后的残留亮灯
** 输 入: nonce_locality0
** 输 出: led_control[x]
** 全局变量: nonce_locality0 led_control[x]
** 修改人:
** 日 期:
**********************************************************************************************************/
void clr_tail()
{uchar temp,temp2,a=10;
temp2=nonce_locality0; //led灯队列步进一位时,将最后一位清零
for(temp=5;temp!=0;temp--)
{ temp2--;
if(temp2==0xff) temp2=29;
}
while(a!=0)
{led_control[temp2]=off;
temp2--;
if(temp2==0xff) temp2=29;
a--;
}
}
/*********************************************************************************************************
** 函数名称: a
** 功能描述: PWM数据处理
** 输 入: nonce_locality led循环队列的当前首位置(0-29)
** quantity led循环队列数量
lum[6] led亮度表
** 输 出: led_control[] led控制表,(nonce_locality向后六位)
** 全局变量: lum[6] led_control[]
** 调用模块: clr_tail()
** 修改人:
** 日 期:
**********************************************************************************************************/
void a(uchar nonce_locality,uchar quantity)
{ uchar temp=0;
for( ;temp!=quantity;temp++) //led队列数量,
{
if(nonce_locality==0xff) nonce_locality=29; //30led首尾衔接
if(lum[temp]>scan1) //当led亮度计数器加1后值大于或等于参考值时,
led_control[nonce_locality]=on; // led亮
else led_control[nonce_locality]=off; // led灭
nonce_locality--;
}
clr_tail();
}
/*********************************************************************************************************
** 函数名称: b
** 功能描述: led输出至外端口
** 输 入: led_control[0~29]
** 输 出: P0,P1,P2,P3, (注:为编写简单,P^6,P^7浪费)
** 修 改: 空出p3.4,p3.5口
** 日 期: 2006-12-17
**********************************************************************************************************/
void b()
{
uchar temp1,temp2,temp3;
if(led_control[0]) temp1=temp1|0x01; else temp1=temp1&0xFE;
if(led_control[1]) temp1=temp1|0x02; else temp1=temp1&0xFD;
if(led_control[2]) temp1=temp1|0x04; else temp1=temp1&0xFB;
if(led_control[3]) temp1=temp1|0x08; else temp1=temp1&0xF7;
if(led_control[4]) temp1=temp1|0x10; else temp1=temp1&0xEF;
if(led_control[5]) temp1=temp1|0x20; else temp1=temp1&0xDF;
if(led_control[6]) temp1=temp1|0x40; else temp1=temp1&0xBF;
if(led_control[7]) temp1=temp1|0x80; else temp1=temp1&0x7F;
if(led_control[8]) temp2=temp2|0x01; else temp2=temp2&0xFE;
if(led_control[9]) temp2=temp2|0x02; else temp2=temp2&0xFD;
if(led_control[10]) temp2=temp2|0x04; else temp2=temp2&0xFB;
if(led_control[11]) temp2=temp2|0x08; else temp2=temp2&0xF7;
if(led_control[12]) temp2=temp2|0x10; else temp2=temp2&0xEF;
if(led_control[13]) temp2=temp2|0x20; else temp2=temp2&0xDF;
if(led_control[14]) temp2=temp2|0x40; else temp2=temp2&0xBF;
if(led_control[15]) temp2=temp2|0x80; else temp2=temp2&0x7F;
if(led_control[16]) temp3=temp3|0x01; else temp3=temp3&0xFE;
if(led_control[17]) temp3=temp3|0x02; else temp3=temp3&0xFD;
if(led_control[18]) temp3=temp3|0x04; else temp3=temp3&0xFB;
if(led_control[19]) temp3=temp3|0x08; else temp3=temp3&0xF7;
if(led_control[20]) temp3=temp3|0x10; else temp3=temp3&0xEF;
if(led_control[21]) temp3=temp3|0x20; else temp3=temp3&0xDF;
if(led_control[22]) temp3=temp3|0x40; else temp3=temp3&0xBF;
if(led_control[23]) temp3=temp3|0x80; else temp3=temp3&0x7F;
/*if(led_control[24]) temp4=temp4|0x01; else temp4=temp4&0xFE;
if(led_control[25]) temp4=temp4|0x02; else temp4=temp4&0xFD;
if(led_control[26]) temp4=temp4|0x04; else temp4=temp4&0xFB;
if(led_control[27]) temp4=temp4|0x08; else temp4=temp4&0xF7;
if(led_control[28]) temp4=temp4|0x10; else temp4=temp4&0xEF;
if(led_control[29]) temp4=temp4|0x20; else temp4=temp4&0xDF; */
P0=temp1;
P1=temp2;
P2=temp3;
if(led_control[24]) led_25=1; else led_25=0;
if(led_control[25]) led_26=1; else led_26=0;
if(led_control[26]) led_27=1; else led_27=0;
if(led_control[27]) led_28=1; else led_28=0;
if(led_control[28]) led_29=1; else led_29=0;
if(led_control[29]) led_30=1; else led_30=0;
//P3=temp4; //若P^6,P^7口有其它用途,在此修改
}
/*********************************************************************************************************
** 函数名称: RL
** 功能描述: 数组refe左移一位
** 输 入: refe[0~5]
** 输 出: refe[0~5]
** 修改人:
** 日 期:
**********************************************************************************************************/
void RL()
{
refe[5]=refe[4];
refe[4]=refe[3];
refe[3]=refe[2];
refe[2]=refe[1];
refe[1]=refe[0];
refe[0]=0;
}
/*********************************************************************************************************
** 函数名称: initTimer
** 功能描述: 定时器中断设置,赋初值
** 输 入: refe[0~5]
** 输 出: refe[0~5]
** 修改人:
** 日 期:
**********************************************************************************************************/
void initTimer(void)
{
TMOD=0x11;
TH0=T0H;
TL0=T0L;
TH1=0x3c;
TL1=0xb0;
}
/*********************************************************************************************************
** 函数名称: timer0 T0中断函数
** 功能描述: led亮度变化控制 完成refe累加,0~31循环,查表
** 输 入: refe[0~5]
** non_linearit[0~31]
** 输 出: lum[0~5]
**
** 全局变量: lum[6] refe[6] non_linearit[32]
** 修改人:
** 日 期:
**********************************************************************************************************/
void timer0(void) interrupt 1 //15625us
{
TH0=T0H;
TL0=T0L;
refe[0]++;
refe[1]++;
refe[2]++;
refe[3]++;
refe[4]++;
refe[5]++;
if(refe[0]==128) refe[0]=0; //64 在此改亮度级数
if(refe[1]==128) refe[1]=0;
if(refe[2]==128) refe[2]=0;
if(refe[3]==128) refe[3]=0;
if(refe[4]==128) refe[4]=0;
if(refe[5]==128) refe[5]=0;
lum[0]=non_linearit[refe[0]];
lum[1]=non_linearit[refe[1]];
lum[2]=non_linearit[refe[2]];
lum[3]=non_linearit[refe[3]];
lum[4]=non_linearit[refe[4]];
lum[5]=non_linearit[refe[5]];
}
/*********************************************************************************************************
** 函数名称: tomer1 T1中断函数
** 功能描述: LED步进控制
** 输 入: nonce_locality0 led循环队列的当前首位置(0-29)
** pace_time 预定义LED步进时间
timer1_counter T1临时计数器
** 输 出: nonce_locality0
**
** 全局变量: nonce_locality0 timer1_counter pace_time
** 调用模块: RL()
** 修改人:
** 日 期:
**********************************************************************************************************/
void timer1(void) interrupt 3 //50ms *6=0.3s
{
TH1=0x3c;
TL1=0xb0;
for(++timer1_counter;timer1_counter==pace_time;timer1_counter=0) //pace_time 灯步进时间在此修改 该数字*50ms
{
nonce_locality0++;
if(nonce_locality0==30) nonce_locality0=0; //30led首尾衔接(0~29)
RL();
refe[0]++; //nonce_locality0改变后,调用T0的亮度变化控制 否则队列第一只灯有轻微不规则闪烁
refe[1]++;
refe[2]++;
refe[3]++;
refe[4]++;
refe[5]++;
if(refe[0]==32) refe[0]=0;
if(refe[1]==32) refe[1]=0;
if(refe[2]==32) refe[2]=0;
if(refe[3]==32) refe[3]=0;
if(refe[4]==32) refe[4]=0;
if(refe[5]==32) refe[5]=0;
lum[0]=non_linearit[refe[0]];
lum[1]=non_linearit[refe[1]];
lum[2]=non_linearit[refe[2]];
lum[3]=non_linearit[refe[3]];
lum[4]=non_linearit[refe[4]];
lum[5]=non_linearit[refe[5]];
}
}
/*---主函数------------------------------------------------------------------------------*/
main()
{ uchar tep;
bit temp=1;
initTimer(); //中断定时器赋初值
TR0=1;
ET0=1;
TR1=1;
ET1=1;
EA=1;
P0=0Xff; //端口清零
P1=0xff;
P2=0xff;
P3=0xff;
for(tep=29;tep!=0xff;tep--) //led开关清零
led_control[tep]=off;
nonce_locality0=16;
while(temp)
{
a(nonce_locality0,6);
b();
scan1++;
if(scan1==scan_initial_value) scan1=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -