80c51单片机 彩灯控制器程序

80c51单片机 彩灯控制器程序,第1张

你的要求也太高了吧,还是请一个软件工程师给你做啦。我们在网上回答也没有报酬,现在设计个软件也是要很多钱的。

我有个万能跑马灯程序,有10种闪灯样式,其实你只用把灯的摆放顺序打乱也可获得想要的发光样式。

#include <REG52.H>

unsigned char RunMode

void Delay1ms(unsigned int count)

{

unsigned int i,j

for(i=0i<counti++)

for(j=0j<120j++)

}

unsigned char code LEDDisplayCode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //0~7

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}

void Display(unsigned char Value)

{

P3 = LEDDisplayCode[Value]

}

void LEDFlash(unsigned char Count)

{

unsigned char i

bit Flag

for(i = 0i<Counti++)

{

Flag = !Flag

if(Flag)

Display(RunMode)

else

Display(0x10)

Delay1ms(100)

}

Display(RunMode)

}

unsigned char GetKey(void)

{

unsigned char KeyTemp,CheckValue,Key = 0x00

CheckValue = P2&0x32

if(CheckValue==0x32)

return 0x00

Delay1ms(10)

KeyTemp = P2&0x32

if(KeyTemp==CheckValue)

return 0x00

if(!(CheckValue&0x02))

Key|=0x01

if(!(CheckValue&0x10))

Key|=0x02

if(!(CheckValue&0x20))

Key|=0x04

return Key

}

unsigned int TimerCount,SystemSpeed,SystemSpeedIndex

void InitialTimer2(void)

{

T2CON = 0x00 //16 Bit Auto-Reload Mode

TH2 = RCAP2H = 0xFC //重装值,初始值 TL2 = RCAP2L = 0x18

ET2=1//定时器 2 中断允许

TR2 = 1 //定时器 2 启动

EA=1

}

unsigned int code SpeedCode[]={ 1, 2, 3, 5, 8, 10, 14, 17, 20, 30,

40, 50, 60, 70, 80, 90, 100, 120, 140, 160,

180, 200, 300, 400, 500, 600, 700, 800, 900,1000}//30

void SetSpeed(unsigned char Speed)

{

SystemSpeed =SpeedCode[Speed]

}

void LEDShow(unsigned int LEDStatus)

{

P1 = ~(LEDStatus&0x00FF)

P0 = ~((LEDStatus>>8)&0x00FF)

}

void InitialCPU(void)

{

RunMode = 0x00

TimerCount = 0

SystemSpeedIndex = 10

P1 = 0x00

P0 = 0x00

P2 = 0xFF

P3 = 0x00

Delay1ms(500)

P1 = 0xFF

P0 = 0xFF

P2 = 0xFF

P3 = 0xFF

SetSpeed(SystemSpeedIndex)

Display(RunMode)

}

//Mode 0

unsigned int LEDIndex = 0

bit LEDDirection = 1,LEDFlag = 1

void Mode_0(void)

{

LEDShow(0x0001<<LEDIndex)

LEDIndex = (LEDIndex+1)%16

}

//Mode 1

void Mode_1(void)

{

LEDShow(0x8000>>LEDIndex)

LEDIndex = (LEDIndex+1)%16

}

//Mode 2

void Mode_2(void)

{

if(LEDDirection)

LEDShow(0x0001<<LEDIndex)

else

LEDShow(0x8000>>LEDIndex)

if(LEDIndex==15)

LEDDirection = !LEDDirection

LEDIndex = (LEDIndex+1)%16

}

//Mode 3

void Mode_3(void)

{

if(LEDDirection)

LEDShow(~(0x0001<<LEDIndex))

else

LEDShow(~(0x8000>>LEDIndex))

if(LEDIndex==15)

LEDDirection = !LEDDirection

LEDIndex = (LEDIndex+1)%16

}

//Mode 4

void Mode_4(void)

{

if(LEDDirection)

{

if(LEDFlag)

LEDShow(0xFFFE<<LEDIndex)

else

LEDShow(~(0x7FFF>>LEDIndex))

}

else

{

if(LEDFlag)

LEDShow(0x7FFF>>LEDIndex)

else

LEDShow(~(0xFFFE<<LEDIndex))

}

if(LEDIndex==15)

{

LEDDirection = !LEDDirection

if(LEDDirection) LEDFlag = !LEDFlag

}

LEDIndex = (LEDIndex+1)%16

}

//Mode 5

void Mode_5(void)

{

if(LEDDirection)

LEDShow(0x000F<<LEDIndex)

else

LEDShow(0xF000>>LEDIndex)

if(LEDIndex==15)

LEDDirection = !LEDDirection

LEDIndex = (LEDIndex+1)%16

}

//Mode 6

void Mode_6(void)

{

if(LEDDirection)

LEDShow(~(0x000F<<LEDIndex))

else

LEDShow(~(0xF000>>LEDIndex))

if(LEDIndex==15)

LEDDirection = !LEDDirection

LEDIndex = (LEDIndex+1)%16

}

//Mode 7

void Mode_7(void)

{

if(LEDDirection)

LEDShow(0x003F<<LEDIndex)

else

LEDShow(0xFC00>>LEDIndex)

if(LEDIndex==9)

LEDDirection = !LEDDirection

LEDIndex = (LEDIndex+1)%10

}

//Mode 8

void Mode_8(void)

{

LEDShow(++LEDIndex)

}

void TimerEventRun(void)

{

if(RunMode==0x00)

{

Mode_0()

}

else if(RunMode ==0x01)

{

Mode_1()

}

else if(RunMode ==0x02)

{

Mode_2()

}

else if(RunMode ==0x03)

{

Mode_3()

}

else if(RunMode ==0x04)

{

Mode_4()

}

else if(RunMode ==0x05)

{

Mode_5()

}

else if(RunMode ==0x06)

{

Mode_6()

}

else if(RunMode ==0x07)

{

Mode_7()

}

else if(RunMode ==0x08)

{

Mode_8()

}

}

void Timer2(void) interrupt 5 using 3

{

TF2 = 0 //中断标志清除( Timer2 必须软件清标志!)

if(++TimerCount>=SystemSpeed)

{

TimerCount = 0

TimerEventRun()

}

}

unsigned char MusicIndex = 0

void KeyDispose(unsigned char Key)

{

if(Key&0x01)

{

LEDDirection = 1

LEDIndex = 0

LEDFlag = 1

RunMode = (RunMode+1)%9

Display(RunMode)

}

if(Key&0x02)

{

if(SystemSpeedIndex>0)

{

--SystemSpeedIndex

SetSpeed(SystemSpeedIndex)

}

else

{

LEDFlash(6)

}

}

if(Key&0x04)

{

if(SystemSpeedIndex<28)

{

++SystemSpeedIndex

SetSpeed(SystemSpeedIndex)

}

else

{

LEDFlash(6)

}

}

}

main()

{

unsigned char Key

InitialCPU()

InitialTimer2()

while(1)

{

Key = GetKey()

if(Key!=0x00)

{

KeyDispose(Key)

}

}

}

//稍微改了一下加了一个暂停键,中断方式,你需要将该键接到P3.2

#include<reg51.h>

//包含单片机寄存器的头文件

#include

<intrins.h>

/*****************************

函数功能:延时一段时间

*****************************/

unsigned

char

L[8]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}

unsigned

char

L1[8]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}

bit

pause

void

ex0isr()

interrupt

0

{

pause=~pause

}

void

delay1s(unsigned

int

i)

{

unsigned

int

j

while(i--)

{

for(j=0j<=151j++){}

}

while(pause)//实现暂停,键按一下暂停,再按一下恢复。

}

/*****************************

函数功能:主函数

*****************************/

void

main(void)

{

unsigned

char

i,j

P0

=

0x00

P1

=

0x00

P2

=

0x00

P3

=

0x00

pause=0

while(1)

{

for(j=0j<8j++)

{

P0=L[j]

delay1s(100)

}

for(j=0j<8j++)

{

P1=L[j]

delay1s(100)

}

for(j=0j<8j++)

{

P2=L[j]

delay1s(100)

}

for(i=0i<8i++)

{

P3=L[i]

delay1s(100)

}

for(j=0j<8j++)

{

P0=L1[j]

delay1s(100)

}

for(j=0j<8j++)

{

P1=L1[j]

delay1s(100)

}

for(j=0j<8j++)

{

P2=L1[j]

delay1s(100)

}

for(i=0i<8i++)

{

P3=L1[i]

delay1s(100)

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11148374.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存