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

📄 main._c

📁 数控电压源程序数控电压源程序数控电压源程序数控电压源程序
💻 _C
字号:
//包含所需头文件
#include <ioM16v.h>
#include <macros.h>
#include "delay.h"
#include "LCD1602.H"
#include "boxing.h"
/*------宏定义------*/
#define uchar	unsigned char
#define uint	unsigned int

#define DAC_DATA    PORTB
#define DAC_DDR     DDRB

uint Adverage_vol;
long  adc_vol=0;
long read_vol=0;
unsigned int adc_calc(void);
void control(void);
uchar ad_is_ok=0;
void adc_init(void);

unsigned char ad_flag=0;
uint  AD_COUNT=0;
uint counter=0;
uint time_delay=0;
uint key_is_ok=0;
uint key_value1=16;
uint key_value2=16;
uint Set_Value=10;
uchar Set_Value_H;
uchar Set_Value_L;

uint VOL_L=0;
uint VOL_H=0;
uint VOL_H0=0;
uint VOL_L0=0;

uchar VOL_P=0;
uchar real_vol=0;

uchar clear_flag=0;
uchar ahead_flag=0;
uchar back_flag=0;
uint setting_val;
uchar ENTER=0;
static uchar  state=0,cn=0;
uint SET_VALUE[4];

uchar welcome[] = {"volt-source"};      //开机欢迎文字
uchar st[] = {"System-starting"}; 
uchar setting[] = {"set:"};   //设定值
uchar measure[] = {"Measure:"};   // 测量值
uchar error[]={"error"};


void system_init()
{
  Write_Position(1,1);
  Write_String(welcome);
  Write_Position(2,1);
  Write_String(st);
  delay_nms(1500);
  Clear_Screen;
}
 //用于将十进制数转换成IO口上的二进制数
uchar  dec_to_bin(uint data)
{

  uint i=0;
  uint temp=0;
  uchar temp1=0x00;
  temp=data;
  for(;i<8;i++)
  {
   if((temp%2)==1)
	{
	 temp1 |=(1<<i);
	
	 }
   if((temp%2)==0) 
	{
	 temp1 &=~(1<<i);
	 }
	 temp =temp/2;
   }
 
	 return (temp1);
}

void Display_VOL(void)
{
 // Set_Value=10*SET_VALUE[1]+SET_VALUE[3];
  Set_Value_H=Set_Value/10+0x30;
  Set_Value_L=Set_Value%10+0x30;
  Write_Position(1,1);
  Write_String(setting);
  
  Write_Position(1,5);
  Write_Data(Set_Value_H);
  Write_String(".");
  Write_Data(Set_Value_L);
  Write_String("v");
 
  adc_vol=Adverage_vol*2+40;//作为补偿电压值
  VOL_H0=adc_vol/1000+0x30;
  VOL_H=adc_vol/100%10+0x30;
  VOL_L0=adc_vol/10%10+0x30;

  Write_Position(2,1);
  Write_String("real_vol:");
  Write_Position(2,10);
  Write_Data(VOL_H0);
  Write_Data(0x2e);
  Write_Data(VOL_H);
  Write_Data(VOL_L0);
  Write_Position(2,14);
  Write_String("v");
 
}
#define key_mask  0b00001111
uint KeyScan(void)
{
 static uint key_value,key_line;
 uint key_return=16;
 uchar i;
 DDRD=0xf0;
   key_line=0b00010000;
   for(i=1;i<=4;i++)
   {
   PORTD=~key_line;
   PORTD=~key_line;
   key_value=key_mask&PIND;
   if(key_value==key_mask)
     key_line<<=1;
     else
	 break;
   }
	delay_nms(5);
  if(key_value==(key_mask&PIND))
   {
    
    switch(key_line|key_value)
    {
    case 0b00011110:key_return=7;
	                break;
	case 0b00011101:key_return=8;
	                break;
	case 0b00011011:key_return=9;
	                break;	
	case 0b00010111:key_return=11;
	                break;	
	case 0b00101110:key_return=4;
	                break;	
	case 0b00101101:key_return=5;
	                break;
    case 0b00101011:key_return=6;
	                break;	
	case 0b00100111:key_return=10;
	                break;		
	case 0b01001110:key_return=1;
	                break;	
	case 0b01001101:key_return=2;
	                break;
	case 0b01001011:key_return=3;
	                break;	
	case 0b01000111:key_return=12;
	                break;		
	case 0b10001110:key_return=0;
	                break;	
	case 0b10001101:key_return=13;//小数点
	                break;		
	case 0b10001011:key_return=14;//ENTER
	                break;		
	case 0b10000111:key_return=15;//启动自动扫描
	                break;																																
     }
  }
    return key_return;
}


void read_keyvalue()
{  
   uint temp=0;
   uint i=0;
   uchar  keycode=16;
   keycode=KeyScan();
   if(((keycode >=0)&&(keycode <=9)&&(cn < 4))||((keycode ==13)&&(cn == 1)))
   {
    cn++;
    switch(keycode)

      {

       case 0:temp=0;SET_VALUE[cn]=temp;break;

       case 1:temp=1;SET_VALUE[cn]=temp;break;

       case 2:temp=2;SET_VALUE[cn]=temp;break;

       case 3:temp=3;SET_VALUE[cn]=temp;break;

       case 4:temp=4;SET_VALUE[cn]=temp;break;

       case 5:temp=5;SET_VALUE[cn]=temp;break;

       case 6:temp=6;SET_VALUE[cn]=temp;break;

       case 7:temp=7;SET_VALUE[cn]=temp;break;

       case 8:temp=8;SET_VALUE[cn]=temp;break;

       case 9:temp=9;SET_VALUE[cn]=temp;break;
	 
       case 13:temp=0x2e;SET_VALUE[cn]=temp;break;
	    

     }
	
	  if((cn==2)&&(SET_VALUE[2]!=0x2e))
	  {
	  Write_Position(1,5); 
	  Write_String(error);
	  } 
	 Set_Value=10*SET_VALUE[1]+SET_VALUE[3];
	 Display_VOL();
   }
  
   if(cn == 3)//输入预定电压值完毕
   {
     
     if(KeyScan()==14)//等待ENTER键按下
	 {
	  cn=0;
	  ENTER=1;
	 }
   }
     
   if(KeyScan()==11)
	{
	  ahead_flag=1;
	}
	if(KeyScan()==10) 
	{ 
	 back_flag=1;
	}
     if(KeyScan()== 12)
	 {    
	  clear_flag=1;
	 }   
 
 
    
} 

static uchar auto_flag=0;
void signal_function(void)
{
  switch(auto_flag)
  {
  case 0:Write_Position(1,12);
         Write_String("off");
		 if(KeyScan()==15)  
          auto_flag=1; 
         break;
  case 1:
         Write_Position(1,12);
         Write_String("+  ");
         if(Set_Value<99)
         {
          Set_Value++;
          DAC_DATA=Set_Value;
		  control();
         }
		 else
		   auto_flag=2;
		 if(KeyScan()==15)
          auto_flag=2;
          break;
  case 2:
       Write_Position(1,12);
       Write_String("-  ");
        if(Set_Value>0)
        {
         Set_Value--;
         DAC_DATA=Set_Value;
		 control();
        }
		 else
		  auto_flag=1;
		 if(KeyScan()==15) 
          auto_flag=3;
          break;
  case 3:Write_Position(1,12);
         Write_String("squ");
		 while(auto_flag ==3)
         {
          DAC_DATA=0x00;
          delay_nms(50);
          DAC_DATA=0xff;
          delay_nms(10);
          if(KeyScan()==15)
	       auto_flag=4;
         }
         break;
  case 4:
         Write_Position(1,12);
         Write_String("saw");
		 while(auto_flag == 4)
         {
          uint  i=255;
		  
          for(;i>0;i--)
		  {
		    DAC_DATA=i;
			delay_nus(10);
	      }
		 if(KeyScan()==15)
	      auto_flag=0;
         }
         break;
 /* case 4:
         Write_Position(1,12); 
         Write_String("sin"); 
		  for(;auto_flag == 4;)
         {
		  
		   uint i;
		   for(i=0;i<=200;i++)
		   {
		    DAC_DATA=Sin[i];
			delay_nus(10);
		   
		   if(KeyScan()==15)
	        auto_flag=5;
         }
         break;*/
  }

}
void function_DAC()
{
  if(ENTER==1)
 {
  ENTER=0;
  DAC_DATA=Set_Value;
  control();
 }
 if(ahead_flag)
 {
   ahead_flag=0;
   if(Set_Value<99)
	{
	  Set_Value++;
	  DAC_DATA=Set_Value;
	  control();
   }
 }
 
 if(back_flag)
 {
   back_flag=0;
    if(Set_Value>0)
	{
	 Set_Value--;
	 DAC_DATA=Set_Value;
	 control();
	}
 }
 
 if(clear_flag)
 {
  uint i=0;
  clear_flag=0;
  auto_flag=0;
  cn=0;
  Clear_Screen;
  for(i=0;i<4;i++)
   {
	SET_VALUE[i]=0;
   }
  Set_Value=0;
  DAC_DATA=Set_Value;
  control();
 }
}

uint temp_vol=0;
uint temp_value=0;
uchar temp_H,temp_L;
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
  unsigned long int voltage;
  voltage=adc_calc();
  Adverage_vol=voltage;
  ad_flag=1;
}

 void control(void)
 {
  temp_vol=2*Adverage_vol+45;
  temp_vol=temp_vol/100;
  temp_value=Set_Value;
  if(cn ==0)
  {
   while(temp_vol < Set_Value)
   {
      if(temp_value>=255);
	   else
	   temp_value++;
	  DAC_DATA=temp_value;
	  ADCSRA|=BIT(ADSC);
	  while(!ad_flag);
	  ad_flag=0;
	  temp_vol=(unsigned int)2*Adverage_vol+40;
      temp_vol=(unsigned int)temp_vol/100;
   }
  
   while(temp_vol> Set_Value)
   {
    if(temp_value <=0) ;
	  else
      temp_value--;
	  DAC_DATA=temp_value;
	  ADCSRA|=BIT(ADSC);
	  while(!ad_flag);
	  ad_flag=0;
	  temp_vol=(unsigned int)2*Adverage_vol+40;
      temp_vol=(unsigned int)temp_vol/100;
   }
  }   
 }

 
//端口初始化
void port_init(void)
{
 PORTA = 0x00;//低三位作为1602控制端
 DDRA  = 0x07;//低三位作为1602控制端
 PORTD = 0x0F;//矩阵键盘的接口
 DDRD  = 0xF0;
 PORTB = 0x00;//DAC0832的数据控制端
 DDRB  = 0xFF;//DAC0832的数据控制端
 PORTC = 0x00;//PC口作为1602的数据端
 DDRC  = 0xFF;//PC口作为1602的数据端
}

//定时器T0初始化
void timer0_init(void)
{
 TCCR0  = 0x00;//停止定时器
 TCNT0 = 0x25;//初始值
 OCR0   = 0xC0;//匹配值
 TIMSK |= 0x02;//中断允许
 TCCR0  = 0x04;//启动定时器
}


//T0比较中断服务程序
#pragma interrupt_handler timer0_comp_isr:20
void timer0_comp_isr(void)
{
 //中断发生时刻在TCNT0=OCR0
    
  if(++counter>=4)
  {
   counter=0;
   key_is_ok=1;
  }
  if(++AD_COUNT>=5)
  {
   AD_COUNT=0;
   ad_is_ok=1;
  } 
  
}
 

void init_devices(void)
{
 CLI(); //禁止所有中断
 MCUCR  = 0x00;
 GICR   = 0x00;
 port_init();
 Initialize_LCD();
 timer0_init();
 adc_init();
 SEI();//开全局中断
}

//主函数

void main(void)
{
uint i=0,keycode=16;
 init_devices();
 //在这继续添加你的代码
 system_init();
 DAC_DDR=0xff;
 DAC_DATA=Set_Value;

 while(1)
 { 
   Display_VOL();
   function_DAC();
   control();  
   signal_function();
   control();  
   if(key_is_ok)
   {
    read_keyvalue();
	key_is_ok=0;
   } 
   if(ad_is_ok)
   {
    ad_is_ok=0;
    ADCSRA|=BIT(ADSC);
   } 
 }
}

⌨️ 快捷键说明

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