⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 小型实时可控操作系统 单片机为msp430
💻 C
字号:
#include<msp430x16x.h>
#include"pwm_timer_b.h"
#include"LTC1450.H"
#include"setclock.h"
#include"7290.h"
#include"lcd.h"
#include"pwm.h"
#include"vf.h"
/*************************************************************
全局变量
*************************************************************/


uchar WHICH=0;
uchar SET=0;    //0 表示键盘在非读取状态
uchar RESET=1;  //1 表示重设参数 第一次进入的状态为1
unsigned long TOTAL=0;   //输入数据的十进制
unsigned char GO=0;   //无模块运行时为0
unsigned long temp_num[7];  //存储输入数据为字符串
char temp_i,tr;
char state=0;  //输入为负数时state等于1
uchar ReadBuf[2];
unsigned long frq=2048;
unsigned long scale=1024;
unsigned long  temp;
char temp1=0;
char temp2=0;
unsigned long num2,num1=1;
unsigned char display1[]="频率:";
unsigned char display2[]="占空比:";
unsigned char display_scale[]="%";
unsigned char display_Hz[]="Hz";
unsigned char displayDA1[]="电压:";
unsigned char displayDA2[]="mV";
unsigned char  fu[]="-";
unsigned char  kong[]="            ";
unsigned char _exit[]="退出:0 重设:1";
unsigned char _out[]="退出:0 ";
unsigned char erro[]="输入错误";
unsigned char dis1[]="   追求卓越       拒绝平庸      我爱电子设计";
unsigned char dis2[]="1:PWM控制      2:D/A转换      3:A/D转换      4:V/F转换";

void DAC();
void vf();

void wellcome()  {
    LCD_LcmClearTXT();
    LCD_PutStr(0,0,dis1);
    delayMS(26666);
}


void menu()  {
    LCD_LcmClearTXT();
    LCD_PutStr(0,0,dis2);
}



int main()  {
    WDTCTL=WDTPW+WDTHOLD;
    open_XT2();            //7290需要MCLK
    BCSCTL2 =SELM_2+SELS;	 
    _EINT();
    ini_7290();
    LCD_LcmInit();
    LCD_LcmClearTXT();
    
    //CD_PutStr( -1, -1,displaymy);
     
    
   //ellcome();  //欢迎并进入界面
    while(1)  {
        SET=0; 
        RESET=1;
        GO=0;
        menu();
        LPM0;   //中断函数设置which进入相应模块
        _NOP();
        switch (WHICH)  {
            case 1 :   Pwm(); break;
            case 2 :   DAC(); break;
            //case 3 :   tempreture(); break;
            case 4 :   vf();  break;
          //  case 5 :   VF();  break;
            case 0 :   break;
            default :  break ;
            
         }
        WHICH=0; 
      }
        
}

/*****************************************************************************
        键盘中断处理
*****************************************************************************/        
#pragma vector = PORT2_VECTOR
__interrupt void l7289do ()  {
  
   uchar key_num;
   IRcvStr(0x70,0x01,(uchar*)ReadBuf,2);
   key_num=ReadBuf[0] ; 
   
 if(ReadBuf[1]==0) {    //禁止连按
   switch(key_num)  {
     case 9:   key_num=4; break;
     case 10:  key_num=5; break;
     case 11:  key_num=6; break;
     case 17:  key_num=7; break;
     case 18:  key_num=8; break;
     case 19:  key_num=9; break;
     case 12:  key_num=0; break;
     case 20:  key_num=12; break; //取消
     case 4:  key_num=11; break;  //确定
     default :break;
     
   }
     
   if(SET&&key_num<13)  {  //键盘在读取状态
     get_num(key_num);
     
   goto loop2;  
   }  
   if(GO)  {      //模块正在运行,判断要退出还是重设
     if(key_num==1)  RESET=1;  
     if(key_num==0)  GO=0;
     goto loop2; 
     }
  
   if(key_num<6)    //键盘在非设置状态,选择模块
      //0  Go=0退出程序,7
       WHICH=key_num;
       
      
       }//if
    loop2: 
   LPM0_EXIT;
   P2IFG&=~0X10;
}
   


        
void  pwm_init()  {       

  ini_7290();
  TimerBInit();
  LCD_LcmInit();
  LCD_LcmClearTXT();   
  
  }    



char get_num(uchar key)  {
   
    uchar k,h;
    unsigned char WriteBuf[2];
    
     if((key<10)&&(temp_i<7))   {   //输入为数字,多于7会溢出
       WriteBuf[1]=key; 
       tr=4+temp_i;
       tr=tr&0x07;
       WriteBuf[0]=0x60+tr;   //在第 time_i 位数码管译码并显示key
       ISendStr(0x70,0x07,(uchar*)WriteBuf,2);
       temp_num[temp_i]=key;
       temp_i++;
      return 2;
     }
    if(key==11)  {  //结算 
        Clear_7290();
        if(temp_num[0]==0)   state=1;//输入为负数
          else state=0;
          
        for(k=0;k<temp_i;k++)  {
           for(h=k;h<temp_i-1;h++)  
              temp_num[k]=temp_num[k]*10;
        TOTAL=TOTAL+temp_num[k];   
         }
        SET=0;
        temp_i=0;
        temp_num[0]=0;
        Clear_7290();
        return 0;
       }
    if(key==12)   {//清除
        Clear_7290();
        for(k=0;k<7;k++)  temp_num[k]=0;
        temp_i=0;
        return 1;
        }
   
    
 }



void Pwm() {
        pwm_init();
        GO=1;
        while(GO)  {
        if(RESET) {
     
            LCD_LcmClearTXT();
            
            LCD_PutStr(0,0,display1); 
            SET=1;
            while(SET==1);
            if(TOTAL<125)  {
                LCD_PutStr(-1,-1,erro);
                delayMS(9999);
                TOTAL=0;
                continue;
               }
            LCD_PutStr(-1,-1,display_Hz);
            LCD_PutNum_l(0,3,TOTAL);
            //temp1=TOTAL;
            frq=8000000/TOTAL;
            TOTAL=0;
            LCD_PutStr(-1,-1,display_Hz);
        //  设置占空比
            LCD_PutStr(1,0,display2);
            SET=1;
            while(SET==1);
            if((TOTAL>=100)||TOTAL==0) {  
                LCD_PutStr(-1,-1,erro); 
                delayMS(999);  
                TOTAL=0;
                continue;
              }
            temp2=TOTAL;
            scale=TOTAL;
            scale=frq*scale/100;
            TOTAL=0;
            LCD_PutNum(1,4,(unsigned int)temp2); 
            LCD_PutStr(-1,-1,display_scale);
            while(0==GoPwm(100,scale,frq));
         //   LCD_PutStr(2,0,_reset);
            LCD_PutStr(3,0,_exit);
            SET=0;
            RESET=0;
          }//if
          }//while
     }



void DAC()  {
  GO=1;
  LCD_LcmInit();
  LCD_LcmClearTXT();
  LTCOpen(1);
  while(GO)  {
      if(RESET) {
         LCD_LcmClearTXT();
         LCD_PutStr(0,0,displayDA1);
         SET=1;
         while(SET==1);
         if(TOTAL>2047){   //输出越界
            LCD_PutStr(-1,-1,erro); 
            delayMS(999);  
            TOTAL=0;
            continue;
           } 
         if(state==1)  {  //把输入的负数转换为正数
           SendData(2048-TOTAL);
           LCD_PutStr(0,3,fu);
           LCD_PutNum_l(0,4,TOTAL);
          }
         else {
           SendData(TOTAL+2048);
           LCD_PutNum_l(0,3,TOTAL);
         }
         LCD_PutStr(-1,-1,displayDA2);
         TOTAL=0;
         LCD_PutStr(3,0,_exit);
         SET=0;
         RESET=0;
       }//if
   }//while
 }   



void vf()  {
    GO=1;
    _vf();
    LCD_PutStr(3,0,_out);
    while(GO==1)  { 
         LCD_PutStr(1,0,kong);
         num1=GetCyc();
         num2=8000000/num1;
         LCD_PutNum_l(1,0,num2);
        }
   
   TOTAL=0; 
   SET=0;
   RESET=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -