微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > C8051单片机程序

C8051单片机程序

时间:10-02 整理:3721RD 点击:
#include <c8051f020.h>
#include <MATH.H>
#define SYSCLK 12000000
int temp;
int fx=50;
sbit p0out=P0^0;
int N;
int D=10000;
int FBASE=700;  
int pwm_i;
int c_temp;
int pwm_angle;
int FF;
int valu;
int PWM_HIGH;
int PWM_LOW;
float pwm_sin;
float  M=0.9;
char  s_temp;
float code  sinx[]=
{
0,    175, 349, 523, 698, 872,1045,1219,1392,1564,1737,1908,2079,2250,
2419,2588,2756,2924,3090,3256,3420,3584,3746,3907,4067,4226,4384,4540,
4695,4848,5000,5150,5299,5446,5592,5736,5878,6018,6157,6293,6428,6561,
6691,6820,6947,7071,7193,7313,7431,7547,7660,7772,7880,7986,8090,8192,
8290,8387,8480,8572,8660,8746,8830,8910,8988,9063,9136,9205,9272,9336,
9397,9455,9511,9563,9613,9659,9703,9744,9782,9816,9848,9877,9903,9926,
9945,9962,9976,9986,9994,9999,10000               
};
void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 18.432MHz crystal
   for (i=0; i < 256; i++) ;           // Wait for osc. to start up
   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
}
void PCA_Init()
{
    PCA0MD    = 0x09;
    PCA0CPM0  = 0x4D;
    PCA0CPL0 = (0xff & (PWM_HIGH+valu)); // 初始化PCA比较值
    PCA0CPH0 = (0xff & ((PWM_HIGH+valu) >> 8));
    PCA0CN = 0x40;//允许PCA计数

}
void Port_IO_Init()
{
    P0MDOUT   = 0x01;
    XBR0      = 0x18;
    XBR2      = 0x40;
}
void Interrupts_Init()
{
    IE        = 0x80;
    EIE1      = 0x08;
    EIP1      = 0x08;
}      
void main (void)
{
   WDTCN = 0xde;
   WDTCN = 0xad;
    FF=SYSCLK/FBASE;
    valu=65536-FF;
    N=FBASE/fx;
    PWM_HIGH=(float)FF/2;
    PWM_LOW=FF-PWM_HIGH;
    pwm_i=0;
    pwm_angle=0;
    pwm_sin=0; //pwm_sin为规则采样法时三角载波的底点处的正弦值         
   
    Port_IO_Init();
    SYSCLK_Init ();
    Interrupts_Init();
PCA_Init();
while(1){
};
}
void PCA_ISR (void) interrupt 9
{
if (CCF0) {
                 CCF0 = 0; // 清除比较标志
        if (p0out)
{ // 处理上升沿   
     
                   PCA0CPM0 = 0x4c;
     if(pwm_i==N)
     {
     pwm_i=0;
     }
             pwm_i++;
          pwm_angle=(pwm_i*180)/N;        
          //规则采样,计算在每个三角波的顶点或者底点处的角度
   
       if(pwm_angle<=90)              //用查表法计算正弦波的值;根据正弦值区间不同分类讨论
          { pwm_sin=sinx[pwm_angle]/(D);}    //
        else if(pwm_angle<=180)
      
           {pwm_sin=sinx[180-pwm_angle]/(D);}
      
       // else if(pwm_angle<=270)
           //{ pwm_sin=-sinx[pwm_angle-180]/(D);} //
       // else
           //{pwm_sin=-sinx[360-pwm_angle]/(D);}
             PWM_HIGH=((float)FF*(1+M*pwm_sin))/2;  
             c_temp = valu;
             c_temp +=PWM_HIGH;
     temp = c_temp ;  
             PCA0CPL0 =temp;
    s_temp= (0xff & (temp >> 8));
            PCA0CPH0 =s_temp;
             PCA0CPM0 = 0x4D;
      }
         else {
           PCA0CPM0 = 0x4C;
              PWM_LOW=FF-PWM_HIGH;
   temp = (PCA0CPH0 << 8) | PCA0CPL0;
   temp = PWM_LOW+valu;
   PCA0CPL0 =(0xff & temp);
   PCA0CPH0 = (0xff & (temp >> 8));
     PCA0CPM0 = 0x4D;
   
   }
}
if (CF) {   
   
    CF = 0;
  //valu=valu-0xe7;
PCA0L=0xFF  & (valu-4);
PCA0H=(0xFF & (valu>>8));
}           
   
}
哪位大神能告诉我这些程序的作用,我是C8051单片机的初学者,希望向大家多多学习

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

网站地图

Top