|
单片机源码:
- #include <STC15.h>
- #include <INTRINS.h>
- sbit PWMOUT = P3^7;
- sbit CHFWD = P3^6;
- unsigned char HighRH = 0; //高电平重载值的高字节
- unsigned char HighRL = 0; //高电平重载值的低字节
- unsigned char LowRH = 0; //低电平重载值的高字节
- unsigned char LowRL = 0; //低电平重载值的低字节
- void Delay500ms();
- void ConfigPWM(unsigned int fr, unsigned char dc);
- void ClosePWM();
- void Delay20ms(); //@6.000MHz
- void DigDisplay();
- unsigned int i;
- typedef unsigned int u16;
- typedef unsigned char u8;
- unsigned int cou;
- u8 code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳
- void delay(u16 i)
- {
- while(i--);
- }
- void main(){
- AUXR &= 0X7f;//12T
- P3M1 &= 0x00;
- P3M0 |= 0xc0;//强推挽
- cou = 1260;
- IT0 = 1;
- EX0 = 1;
- IT1 = 1;
- EX1 = 1;
- EA = 1; //开总中断
- while (1){
- ConfigPWM(15, 50); //频率 15Hz,占空比 50%
- while(i <= 45){DigDisplay();};
- i = 0;
- ClosePWM();
- ConfigPWM(20, 50); //频率 20Hz,占空比 50%
- while(i <= 60){DigDisplay();};
- i = 0;
- ClosePWM();
- ConfigPWM(36, 50); //频率 55Hz,占空比 50%
- while(i <= cou){DigDisplay();};
- i = 0;
- ClosePWM(); //关闭 PWM
- ConfigPWM(20, 50); //频率 20Hz,占空比 50%
- while(i <= 60){DigDisplay();};
- i = 0;
- ClosePWM();
- ConfigPWM(15, 50); //频率 15Hz,占空比50%
- while(i <= 45){DigDisplay();};
- i = 0;
- ClosePWM(); //关闭 PWM,相当于占空比 100%
- CHFWD = ~CHFWD;
- Delay500ms();
- }
- }
- /* 数码管显示*/
- void DigDisplay()
- {
- u16 s;
- for(s=0;s<4;s++)
- {
- switch(s)
- {
- case(0):
- P2 = 0xfe;P0 = smgduan[0]; break;
- case(1):
- P2 = 0xfd;P0 = smgduan[(cou/10)%10]; break;
- case(2):
- P2 = 0xfb;P0 = smgduan[(cou/100)%10]; break;
- case(3):
- P2 = 0xf7;P0 = smgduan[(cou/1000)]; break;
- }
- delay(3);
- P0=0xFF;
- }
- }
- void Delay27ms() //@6.000MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 1;
- j = 158;
- k = 145;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay500ms() //@6.000MHz
- {
- unsigned char i, j, k;
-
- _nop_();
- _nop_();
- i = 12;
- j = 103;
- k = 57;
- PWMOUT = 0;
- do
- {
- do
- { DigDisplay();
- while (--k);
- } while (--j);
- } while (--i);
- }
- /* 配置并启动 PWM,fr-频率,dc-占空比 */
- void ConfigPWM(unsigned int fr, unsigned char dc){
- unsigned int high, low;
- unsigned long tmp;
- tmp = (6000000/12) / fr; //计算一个周期所需的计数值
- high = (tmp*dc) / 100; //计算高电平所需的计数值
- low = tmp - high; //计算低电平所需的计数值
- high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
- low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时
- HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
- HighRL = (unsigned char)high;
- LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
- LowRL = (unsigned char)low;
- TMOD &= 0x0F; //清零 T1 的控制位
- TMOD |= 0x10; //配置 T1 为模式 1
- TH1 = HighRH; //加载 T1 重载值
- TL1 = HighRL;
- ET1 = 1; //使能 T1 中断
- TR1 = 1; //启动 T1
- PWMOUT = 1; //输出高电平
- }
- /* 关闭 PWM */
- void ClosePWM(){
- TR1 = 0; //停止定时器
- ET1 = 0; //禁止中断
- PWMOUT = 1; //输出高电平
- }
- void Add() interrupt 0
- {
- EX0 = 0;
- Delay27ms();
- if(P3^2 == 0){
- cou = cou + 10;
- }
- //while(!P3^2);
- EX0 = 1;
- }
- void Sub() interrupt 2
- {
- EX1 = 0;
- Delay27ms();
- if(P3^3 == 0){
- cou = cou - 10;
- }
- //while(!P3^3);
- EX1 = 1;
- }
- /* T0 中断服务函数,产生 PWM 输出 */
- void InterruptTimer1() interrupt 3{
- if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平
- TH1 = LowRH;
- TL1 = LowRL;
- i++;
- PWMOUT = 0;
- //DigDisplay();
- }else{ //当前输出为低电平时,装载高电平值并输出高电平
- TH1 = HighRH;
- TL1 = HighRL;
- PWMOUT = 1;
- //DigDisplay();
- }
- }
复制代码 |
评分
-
查看全部评分
|