单片机源程序如下:
- #include <stc15f2k60s2.h>
- sbit ADDR0 = P1^0; //如果是自己搭的电路,可以无视下面这几行
- sbit ADDR1 = P1^1;
- sbit ADDR2 = P1^2;
- sbit ADDR3 = P1^3;
- sbit ENLED = P1^4;
- sbit PWMOUTLED = P0^0;//用于PWM控制输出
- unsigned char heighHR0, heighLR0;//PWM一个周期中高电平高字节和低字节重载值
- unsigned char lowHR0, lowLR0;//PWM一个机器周期中低电平时高字节和低字节重载值
- void Initial();
- void ConfigPWM(unsigned int fr, unsigned char dc);
- void ClosePWM();
- void main(void)
- {
- unsigned int i;
- Initial();
-
- while (1) //呼吸灯效果
- {
- //LED亮->暗
- ConfigPWM(60, 10);//配置PWM频率为100HZ,占空比为10%
- for (i = 0; i < 30; i++); //软件测试延时大约76ms
- ConfigPWM(60, 20);//配置PWM频率为100HZ,占空比为20%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 30);//配置PWM频率为100HZ,占空比为30%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 40);//配置PWM频率为100HZ,占空比为40%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 50);//配置PWM频率为100HZ,占空比为50%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 60);//配置PWM频率为100HZ,占空比为60%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 70);//配置PWM频率为100HZ,占空比为70%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 80);//配置PWM频率为100HZ,占空比为80%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 90);//配置PWM频率为100HZ,占空比为90%
- for (i = 0; i < 30; i++);
- ConfigPWM(60, 95);//配置PWM频率为100HZ,占空比为95%
- for (i = 0; i < 60000; i++);
- //LED暗->亮
- ConfigPWM(60, 90);//配置PWM频率为100HZ,占空比为10%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 80);//配置PWM频率为100HZ,占空比为20%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 70);//配置PWM频率为100HZ,占空比为30%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 60);//配置PWM频率为100HZ,占空比为40%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 50);//配置PWM频率为100HZ,占空比为50%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 40);//配置PWM频率为100HZ,占空比为60%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 30);//配置PWM频率为100HZ,占空比为70%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 20);//配置PWM频率为100HZ,占空比为80%
- for (i = 0; i < 60000; i++);
- ConfigPWM(60, 10);//配置PWM频率为100HZ,占空比为90%
- for (i = 0; i < 60000; i++);
- ClosePWM();
- }
- }
- /*初始化*/
- void Initial()
- {
- ADDR3 = 1;
- ENLED = 0;//选择U3,即LED
- ADDR2 = 1;
- ADDR1 = 1;
- ADDR0 = 0;//LEDS6=0
- }
- /*使用T0配置PWM高低电平的频率*/
- void ConfigPWM(unsigned int fr, unsigned char dc) //fr为PWM的频率,100HZ无闪烁,dc是PWM的占空比(高电平占的百分比)
- {
- unsigned long tmp;
- unsigned int heigh, low;
- tmp = 12000000/12;//一个机器周期频率
- tmp = tmp / fr; //一个机器周期中fr的频率所需计数值(包括高电平和低电平)
- heigh = (tmp * dc) / 100;//高电平占dc%,所需计数值
- low = tmp - heigh;//低电平所需计数值
- heigh = 65536-heigh;//高电平计数初值
- low = 65536-low;//低电平计数初值
- heighHR0 = (unsigned char)(heigh >> 8);//高电平装入初值的高字节
- heighLR0 = (unsigned char)heigh; //高电平装入初值的低字节
- lowHR0 = (unsigned char)(low >> 8); //低电平装入初值的高字节
- lowLR0 = (unsigned char)low; //低电平装入初值的低字节
- TMOD &= 0xF0;//清零T0控制位
- TMOD |= 0x01;//设定T0工作方式1,16位可设定时器
- TH0 = heighHR0;
- TL0 = heighLR0;//装入高电平计数初值
- PWMOUTLED = 1;//开始时PWM输出高电平
- TR0 = 1;
- ET0 = 1;
- EA = 1;
- }
- /*关闭PWM*/
- void ClosePWM()
- {
- TR0 = 0;//关闭Timer0
- ET0 = 0;//关闭T0中断
- PWMOUTLED = 1;//PWM输出高电平
- }
- /*定时器T0中断服务*/
- void Timer0_ISP() interrupt 1
- {
- //判断PWM现在输出的是高电平还是低电平
- if (PWMOUTLED)
- {
- TH0 = lowHR0;
- TL0 = lowLR0;//装载低电平计数初值
- PWMOUTLED = 0;//PWM输出低电平
- }
- else
- {
- TH0 = heighHR0;
- TL0 = heighLR0;//重装装载高电平计数初值
- PWMOUTLED = 1;//PWM输出高电平
- }
- }
复制代码
|