微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于stc12c5a60s2 想实现用按键控制输出pwm占空比可调的问题

关于stc12c5a60s2 想实现用按键控制输出pwm占空比可调的问题

时间:10-02 整理:3721RD 点击:
一个按键增加亮度 一个按键减少亮度 还有一个按键用来切换不同光的值 请问谁会写这个程序
最好是c的

#include "STC12C5620AD.h"
#include <intrins.h>
/***************************大量宏定义区,便于代码移植**************************************/
#define UINT8 unsigned char  
#define UINT16  unsigned int  
#define FOSC 18432000L
#define BAUD 9600
#define MODE 1T
#ifdef  MODE 1T
#define T1MS (65536-FOSC/1000)          /*1T模式下的1ms定时*/
#else
#define T1MS (65536-FOSC/12/1000)   /*12T模式下的1ms定时*/
#endif
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER   0x80            //ADC power control bit
#define ADC_FLAG    0x10            //ADC complete flag
#define ADC_START   0x08            //ADC start control bit
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks
UINT16  count, comm;
UINT8   temp,value;
UINT8   ch;             /*AD通道*/
UINT8   data    IRcode[4];   //定义一个4字节的数组用来存储代码
UINT8   CodeTemp,charsend,i,j,k;   //编码字节缓存变量
UINT8   Adust=0;
bit     flag;
bit     GotoIRcontrol;
sbit    SM0038 = P3^2;
/**************************子函数声明区********************************************/
void USART_Init(void);
void ADC_Init(void);
void PWM_Init(void);
void SendData(UINT8 dat);
UINT8 ReceivData(void);
UINT8 GetADCResult(UINT8 ch);
void PWMSet(UINT8 a);
void Delay(UINT16 n);
void PWM_AdustLight(void);
void TIMER0_Init(void);
void IR_AdustLight(void);
void EXT0_Init(void);
void delay2ms(void);   
void delay140us(void);
void delay8ms(void);
/**********************************主函数*****************************************/
void main(void)
{
    EXT0_Init();
        USART_Init();
        ADC_Init();
        PWM_Init();
//        TIMER0_Init();
        EA = 1; //开总中断
        while(1)
         {             
                if(Adust==1)
                 {
               ES=1;                        //允许串口中断
                   if(comm==0x7a)
                    {
                       value=GetADCResult(3); /*P1.3作为AD模拟模拟输入,即第3频道*/
                           PWMSet(value);
                           SendData(value);                  /*将value发送到上位机软件显示*/
                           Delay(3);                      /*此延时为S*/
                    }
//                           //PWM_AdustLight();          /*根据value的值调整PWM的输出*/
                 }
            if(GotoIRcontrol==1)
              {
                        GotoIRcontrol=0;
                    IR_AdustLight();                                  /*红外遥控调光*/
                  }
         }
}
/**************************************************************************************
*函数名称:void USART_Init()(void)
*输    入:无
*输    出:无
*功    能:串口初始化,波特率为9600bsp
**************************************************************************************/
void USART_Init(void)
{
        #ifdef MODE 1T
           AUXR=0xC0;  /*AUXR寄存器中T0x12与T1x12决定,本程序中T0,T1都为1T模式*/
        #endif
        SCON=0x5a;                  /*工作模式1、REN接收使能位为1*/
        TMOD=0x21;
        TL1=TH1=-(FOSC/32/BAUD);
        TR1=1;
}
/**************************************************************************************
*函数名称:void SendData()
*输    入:串口要发送的数值
*输    出:无
*功    能:串口发送一个字节
**************************************************************************************/
void SendData(UINT8 dat)
{
        while(!TI);
        TI=0;
        SBUF=dat;
}
///**************************************************************************************
//*函数名称:void ReceivData()
//*输    入:无
//*输    出:返回接收值
//*功    能:串口接收一个字节
//**************************************************************************************/
//UINT8 ReceivData(void)
// {
//         while(!RI);
//         RI=0;
//         dat=SBUF;
//         return dat;
//         
// }
/**************************************************************************************
*函数名称:void UartIRQ(void)
*输    入:无
*输    出:无
*功    能:串口中断函数
**************************************************************************************/
void UartIRQ(void) interrupt 4
{
        if(RI)                                         //检测RI接收置 1
         RI=0;                                 //软件给RI 清零
         comm=SBUF;                         //读取接收到的数据
        if(comm == 0x63)                    //上位机自动查找采集器是否在线
         {                         
           comm = 0;      
       SendData(0x63);              //发送CP的ASCII码
       SendData(0x70);                                                        
         }  
         
}
/**************************************************************************************
*函数名称:void ADC_Init()
*输    入:无
*输    出:无
*功    能:ADC初始化
**************************************************************************************/
/*void ADC_Init(void)
{
        P1=P1M0=P1M1=0xFF;
        ADC_DATA=0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Delay(2);
}
/**************************************************************************************
*函数名称:UINT8 GetADCResult()
*输    入:频道ch
*输    出:频道ch的AD值
*功    能:获得频道ch的的AD值
**************************************************************************************/
/*UINT8 GetADCResult(UINT8 ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
        return ADC_DATA;          /*转化的为8位数值的结果,如果要12位的则返回ADC_LOW2*/
// }
/**************************************************************************************
*函数名称:void Delay(UINT16 n)
*输    入:n
*输    出:无
*功    能:延时函数
**************************************************************************************/
void Delay(UINT16 n)
{
        UINT16 i;
        while(n--)
         {
                 i=5000;
                while(i--);
         }
}
/**************************************************************************************
*函数名称:void PWM_Init()
*输    入:无
*输    出:无
*功    能:PWM0初始化(P3.7)
**************************************************************************************/
void PWM_Init(void)
{
        CCON=0;
        CL=0;                         /*PCA计数器低八位置0*/
        CH=0;                         /*PCA计数器高八位置0*/
        CMOD=0x02;                 /*PCA工作模式*/
        CCAPM0=0x42;         /*设置PWM0输出*/
        CCAP0L=0x00;         /*初始化设置占空比为0%*/
        CCAP0H=0x00;
        CR=1;            /*打开PCA定时器*/
}
/**************************************************************************************
*函数名称:void PWMSet(UINT8 a)
*输    入:所设PWM占空比的数值(0~FFH)
*输    出:无
*功    能:设置PWM的占空比
**************************************************************************************/
void PWMSet(UINT8 a)
{
        CCAP0L=a;
        CCAP0H=a;
}
/**************************************************************************************
*函数名称:void PWM_AdustLight(void)
*输    入:无
*输    出:无
*功    能:PWM调光函数
*备    注:
**************************************************************************************/
void PWM_AdustLight(void)
{
        if(value>=0xC0)
         PWMSet(0xE6);                                                /*占空比95%*/
        else if(value>=0x80&&value<=0xC0)
         PWMSet(0x80);                                                 /*占空比50%*/
        else if(value>=0x40&&value<=0x80)
         PWMSet(0x40);                                                /*占空比25%*/
        else
         PWMSet(0x00);                                                /*占空比0%*/
}
/**************************************************************************************
*函数名称:void TIMER0_Init()
*输    入:无
*输    出:无
*功    能:定时器0初始化
**************************************************************************************/
void TIMER0_Init(void)
{
        //TMOD=0x01;   /*在USART_Init()中已打开*/
        TL0=T1MS;      /*不用求余*/
        TH0=T1MS>>8;
        TR0=1;
        ET0=1;
  //EA=1;                  /*在USART_Init()中已打开*/
        count=0;
}
/**************************************************************************************
*函数名称:void Timer0_isr()
*输    入:无
*输    出:无
*功    能:定时器0中断函数
**************************************************************************************/
void Timer0_isr() interrupt 1
{
        TL0=T1MS;
        TH0=T1MS>>8;
        if(count-- ==0)
         {
                 count=1000;          /*5ms的定时*/
                flag=1;
         }
}
/**************************************************************************************
*函数名称:void EXT0_Init()
*输    入:无
*输    出:无
*功    能:定时器0初始化
**************************************************************************************/
void EXT0_Init(void)
{
       
        EX0= 1;//开外部中断1
        IT0 = 1;//外部中断1负边沿触发
}
/**************************************************************************************
*函数名称:void EXT0_isr(void)
*输    入:无
*输    出:无
*功    能:外部中断0函数
**************************************************************************************/
void EXT0_isr(void) interrupt 0        using 0
{
        UINT8 N = 0;
        ES=0;                        //关闭串口中断,减少对红外解码的影响
        EX0 = 0;       
        delay2ms();
        if(SM0038 == 1)
        {
                 EX0 =1;
         return;                  
        }
                                           //确认IR信号出现
    while(!SM0038); //跳过9ms低电平
        while(SM0038);//跳过4.5ms高电平
       
        for(i = 0;i < 4;i ++)        // 分别读取4个字节
        {
                for(j = 0;j < 8;j ++) //每个字节8个bit的判断
                {       
                                                                                                                                                   
                  while(SM0038 == 0);//等待上升沿      
                  while(SM0038)
                  {
                        delay140us();
                        N ++;                  //此处N用来计数
                    if(N>=30)
                         {
                                EX0 = 1;     //0.14ms计数过长自动离开。
                            return;
                         }       
                  }
                  CodeTemp = CodeTemp >> 1;                                       
                  if(N >= 8)
                   {
                         CodeTemp = CodeTemp | 0x80;
                   }
                  N = 0;
           }
           IRcode[i] = CodeTemp;
           CodeTemp = 0;
        }
        if (IRcode[2]!=~IRcode[3])
     {
           EX0=1;
       return;
         }       
   EX0 = 1;
   GotoIRcontrol=1;            /*红外调光显示标志*/
}
/**************************************************************************************
*函数名称:void delay2ms(void)
*输    入:无
*输    出:无
*功    能:延时函数
**************************************************************************************/
void delay2ms(void)   //误差 0us
{
     unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=68;b>0;b--)
            for(a=31;a>0;a--);
}

/**************************************************************************************
*函数名称:void delay140us(void)
*输    入:无
*输    出:无
*功    能:延时函数
**************************************************************************************/
void delay140us(void)   //误差 -0.026041666667us
{
    unsigned char a,b;
    for(b=103;b>0;b--)
        for(a=6;a>0;a--);
}

/**************************************************************************************
*函数名称:void delay8ms(void)
*输    入:无
*输    出:无
*功    能:延时函数
**************************************************************************************/
void delay8ms(void)   //误差 -0.054253472222us
{
    unsigned char a,b,c;
    for(c=90;c>0;c--)
        for(b=196;b>0;b--)
            for(a=1;a>0;a--);
}
/**************************************************************************************
*函数名称:void IR_AdustLight(void)
*输    入:无
*输    出:无
*功    能:PWM调光函数
*备    注:先进行分档式调光
**************************************************************************************/
void IR_AdustLight(void)
{
        temp = IRcode[2];
        if(temp==0x0C)
         {
           delay8ms();
           if(temp==0x0C)                   /*1*/
                {
                   PWMSet(0xE6);
                }
         }
        if(temp==0x18)
         {
           delay8ms();
           if(temp==0x18)                  /*2*/
                {
                   PWMSet(0xBC);
                }
         }
        if(temp==0x5E)
         {
           delay8ms();
           if(temp==0x5E)                  /*3*/
                {
                   PWMSet(0x80);
                }
         }
        if(temp==0x08)
         {
           delay8ms();
           if(temp==0x08)                  /*4*/
                {
                   PWMSet(0x4E);
                }
         }
        if(temp==0x1C)
         {
           delay8ms();
           if(temp==0x1C)                  /*5*/
                {
                   PWMSet(0x3E);
                }
         }
        if(temp==0x19)
         {
           delay8ms();
           if(temp==0x19)                  /*6用100+代替*/
                {
                   PWMSet(0x1E);
                }
         }
        if(temp==0x42)
         {
           delay8ms();
           if(temp==0x42)                  /*7*/
                {
                   PWMSet(0x14);
                }
         }
        if(temp==0x52)
         {
           delay8ms();
           if(temp==0x52)                  /*8*/
                {
                   PWMSet(0x0A);
                }
         }
        if(temp==0x0D)
         {
           delay8ms();
           if(temp==0x0D)                  /*9用200+代替*/
                {
                   PWMSet(0x03);
                }
         }
    if(temp==0x45)
         {
           delay8ms();
           if(temp==0x45)                 /*开灯*/
                {
                   PWMSet(0x10);
                }
         }
        if(temp==0x46)
         {
           delay8ms();
           if(temp==0x46)                /*关灯*/
                {
                   PWMSet(0xff);
                }
         }
        if(temp==0x09)
         {
           delay8ms();
           if(temp==0x09)                /*控制是红外还是自适应调光*/
                {
                   Adust=!Adust;                                                                               
                }
         }
}

求问这个程序里用什么控制的占空比

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top