STC 51单片机60——水位报警AD&蜂鸣器

#include "STC8G.h"
//#define ADC_POWER   0x80            //ADC power control bit
//#define ADC_FLAG    0x10            //ADC complete flag
//#define ADC_START   0x08            //ADC start control bit
//#define ADC_SPEEDLL 0x00            //450 clocks
//#define ADC_SPEEDL  0x20            //360 clocks
//#define ADC_SPEEDH  0x40            //180 clocks
//#define ADC_SPEEDHH 0x60            //90 clocks

sbit Speaker=P5^5;
unsigned char ch_x=4; //ADC为P5.4,其上拉1M电阻,对地测量水的电阻
//蜂鸣器采用无源蜂鸣器,必须用脉冲信号才能发生,三极管S9012,1脚接3v,2脚接1k电阻到P55,3脚经蜂鸣器正极到GND。

void Delay(void);
void ADCInit(void);
void UartInit(void);
void SendByte(unsigned char sbyte);

void Show_u16(unsigned int kk);

unsigned char Uart_Dat;

#define Download_command 0xf1 //功能码
void SerialPortInte(void) interrupt 4
{
    unsigned int ISP_i,ISP_j;
    
    if(TI==1)
    {
        TI=0;
//        ES_Flag_Set(0);
    }
    else
    {
        RI=0;
        Uart_Dat=SBUF;
        SBUF=Uart_Dat;
        if(Uart_Dat==Download_command)
        {
            for(ISP_j=1000;ISP_j>0;ISP_j--)
              for(ISP_i=123;ISP_i>0;ISP_i--);
            IAP_CONTR =0x60;//软件复位
        }
    }
}

unsigned char ADC_Val;
unsigned long ADC_Sum;
unsigned int ADC_i;
void ADC_Isr() interrupt 5
{  
    ADC_Sum = ADC_Sum+ADC_RES;       //读取ADC结果
      ADC_i++;
      if(ADC_i>=2000){
            ADC_Val=ADC_Sum/ADC_i;
            Show_u16(ADC_Val);
            while(ADC_Val<150){  //报警
              Speaker=1;
                Delay();
              Speaker=0;
                Delay();                
            }
          ADC_Sum=0;
            ADC_i=0;
        }
        
        ADC_CONTR &= ~0x20;                         //清中断标志
    ADC_CONTR |= 0x40;                          //继续AD转换
//      ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch_x;
}


void ADCInit(void)
{
    P5M0 = 0x00;                                //设置P5.4为ADC口
    P5M1 = 0x10;
    P_SW2 |= 0x80;                      //不清楚P_SW2干什么用
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x80;                           //使能ADC模块
      ADC_CONTR |= ch_x;
    EADC = 1;                                   //使能ADC中断
    EA = 1;
    ADC_CONTR |= 0x40;                          //启动AD转换
//      ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch_x;
}

void UartInit(void)        //9600bps@11.0592MHz
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR &= 0xBF;        //定时器时钟12T模式
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;        //设置定时器模式
    TL1 = 0xE8;        //设置定时初始值
    TH1 = 0xFF;        //设置定时初始值
    ET1 = 0;        //禁止定时器%d中断
    TR1 = 1;        //定时器1开始计时
    EA=1;
    ES=1;
}
void Delay(void)
{
  unsigned char i,j;
    for(i=0;i<180;i++)
      for(j=0;j<10;j++)
       ;
}


void main()
{
    unsigned int k;

   UartInit();    
     ADCInit();
     for(k=0;k<200;k++){  //开机报警
         Speaker=1;
         Delay();
         Speaker=0;
         Delay();                
     }    
   while (1);
}

void Show_u16(unsigned int kk)    //
{
 unsigned char a,b,c,d,e;

  e=kk%10+0x30;
  d=(unsigned char)(( kk/10 )%10)+0x30;
  c=(unsigned char)(( kk/100 )%10)+0x30;
  b=(unsigned char)(( kk/1000 )%10)+0x30;
  a=(unsigned char)(( kk/10000 )%10)+0x30;

  SendByte(a);
  SendByte(b);
  SendByte(c);
  SendByte(d);
    SendByte(e);
    SendByte(' ');
  SendByte('\r');
    SendByte('\n');    
}

void SendByte(unsigned char sbyte)
{  
       ES=0;
     SBUF=sbyte;                     //发送数据
         while(!TI);                     //等待发送完成
         TI=0;                             //清零发送标志位        
     ES=1;
}

完整资料打包:

STC51单片机60-水位报警AD&蜂鸣器-单片机文档类资源-优快云下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengyuzhe13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值