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

📄 main.c

📁 我用PROTEUS做了一个基于PIC16F877A的5路电压采集系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
发送一次“*”,建立连接,发送二次,释放连接
*/
#include <pic.h>

#define uint unsigned int
#define uchar unsigned char
//**********函数声明*************
void  Init_LCD(void);
void LCD_Clear(void);
void delay_nms(unsigned int); 
 void LCD_DisplayString (char, char ,unsigned char*);
void LCD_DisplayCharacter(char);
void LCD_WriteControl(uchar);

void tmr1_init(void);
void ad_key_init(void); //键盘初始化
//void ad_init(void);

void set_key(void);
void add_key(void);
void reduce_key(void);
void right_key(void);
void left_key(void);
uchar key_result(void);
uchar get_key(void);
void time_seting(void);

uint get_date(uchar);  //获取AD转换值
void date_display(uint);  //显示电压值

void alarm(void); //报警

void usartint(void);  //异步同步串行通信模块初始化
uchar get_usart_date(void); //获取PC的数据
void pc_read(void);  //pc 读取电压值
//****************************************
bank1 uchar test1[]="Designer:";
bank1 uchar test2[]="Fan enzeng";
bank1 uchar test3[]="pc-mcu";
bank1 uchar i=0;
bank1 uint count=0; //tmr1计数,计满1000为一秒
bank1 uchar auto_count=0;  //自动模式各路显示时间 30s

bank1 uchar ad_key_result; //存放ADKEY转换的值
bank1 uchar shift=0,add=0,reduce=0,set=0; //各个功能键
bank1 uchar key;  //存放键值

bank1 uchar second=0,minute=0,hour=0,day=1,month=1;
bank1 uint year=2008;
bank1 uchar tian1[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年
bank1 uchar tian2[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //平闰

bank1 uchar channel=1;  //路数标志位
bank1 uchar ad_date;//存放AD转换值
bank1 uchar auto_mode=0; //显示模式, 手动/自动
/*
 struct waring  //高低报警值
{
 uint channel_1;
 uint channel_2;
 uint channel_3;
 uint channel_4;
 uint channel_5;
};
*/
bank2 uint low[5]={250,250,250,250,250};
bank2 uint high[5]={490,490,490,490,490};  //报警值初始化
bank2 uchar gao=0; //高低位报警设置标志位,默认为低位,可通过left(低)和right(高)键设置

//****************数据显示函数中的显示内容*****************************
uchar date_display_temp1[]="The voltage is:";
uchar date_display_temp2[]="Alarm value:      ";
uchar date_display_temp3[]="     ";
bank2 uchar date_display_temp4[]="low  ";
bank2 uchar date_display_temp5[]="high ";

bank2 float date_temp2;

/***********USART***********************
!!!!!!注意在发送的字符串后边需加'/'!!!!!!!!!
可以用‘*’进行清屏
**********************************/
bank2 uchar pc_link_ready=0; //PC与单片机连接成功标志位,1代表连接成功 
//*******************************************************************

//*********tmr1中断*****************
 void interrupt time(void)
{TMR1H=0xfc;
 TMR1L=0x18;  //1ms
 TMR1IF=0; 
 count++;
 if(count>1000)
 {
  count=0;
  second++;
  auto_count++;
  if(auto_count>1)
  {
   auto_count=0;
   if((auto_mode==1)&&(2==set))
   {
    channel++;
    if(channel>5)channel=1;  //在自动模式下,路数自增
    
   }
  }
  if(second>=60)
 {
  second=0;
  minute++;
  if(minute>=60)
  {
   minute=0;
   hour++;
   if(hour>=24)
   {
    hour=0;
    day++;
    if((year%4==0)&&(year%100!=0)||(year%400==0))  //判断闰年
    { if(day>tian2[month-1])  //闰年
     {
      day=1;
      month++;
     }
    }
    else if(day>tian1[month-1])   //非闰年
         {
          day=1;
          month++;
         }
    if(month>=13)
     {
      month=1;
      year++;
     }
   }  
  }
 }
 }
}
//*****************时间显示*******************
void time_display()
{
 uchar temp1[]="    "; 
 uchar temp2[]="  ";
 uchar temp3[]="SET ";
 LCD_WriteControl(0x80);     //起始地址
 switch(shift)
 {
  case 1:LCD_DisplayCharacter('M');break;
  case 2:LCD_DisplayCharacter('F');break;
  case 3:LCD_DisplayCharacter('S');break;
  case 4:LCD_DisplayCharacter('R');break;
  case 5:LCD_DisplayCharacter('Y');break;
  case 6:LCD_DisplayCharacter('N');break;
  default:LCD_DisplayCharacter(' ');break;
 }
 LCD_DisplayString(1,2,temp2);
 LCD_DisplayCharacter(year/1000+0x30);  //年的千位
 LCD_DisplayCharacter((year%1000)/100+0x30); //年的百位
 LCD_DisplayCharacter(((year%1000)%100)/10+0x30); //年的十位
 LCD_DisplayCharacter(((year%1000)%100)%10+0x30); //年的个位
 LCD_DisplayCharacter(' ');
 LCD_DisplayCharacter(month/10+0x30); //月的十位
 LCD_DisplayCharacter(month%10+0x30); //月的个位
 LCD_DisplayCharacter('-');
 LCD_DisplayCharacter(day/10+0x30); //日的十位
 LCD_DisplayCharacter(day%10+0x30); //日的个位

 
 if(set==0)
 LCD_DisplayString(2,1,temp1);
 else LCD_DisplayString(2,1,temp3);
 LCD_DisplayCharacter(hour/10+0x30);
 LCD_DisplayCharacter(hour%10+0x30);
 LCD_DisplayCharacter(':');
 LCD_DisplayCharacter(minute/10+0x30);
 LCD_DisplayCharacter(minute%10+0x30);
 LCD_DisplayCharacter(':');
 LCD_DisplayCharacter(second/10+0x30);
 LCD_DisplayCharacter(second%10+0x30);
}
//************时间调整****************
void time_seting()
{
 if(shift==1)  //秒位校正
  {
   if(add==1)
   {
    second++;
    if(second>59)second=0;
    add=0;
   }
   if(reduce==1)
   {
    second--;
    if(second>59) second=59;
    reduce=0;
   }
  }

  if(shift==2)  //分位校正
  {
   if(add==1)
   {
    minute++;
    if(minute>59)minute=0;
    add=0;
   }
   if(reduce==1)
   {
    minute--;
    if(minute>59)minute=59;
    reduce=0;
   }
  }

  if(shift==3) //时位校正  
  {
   if(add==1)
   {
    hour++;
    if(hour>23)hour=0;
    add=0;
   }
   if(reduce==1)
   {
    hour--;
    if(hour>23)hour=23;
    reduce=0;
   }
  }

  if(shift==4) //日校正
  {
   if(add==1)
   {
    day++;
    if((year%4==0)&&(year%100!=0)||(year%400==0)) //闰年判断
     { if(day>tian2[month-1])day=1;}
    else if(day>tian1[month-1])day=1;
    add=0; 
   }
   if(reduce==1)
   {
    day--;
    if((year%4==0)&&(year%100!=0)||(year%400==0)) //闰年判断
      {if(day<=0||day>tian2[month-1]) day=tian2[month-1];}
    else if(day<=0||day>tian1[month-1]) day=tian1[month-1];
    reduce=0;
   }
  }
 
  if(shift==5) //月校正
  {
   if(add==1)
   {
    month++;
    if(month>12)month=1;
    add=0;
   }
   if(reduce==1)
   {
    month--;
    if(month>12)month=1;
    reduce=0;
   }
  }

  if(shift==6)  //年校正
  {
   if(add==1)
   {
    year++;
    add=0;
   } 
   if(reduce==1)
   {year--;
    if(year<2008)year=2008;
    reduce=0;
   }
  }
  
 
}
//********读键值*************
 uchar key_result()
{
 uchar key_value;
 ADGO=1;
 do{;}while(1==ADGO);
 ADGO=0;
 ad_key_result=ADRESH;
 if(ad_key_result>0xa5) key_value=1;
   else if(ad_key_result>0x7b) key_value=2;
        else if(ad_key_result>0x61) key_value=3;
          else if(ad_key_result>0x50) key_value=4;
            else if(ad_key_result>0x44) key_value=5;
             else key_value=0;
return key_value;
            
}
//****************防抖动******************
 uchar get_key()
{
 uchar key_temp;
 uint k;
 do{
    key_temp=key_result();   //取键值
    if(0!=key_temp)for(k=400;--k;);  //延时一段时间再取键值
   }while(key_temp!=key_result());  //若两次取得键值不相同,则说明键误按下,重新取键值。
 if(0!=key_temp)  //等键松开
 {
  do{
    do{;}while(0!=key_result());  //若没松开键,等待
    for(k=400;--k;);
    }while(0!=key_result()); //若二者不相等,说明是误操作,继续循环检测
 }
return key_temp;
}
//*************取AD转换值********************
 uint get_date(uchar channel_temp)
{
 uint date_temp1;
 

⌨️ 快捷键说明

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