打印
[PIC®/AVR®/dsPIC®产品]

PIC12F509项目程序(版权所有,谢绝转载)

[复制链接]
723|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

/******************project  N0801*******************/
//******** completion time 2023-2-13 by bobo********/
//**************************************************/
//                 ________________
//            VDD-| 1            8 |-VSS
//            GP5-| 2           27 |-GP0/DAT
//            GP4-| 3           26 |-GP1/CLK
//     GP3/RMCLR--| 4           25 |-GP2
//                |________________|
//                    PIC12F509
//**************************************************/


#include <pic.h>
//芯片配置字
__CONFIG(0xFEA);        //参考:《PIC12F509数据手册》第41页 配置位 GP3引角配置成输入引角

#define _XTAL_FREQ 4000000            //系统时钟4M,定义这个是为了方便调用延时函数   __delay_ms(500);  //延时500MS
#define uchar unsigned char
#define Green_LED  GP1//绿灯
#define Red_LED  GP0//红灯
#define U3  GP2//U3信号
#define U1  GP5//U1信号
#define RELAY  GP4//继电器
#define Key  GP3//KEY键

void Scanf_U1(void);//U1检测函数
void Scanf_U3(void);//U3检测函数
void Key_Scan(void);//按键扫描
void Flashing_10seconds(void);//闪灯10S
void Slow_flashing_LED(void);//慢闪循环
void Slow_flashing_LED_GreenAndRed(void);//双灯慢闪循环
void working_fun(void);//正常工作
void Flashing_10seconds_turn_on(void);//开机闪灯10S

volatile unsigned int Time_cunt=0;//缺水保护计数
volatile unsigned int U1_Flag=0;//U1状态
volatile unsigned int U3_Flag=0;//U3状态
volatile unsigned int Key_Flag=0;//按键状态
volatile unsigned int Kaiji_Flag=0;//开机闪灯10S标志

void main(void)
{
   __delay_ms(100);  //上电延时100毫秒,以保证电源可靠供电
   OPTION=0x03;//T0CS=0;选择定时器模式(16分频),让GP2为普通IO,允许内部弱上拉(GP3开关按键需要上拉)
   TRIS=0X2C;//将GP0 GP1 GP4设置成输出  GP2 GP5 和GP3设置成输入状态
   GPIO=0x08;
   TMR0=0x00;
   OSCCAL=0x00; //校准频率(中心频率)
   Time_cunt=0;
   RELAY=0;
   Green_LED=0;
   Red_LED=0;
   Key=0;
   Scanf_U1();
   Scanf_U3();
   U1_Flag=0;  
   Time_cunt=0;  
   Flashing_10seconds_turn_on();//开机快闪10S
   
        while(1)
  {     
      if((U3_Flag==1&&Kaiji_Flag==0)||Key_Flag==0||U1_Flag==2||Time_cunt==15000||Time_cunt==75000||Time_cunt==225000||Time_cunt==900000)
     {
     Flashing_10seconds();//快闪10S
     }                                                                                                                                                      
      if(U1_Flag==1)
     {
     working_fun();
     }
     else if(U3_Flag==1&&U1_Flag==1)
     {
     working_fun();
     }                                                         
     else if(U3_Flag==1)
     {
     Slow_flashing_LED_GreenAndRed();     
     }
     else if(U3_Flag==2||U1_Flag==0)   
     {
     Slow_flashing_LED();     
     }      
  }
}
void Scanf_U1(void)//U1检测
{
  if(U1==0)//磁铁靠近U1时,正常工作(出水口打开时)
     {                                       
     if(U1_Flag!=1)
     {     
     U1_Flag=1;     
     }                 
     }else
     {     
      if(U1_Flag==1)
     {            
     U1_Flag=2;      
     }         
     }   
}            
void Scanf_U3(void)//U3检测
{
  if(U3==0)
     {                                       
     if(U3_Flag!=1)
     {     
     U3_Flag=1;        
     }            
     }else
     {     
      if(U3_Flag==1)
     {            
     U3_Flag=2;      
     }           
     }   
}                                 
void Flashing_10seconds(void)//快闪10S函数
{
     RELAY=1;
     Red_LED=0;   
     unsigned int k=0,j=0;
     while(1)
        {                     
            if(++k>10)
                {
            k=0;
            Green_LED=!Green_LED;
            }       
            while(TMR0<250);   //250*16=4MS/
                TMR0=0;
            Scanf_U1();
            Scanf_U3();
        Key_Scan();               
                j++;               
                if(j>2500)
                {   
        if(U1_Flag==2)//如果U1_Flag==2 10S后让它变成0
        {
        U1_Flag=0;
        }                   
            break;          
                }
                if(U3_Flag==1&&U1_Flag==1)
                {
                    break;
                }       
        }       
}     
void Flashing_10seconds_turn_on(void)//开机闪灯10S函数
{
     RELAY=1;
     Red_LED=0;
     unsigned int k=0,j=0;
     Kaiji_Flag=1;
     while(1)
        {                     
            if(++k>10)
                {
            k=0;
            Green_LED=!Green_LED;
            }       
            while(TMR0<250);   //250*16=4MS/
                TMR0=0;
            Scanf_U1();
            Scanf_U3();
        Key_Scan();               
                j++;               
                if(j>2500||Key_Flag==0)
                {                       
            break;          
                }               
        }       
}                 
void Slow_flashing_LED(void)//慢闪LED函数
{
     RELAY=0;
     Red_LED=0;
     //Kaiji_Flag=0;
     unsigned int k=0;
     Time_cunt=0;//待机状态把缺水保护时间清0
     while(1)
        {                      
            if(++k>250)
                {
            k=0;
            Green_LED=!Green_LED;

            }       
        while(TMR0<250);   //250*16=4MS/
                TMR0=0;
            Scanf_U3();               
            Key_Scan();
        if(Key_Flag==0||U3_Flag==1)
        {      
            break;
        }                      
        }       
}           
void Slow_flashing_LED_GreenAndRed(void)//双灯慢闪LED函数
{
     Green_LED=0;
     Red_LED=0;
     RELAY=0;
     Kaiji_Flag=0;
     //Time_cunt=0;
     unsigned int k=0;
     while(1)
        {                  
            if(++k>250)
                {
            k=0;
        Green_LED=!Green_LED;
        Red_LED=!Red_LED;
            }       
        while(TMR0<250);   //250*16=4MS/
                TMR0=0;
        Key_Scan();
        Time_cunt++;
        if(Key_Flag==0||Time_cunt==15000||Time_cunt==75000||Time_cunt==225000||Time_cunt==900000)//2500是10S 15000是一分钟 5分钟是750000 15分钟是225000 60分钟是900000
       {            
           break;
       }                  
        }       
}           
void working_fun(void)//正常工作函数
{
     Kaiji_Flag=0;
     Time_cunt=0;//只要正常工作 就把缺水保护时间清0
     while(U1_Flag==1)
     {
      Scanf_U1();
      Scanf_U3();
      Red_LED=0;
      Green_LED=1;                           
      RELAY=1;
      Key_Scan();
      if(Key_Flag==0)
      {
          break;
      }      
     }   
}
/*********按键扫描函数**********/
void Key_Scan(void)
{  
     if(Key==1)
     Key_Flag=1;
     else
     Key_Flag=0;
}

使用特权

评论回复
沙发
lcczg| | 2023-2-13 15:55 | 只看该作者
顶一个

使用特权

评论回复
板凳
tpgf| | 2023-3-1 09:41 | 只看该作者
楼主的程序想要实现的功能是什么啊

使用特权

评论回复
地板
nawu| | 2023-3-1 09:50 | 只看该作者
这个使用的是哪种传感器进行检测的啊

使用特权

评论回复
5
aoyi| | 2023-3-1 10:24 | 只看该作者
楼主的功能说明太少了 不过看起来时序上并不复杂

使用特权

评论回复
6
zljiu| | 2023-3-1 10:38 | 只看该作者
我觉得楼主的按键扫描功能并不可靠  也可能从硬件上进行了防抖

使用特权

评论回复
7
gwsan| | 2023-3-1 10:52 | 只看该作者
while语句较多,万一在一个里边有死循环了怎么办

使用特权

评论回复
8
tfqi| | 2023-3-1 11:12 | 只看该作者
如果 if语句里边的判定条件比较多的话 会影响响应速度吗

使用特权

评论回复
9
pzsh| | 2023-3-1 15:09 | 只看该作者
硬件上运行的效果,也可以分享下

使用特权

评论回复
10
bobolaile|  楼主 | 2023-3-2 13:29 | 只看该作者
这就是一个水泵抽水的程序,之前是西班牙人做的,客户拿来产品让根据产品的现象写出程序,电路图我找下,和大家分享

使用特权

评论回复
11
bobolaile|  楼主 | 2023-3-2 13:34 | 只看该作者
上面程序的电路图

微信图片_20230302133221.png (577.78 KB )

N0801电路图

N0801电路图

使用特权

评论回复
12
bobolaile|  楼主 | 2023-3-2 13:40 | 只看该作者
这个程序虽然简单 但有很强的逻辑性 初学者可以拿来练手。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝