51单片机用自带定时器输出三路PWM的资料分享,很实用的资料,用来实现三基色合成演示装置
下面是单片机源程序:
- /**************************************************************
- **********************三基色合成演示装置***********************
- *************************淮阴师范学院**************************
- 功能说明:通过按键调节三个灯的亮度,并在串口屏上面精确的调节亮度
- 并把当前的亮度反馈在串口屏上面显示
- ***************************************************************
- **************************************************************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit PWMred = P1^5;
- sbit PWMblu = P1^6;
- sbit PWMgre = P1^7;
- sbit KeyRup = P2^2;
- sbit KeyRdown = P2^1;
- sbit KeyBup = P2^5;
- sbit KeyBdown = P2^7;
- sbit KeyGup = P2^3;
- sbit KeyGdown = P2^6;
- sbit KeyAll = P2^0;
- sbit KeyNull = P2^4;
- sbit LED1 = P0^0;//
- sbit LED2 = P0^1;//
- sbit LED3 = P0^7;
- sbit LED4 = P0^5;
- sbit LED5 = P0^3;
- sbit LED6 = P0^4;
- sbit LED7 = P0^6;
- sbit LED8 = P0^2;
- sbit LED9 = P1^0;
- unsigned char timerR=0, timerG=0, timerB=0;
- unsigned char timerNumG=0,timerNumB=0,timerNumR=0,timerNumA=0,timerNumN=0;
- uchar rec_data[5];
- uchar rec_num=0;
- uchar recdata,j=0;
- uchar dat[13]={' ',' ','.','v','a','l','=',' ',' ',' ',0XFF,0XFF,0XFF};
- void system_Ini()
- {
- IP=0x10;
- TMOD|= 0x01;
- TH0 = 0xFF; //11.0592
- TL0 = 0xCE;
- TR0 = 1;
- ET0=1;
- //IE =0x8A;
- }
- void delay(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i < 120; i++);
- }
- }
- void senddata(uchar dat)
- {
- ES = 0; //允许串口中断
- SBUF =dat;
- while(!TI);
- TI = 0;
- ES = 1; //允许串口中断
- }
- main()
- {
- system_Ini();
- //串口初始化
- SCON=0x50; //设定串口工作方式
- PCON=0x00; //波特率不倍增
-
- TMOD=0x21; //定时器1工作于8位自动重载模式, 用于产生波特率
- EA=1;
- ES = 1; //允许串口中断
- TL1=0xfd;
- TH1=0xfd; //波特率9600
- TR1=1;
- while(1)
- {
-
- //*******************红灯变亮*******************
- if(KeyRup==0)
- {
- delay(8);
- if(KeyRup==0)
- {
- while(!KeyRup==1)
- {
- timerNumR++;
- dat[0]='h';
- dat[1]=48;
- dat[7]=timerNumR/100+48;
- dat[8]=timerNumR%100/10+48;
- dat[9]=timerNumR%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='n';
- dat[7]=(timerNumR*100/255)/100+48;
- dat[8]=(timerNumR*100/255)%100/10+48;
- dat[9]=(timerNumR*100/255)%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- if(timerNumR>=255)
- {
- timerNumR=254;
- }
- delay(5);
- }
-
- }
-
- }
- //*******************红灯变暗*******************
- if(KeyRdown==0)
- {
- delay(8);
- if(KeyRdown==0)
- {
-
- while(!KeyRdown==1)
- {
- timerNumR--;
- dat[0]='h';
- dat[1]=48;
- dat[7]=timerNumR/100+48;
- dat[8]=timerNumR%100/10+48;
- dat[9]=timerNumR%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='n';
- dat[7]=(timerNumR*100/255)/100+48;
- dat[8]=(timerNumR*100/255)%100/10+48;
- dat[9]=(timerNumR*100/255)%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- if(timerNumR<=0)
- {
- timerNumR=1;
- }
- delay(5);
- }
- }
- }
- //*******************绿灯变亮*******************
- if(KeyGup==0)
- {
- delay(8);
- if(KeyGup==0)
- {
- while(!KeyGup==1)
- {
- timerNumG++;
- dat[0]='h';
- dat[1]=49;
- dat[7]=timerNumG/100+48;
- dat[8]=timerNumG%100/10+48;
- dat[9]=timerNumG%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='n';
- dat[7]=(timerNumG*100/255)/100+48;
- dat[8]=(timerNumG*100/255)%100/10+48;
- dat[9]=(timerNumG*100/255)%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- if(timerNumG>=255)
- {
- timerNumG=254;
- }
- delay(5);
- }
- }
- }
- //*******************绿灯变暗********************
- if(KeyGdown==0)
- {
- delay(8);
- if(KeyGdown==0)
- {
- while(!KeyGdown==1)
- {
- timerNumG--;
- dat[0]='h';
- dat[1]=49;
- dat[7]=timerNumG/100+48;
- dat[8]=timerNumG%100/10+48;
- dat[9]=timerNumG%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='n';
- dat[7]=(timerNumG*100/255)/100+48;
- dat[8]=(timerNumG*100/255)%100/10+48;
- dat[9]=(timerNumG*100/255)%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- if(timerNumG<=0)
- {
- timerNumG=1;
- }
- delay(5);
- }
- }
- }
- //*******************蓝灯变亮*******************
- if(KeyBup==0)
- {
- delay(8);
- if(KeyBup==0)
- {
- while(!KeyBup==1)
- {
- timerNumB++;
- dat[0]='h';
- dat[1]=50;
- dat[7]=timerNumB/100+48;
- dat[8]=timerNumB%100/10+48;
- dat[9]=timerNumB%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='n';
- dat[7]=(timerNumB*100/255)/100+48;
- dat[8]=(timerNumB*100/255)%100/10+48;
- dat[9]=(timerNumB*100/255)%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- if(timerNumB>=255)
- {
- timerNumB=254;
- }
- delay(5);
- }
- }
- }
- //*******************蓝灯变暗*******************
- if(KeyBdown==0)
- {
- delay(8);
- if(KeyBdown==0)
- {
- while(!KeyBdown==1)
- {
- timerNumB--;
- dat[0]='h';
- dat[1]=50;
- dat[7]=timerNumB/100+48;
- dat[8]=timerNumB%100/10+48;
- dat[9]=timerNumB%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='n';
- dat[7]=(timerNumB*100/255)/100+48;
- dat[8]=(timerNumB*100/255)%100/10+48;
- dat[9]=(timerNumB*100/255)%100%10+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- if(timerNumB<=0)
- {
- timerNumB=1;
- }
- delay(5);
- }
- }
- }
- //***********************全亮*********************
- if(KeyAll==0)
- {
- delay(8);
- if(KeyAll==0)
- {
- timerNumR=timerNumB=timerNumG=255;
- dat[0]='h';
- dat[1]=48;
- dat[7]=2+48;
- dat[8]=5+48;
- dat[9]=5+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- dat[0]='n';
- dat[7]=1+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='h';
- dat[1]=49;
- dat[7]=2+48;
- dat[8]=5+48;
- dat[9]=5+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- dat[0]='n';
- dat[7]=1+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='h';
- dat[1]=50;
- dat[7]=2+48;
- dat[8]=5+48;
- dat[9]=5+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- dat[0]='n';
- dat[7]=1+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- }
- }
- //***********************不亮********************
- if(KeyNull==0)
- {
- delay(8);
- if(KeyNull==0)
- {
- timerNumR=timerNumG=timerNumB=0;
- dat[0]='h';
- dat[1]=48;
- dat[7]=0+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- dat[0]='n';
- dat[7]=0+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='h';
- dat[1]=49;
- dat[7]=0+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- dat[0]='n';
- dat[7]=0+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
-
- dat[0]='h';
- dat[1]=50;
- dat[7]=0+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- dat[0]='n';
- dat[7]=0+48;
- dat[8]=0+48;
- dat[9]=0+48;
- for(j=0;j<13;j++)
- {
- senddata(dat[j]);
- }
- }
- }
- }
- }
- //定时器0中断处理函数,用于产生PWM
-
- void T1zd(void) interrupt 1 //using 1
- {
- TH0 = 0xFF;
- TL0 = 0xCE;
-
- timerR++;
- timerG++;
- timerB++;
- if(timerR>=255) timerR=0;
- if(timerR<timerNumR) PWMred=1;
- else PWMred=0;
-
- if(timerG>=255) timerG=0;
- if(timerG<timerNumG) PWMgre=1;
- else PWMgre=0;
- if(timerB>=255) timerB=0;
- if(timerB<timerNumB) PWMblu=1;
- else PWMblu=0;
- }
- //串口接收数据处理
- void deal()
- {
- rec_num=0;
- if(rec_data[4]==0x01)
- {
- timerNumR=rec_data[0];
- LED9=0;
- delay(5);
- }
- if(rec_data[4]==0x02)
- {
- timerNumG=rec_data[0];
- }
- if(rec_data[4]==0x03)
- {
- timerNumB=rec_data[0];
- }
-
- }
- //串口接收中断,数据包头为0x10,第二个字节为有用的数值,第六个字节为数据标志,最后两个字节为数据结束校验
- void serial() interrupt 4 //using 3
- {
- ES = 0;
- if(RI==1)
- {
- RI=0;
- recdata=SBUF;
- if(rec_num==0)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
三基色合成演示装置程序.zip
(45.88 KB, 下载次数: 22)
|