标题:
51单片机定时器输出三路PWM,实现三基色合成演示装置的源码
[打印本页]
作者:
1715110401
时间:
2017-11-15 19:00
标题:
51单片机定时器输出三路PWM,实现三基色合成演示装置的源码
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)
2017-11-15 18:59 上传
点击文件名下载附件
51用定时器输出三路PWM,实现三基色合成演示装置
下载积分: 黑币 -5
作者:
lxa0
时间:
2017-11-15 22:05
这个还不错~~~~~~~~~~~
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1