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

📄 main.c

📁 我用PROTEUS做了一个基于PIC16F877A的5路电压采集系统
💻 C
📖 第 1 页 / 共 2 页
字号:
 //uchar channel_temp;
// channel_temp=channel;
// do{ADCON0|=0x08;}while(channel_temp--);  //设置对应通道的寄存器
// ad_init(); //A/D初始化
 switch(channel_temp)
 {
  case 1:ADCON0=0x49;break;  //RA1通道输入
  case 2:ADCON0=0x51;break;  //RA2
  case 3:ADCON0=0x59;break;  //RA3
  case 4:ADCON0=0x61;break;  //RA5
  case 5:ADCON0=0x69;break;  //RE0
 }
 ADGO=1;
 do{;}while(1==ADGO);
 ad_date=ADRESH;
 date_temp1=ad_date<<2;
 date_temp1|=ADRESL;
 date_temp1=date_temp1*5;
 date_temp2=(float)date_temp1;  //转换成FLOAT型
 date_temp2/=1024;  //转换成电压
 date_temp1=(int)(date_temp2*100); //转换成整形
 ad_key_init();  //结束时把AD通道还给键盘
return date_temp1;
}
//***************数据显示*********************
void date_display(uint temp)
{

 //uchar temp1[]="The voltage is:   ";
// uchar temp2[]="Alarm value:      ";
 //uchar temp3[]="     ";
// uchar temp4[]="low  ";
// uchar temp5[]="high ";
 //temp=get_date();
 if(2==set)
 LCD_DisplayString(1,1,date_display_temp1); //显示"The voltage is:  "
 if(3==set)  //报警值设置
 LCD_DisplayString(1,1,date_display_temp2); //显示""Alarm value:      "

 LCD_WriteControl(0xc0);     //起始地址
 LCD_DisplayCharacter(channel+0x30);  //显示路数
 if(2==set)
// LCD_DisplayString(2,2,date_display_temp3);
  if(auto_mode==0)
  {
   LCD_DisplayCharacter(' ');  
   LCD_DisplayCharacter(' ');
   LCD_DisplayCharacter(' ');
   LCD_DisplayCharacter(' ');
   LCD_DisplayCharacter(' ');
  }
  else
  {
   LCD_DisplayCharacter('A');  
   LCD_DisplayCharacter('U');
   LCD_DisplayCharacter('T');
   LCD_DisplayCharacter('O');
   LCD_DisplayCharacter(' ');
  }
 if(3==set)
 {
  if(0==gao)   
  //LCD_DisplayString(2,2,date_display_temp4);//显示“low”
  {
   LCD_DisplayCharacter('l');  
   LCD_DisplayCharacter('o');
   LCD_DisplayCharacter('w');
   LCD_DisplayCharacter(' ');
   LCD_DisplayCharacter(' ');
  }
  if(1==gao)
 //LCD_DisplayString(2,2,date_display_temp5);//显示"high"
  {
   LCD_DisplayCharacter('h');  //显示“low”
   LCD_DisplayCharacter('i');
   LCD_DisplayCharacter('g');
   LCD_DisplayCharacter('h');
   LCD_DisplayCharacter(' ');
  }  
 }
 //LCD_WriteControl(0xc0);     //起始地址
 LCD_DisplayCharacter(temp/100+0x30);
 LCD_DisplayCharacter('.');
 LCD_DisplayCharacter(temp%100/10+0x30);
 LCD_DisplayCharacter(temp%100%10+0x30);
 LCD_DisplayCharacter('V');
 LCD_DisplayCharacter(' ');
}

//**************功能键*******************
void set_key()
{

 uint temp;  //送数据显示的暂时变量
 if(0==set){shift=0; time_display();}   //初始状态,显示时间
 if((1==set)||(0==set)) {time_seting(); time_display();}  //功能键按一次,进入时间校准模式
 if(2==set) { temp=get_date(channel);date_display(temp);}//显示电压值
 if(3==set) 
 {
  if(0==gao) temp=low[channel-1];
  if(1==gao) temp=high[channel-1];
  date_display(temp);
 }

}
//************左移键/手动模式*************
void left_key()  //
{
 if(1==set)
 {shift--;
  if(shift<1) shift=6;
 }
 if(2==set) auto_mode=0; //设定为手动模式 
 if(3==set) {gao=gao+1;if(gao>1)gao=0;}  //对高低位进行报警设置
}
//************右移键/自动模式*************
void right_key()
{
 if(1==set)
 {
  shift++; 
  if(shift>6)shift=1;
 }
 if(2==set)auto_mode=1; //设为自动模式
 if(3==set){channel++;if(channel>5)channel=1;}//对要报警的路数进行选择设置
  
 
}
//********加键****************
void add_key()
{ 
 if(1==set)add=1;
 if((2==set)&&(auto_mode==0)){channel++;if(channel>5)channel=1;}
 if(3==set)
 {
  if(0==gao) //对低位进行报警设置
  {
   low[channel-1]++;
   if(low[channel-1]>375)  low[channel-1]=250;  //低报警值为上限为3.75V
  }
  if(gao==1)
  {
   high[channel-1]++;
   if(high[channel-1]>500)high[channel-1]=375;  //高报警值下限为3.75V
  }
 }
}
//*********减键******************
void reduce_key()
{
 if(1==set)reduce=1;
 if((2==set)&&(auto_mode==0)){channel--;if(channel<1)channel=5;}
 if(3==set)
 {
  if(0==gao)
  {
   low[channel-1]--;
   if(low[channel-1]<250)low[channel-1]=375; //低报警值下限为2.50V
  }
  if(1==gao)
  {
   high[channel-1]--;
   if(high[channel-1]<375)high[channel-1]=490; //高报警值上限为5.00V
  }
 }
}
//*************报警子函数*****************
void alarm()
{
 uchar channel_i; //AD通道变量,仅用于报警
 
 if(set!=3) //在报警设置时不具备报警功能
{
 for(channel_i=1;channel_i<=5;channel_i++)
 {
  if(get_date(channel_i)>=high[channel_i-1])  //超过上限
  {
   LCD_WriteControl(0xce);     //起始地址
   LCD_DisplayCharacter(channel_i+0x30);  //显示第几路报警
   LCD_DisplayCharacter('H');
   PORTB=0x01<<(channel_i-1);
  }
  if(get_date(channel_i)<=low[channel_i-1])  //超过上限
  {
   LCD_WriteControl(0xce);     //起始地址
   LCD_DisplayCharacter(channel_i+0x30);  //显示第几路报警
   LCD_DisplayCharacter('L');
   PORTB=0x01<<(channel_i-1);
  }
 }
 if(auto_count==1)  //过1秒后情显示
 {
  LCD_WriteControl(0xce);    
   LCD_DisplayCharacter(' '); 
   LCD_DisplayCharacter(' ');
   PORTB=0x00;
 }
}
}

//************获取PC传输的数据*********************
uchar get_usart_date()
{
 uchar usart_date_temp;
 do{;}while(RCIF==0);
 RCIF=0;
 usart_date_temp=RCREG;
 return usart_date_temp;
}
//*********************************
//通过USART向PC发送数据
void send_usart_date(uchar send_temp)
{
 TXREG=send_temp;
 do{;}while(0==TXIF);
 TXIF=0;
}
//***********通过USART发送字符串*****************
void send_pc_string(const uchar *string_temp)
{
 while('\0'!=*string_temp)
 {
 // if(*string_temp=='\n')send_usart_date('\r'); //如果出现换行,则回车
  send_usart_date(*string_temp);
  string_temp++;
 }
}
//****************************
void pc_read()
{
 uchar i;
 uchar channel_pc;  //定义PC可设置的通道变量 
 uchar channel_i;
// if(get_usart_date()=='1')  //
 if(4==set)
 {
  LCD_Clear();
  LCD_DisplayString(1,4,test3);
  //pc_link_ready=1;
  //send_pc_string("Data reading..."); //PC与单片机建立连接
  //send_usart_date('\r');
 // send_usart_date('\n');  //换行回车 
   for(channel_i=1;channel_i<=5;channel_i++)
   {
    send_usart_date(channel_i+0x30);
    send_usart_date(' ');
    send_usart_date(get_date(channel_i)/100+0x30);
    send_usart_date('.');
    send_usart_date((get_date(channel_i)%100)/10+0x30);
    send_usart_date((get_date(channel_i)%100)%10+0x30);
    send_usart_date('V');
    send_usart_date(' ');
    send_usart_date(' ');
   // if(channel_i!=5)
   // {send_usart_date('\r');
    // send_usart_date('\n');  //换行回车
    //}
   }
 for(i=0;i<49;i++)
  { 
   send_usart_date('\r');
   send_usart_date('\n');  //换行回车
  } 
 }
// if(get_usart_date()=='/')
// {
//  pc_link_ready=0;  //PC与单片机建立连接
//  send_pc_string("unlink...");
  //for(i=0;i<49;i++)
 // { 
   //send_usart_date('\r');
  // send_usart_date('\n');  //换行回车
 // } 
// }
/*
 if(1==pc_link_ready)  //在建立连接的情况下
{
 for(channel_i=1;channel_i<=5;channel_i++)
   {
    send_usart_date(channel_i+0x30);
    send_usart_date(' ');
    send_usart_date(get_date(channel_i)/100+0x30);
    send_usart_date('.');
    send_usart_date((get_date(channel_i)%100)/10+0x30);
    send_usart_date((get_date(channel_i)%100)%10+0x30);
    send_usart_date('V');
    send_usart_date(' ');
    send_usart_date('\r');
    send_usart_date('\n');  //换行回车
   }
  pc_link_ready=0;  //断开连接
 
 }
*/
}

//*****************************
//************主函数******************
void main()
{
 Init_LCD();
 tmr1_init();
 ad_key_init();
 usartint();  //异步同步串行通信模块初始化
 LCD_Clear();
 LCD_DisplayString(1,1,test1);
 LCD_DisplayString(2,1,test2);
 delay_nms(500);
 LCD_Clear();
 TMR1IE=1;  //开中断
 PORTC=0x00;
 while (1)
 { 
   key=get_key();
   if(1==key) {left_key();}
   if(2==key) {reduce_key();}
   if(3==key){set++;if(set>4)set=0;}
   if(4==key){add_key();}
   if(5==key){right_key();}
   set_key();
   alarm();  //报警
   pc_read();
 }
}

⌨️ 快捷键说明

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