单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 410|回复: 9
打印 上一主题 下一主题
收起左侧

单片机初学者拿别人的东西仿真,想请教一下为什么这个系统蜂鸣器不会响?

[复制链接]
跳转到指定楼层
楼主
100黑币

单片机源程序如下:
  1. #include<reg52.h
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #include "18b20.h"
  5. #include "delay.h"
  6. #include "key.h"

  7. #define  uint   unsigned int         
  8. #define  uchar  unsigned char

  9. #define  ZERO   4.5                //湿度传感器放空气中的电压值   对应湿度0%
  10. #define  FULL   0.45                //湿度传感器放水中的电压值         对应湿度100%

  11. float k,b;//计算湿度用斜率

  12. sbit RS = P2^5;   //定义LCD1602端口
  13. sbit RW = P2^6;
  14. sbit EN = P2^7;
  15. #define DataPort P0

  16. sbit CS  = P2^0; //定义ADC0832端口
  17. sbit CLK = P2^1;
  18. sbit DIO = P2^2;

  19. sbit MOETOR = P3^6;//水泵控制端口

  20. sbit beep = P3^3;   //蜂鸣器IO口定义
  21. uint temperature,s_temp ;  //温度的变量
  22. uchar shidu;     //湿度等级
  23. uchar s_high = 70,s_low = 25;        //湿度报警参数

  24. #define RS_CLR RS=0
  25. #define RS_SET RS=1

  26. #define RW_CLR RW=0
  27. #define RW_SET RW=1

  28. #define EN_CLR EN=0
  29. #define EN_SET EN=1

  30. float  d;  //实时湿度值
  31. int RH=50; //湿度上限
  32. int RL=20; //湿度下限

  33. unsigned char KeyValue;        //返回按键值

  34. int temp;
  35. float temperature;         //温度值
  36. char displaytemp[16];//定义显示区域临时存储数组


  37. /*------------------------------------------------
  38.               判忙函数
  39. ------------------------------------------------*/
  40. bit LCD_Check_Busy(void)
  41. {
  42.     unsigned char LCD_Status;
  43.         RS = 0;
  44.         RW = 1;
  45.         EN = 1;
  46.         DelayMs(1);
  47.            LCD_Status = P0;
  48.         EN = 0;
  49.         return LCD_Status;
  50. }
  51. /*------------------------------------------------
  52.               写入命令函数
  53. ------------------------------------------------*/
  54. void LCD_Write_Com(unsigned char com)
  55. {  
  56.     while((LCD_Check_Busy()&0x80)==0x80);
  57.         RS = 0;
  58.         RW = 0;
  59.         EN = 0;
  60.         P0 = com;
  61.         EN = 1;
  62.         DelayMs(1);
  63.         EN = 0;
  64. }
  65. /*------------------------------------------------
  66.               写入数据函数
  67. ------------------------------------------------*/
  68. void LCD_Write_Data(unsigned char Data)
  69. {
  70. while((LCD_Check_Busy()&0x80)==0x80);
  71.         RS = 1;
  72.         RW = 0;
  73.         EN = 0;
  74.         P0 = Data;
  75.         EN = 1;
  76.         DelayMs(1);
  77.         EN = 0;
  78. }

  79. /*------------------------------------------------
  80.                 清屏函数
  81. ------------------------------------------------*/
  82. void LCD_Clear(void)
  83. {
  84. LCD_Write_Com(0x01);
  85. DelayMs(5);
  86. }
  87. /*------------------------------------------------
  88.               写入字符串函数
  89. ------------------------------------------------*/
  90. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  91. {     
  92. if (y == 0)
  93.         {     
  94.          LCD_Write_Com(0x80 + x);     //表示第一行
  95.         }
  96. else
  97.         {      
  98.         LCD_Write_Com(0xC0 + x);      //表示第二行
  99.         }        
  100. while (*s)
  101.         {     
  102. LCD_Write_Data( *s);     
  103. s ++;     
  104.         }
  105. }
  106. /*------------------------------------------------
  107.               写入字符函数
  108. ------------------------------------------------*/
  109. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  110. {     
  111. if (y == 0)
  112.         {     
  113.         LCD_Write_Com(0x80 + x);     
  114.         }   
  115. else
  116.         {     
  117.         LCD_Write_Com(0xC0 + x);     
  118.         }        
  119. LCD_Write_Data( Data);  
  120. }
  121. /*------------------------------------------------
  122.               初始化函数
  123. ------------------------------------------------*/
  124. void LCD_Init(void)
  125. {
  126.    LCD_Write_Com(0x38);    /*显示模式设置*/
  127.    DelayMs(5);
  128.    LCD_Write_Com(0x38);
  129.    DelayMs(5);
  130.    LCD_Write_Com(0x38);
  131.    DelayMs(5);
  132.    LCD_Write_Com(0x38);
  133.    DelayMs(5);
  134.    //LCD_Write_Com(0x08);    /*显示关闭*/
  135.    LCD_Write_Com(0x01);    /*显示清屏*/
  136.    DelayMs(5);
  137.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  138.    DelayMs(5);
  139.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  140.    DelayMs(5);
  141.    }



  142. unsigned char Get_AD_Result()        //读取AD值
  143. {
  144. uchar i,dat1=0,dat2=0;
  145.         CS  = 0;
  146.         CLK = 0;
  147.         DIO = 1; _nop_(); _nop_();
  148.         CLK = 1; _nop_(); _nop_();
  149.         CLK = 0;DIO = 1; _nop_(); _nop_();
  150.         CLK = 1; _nop_(); _nop_();
  151.         CLK = 0;DIO = 1; _nop_(); _nop_();
  152.         CLK = 1;DIO = 1; _nop_(); _nop_();
  153.         CLK = 0;DIO = 1; _nop_(); _nop_();
  154.         for(i=0;i<8;i++)
  155.         {
  156.                  CLK = 1; _nop_(); _nop_();
  157.                 CLK = 0; _nop_(); _nop_();
  158.                 dat1 = dat1 << 1 | DIO;      
  159.         }
  160.         for(i=0;i<8;i++)
  161.         {
  162.                  dat2 = dat2 << ((uchar)(DIO)<<i);
  163.                 CLK = 1; _nop_(); _nop_();
  164.                 CLK = 0; _nop_(); _nop_();
  165.         }
  166.         CS = 1;
  167.         return dat1; //== dat2) ? dat1:0;
  168. }

  169. /*------------------------------------------------
  170.                     主函数
  171. ------------------------------------------------*/
  172. void main(void)
  173. {

  174.       
  175.     LCD_Init();
  176.         DelayMs(10);
  177. //Init_Timer0();
  178.         MOETOR =0;        //默认水泵关闭

  179. while (1)
  180. {  
  181.       KeyValue=KeyScan();
  182.           if(KeyValue!=0)//如果有键按下
  183.           {      
  184.         Keyprocessing(KeyValue); //键值处理
  185.           }

  186.     temp=ReadTemperature();  //读取温度值
  187.     temperature=(float)temp*0.0625;
  188.     sprintf(displaytemp,"T =%3.1f",temperature);//
  189.     LCD_Write_String(0,0,displaytemp);// 显示温度值

  190.     d = Get_AD_Result()*5/255; //计算电压值
  191.         k = 100/(FULL-ZERO);           //根据空气中和水中的电压值列函数y=kx+b 计算 k b
  192.         b = 0-ZERO*k;
  193.         d = k*d+b;          //计算实际的湿度值
  194.         if(d<0)        d=0;
  195.         if(d>100) d=100;
  196.         //d = k*d+b;
  197.     sprintf(displaytemp,"R =%3.1f",d);//
  198.     LCD_Write_String(8,0,displaytemp);// 显示湿度


  199.     sprintf(displaytemp,"RH=%2d",RH);//
  200.     LCD_Write_String(0,1,displaytemp);// 显示湿度上限
  201.     sprintf(displaytemp,"RL=%2d",RL);//
  202.     LCD_Write_String(10,1,displaytemp);//        显示湿度下限

  203.         if(d<RL) MOETOR =1;          //低于下限 开水泵
  204.         if(d>RH) MOETOR =0;          //高于上限 关水泵

  205.     DelayMs(300);

  206. }
  207. }
  208. void clock_h_l()
  209. {
  210.         static uchar value,value1;
  211.         if(shidu <= s_low)
  212.         {
  213.                 value ++;
  214.                 if(value >= 2)
  215.                 {
  216.                         value = 10;
  217.                         beep = ~beep;          //蜂鸣器报警
  218.                         dianji = 0;       //打开电机
  219.                 }
  220.         }else
  221.                 beep = 1;   //关闭蜂鸣器
  222.       
  223.         if(shidu >= s_high)
  224.         {
  225.                 value1 ++;
  226.                 if(value1 >= 2)
  227.                 {
  228.                         value1 = 10;
  229.                         beep = 1;   //关闭蜂鸣器
  230.                         dianji = 1;       //关机电机
  231.                 }
  232.         }else
  233.                 value1 = 0;
  234. }



复制代码


浇水系统.rar

26.76 KB, 下载次数: 1

最佳答案

查看完整内容

程序没有调用蜂鸣器控制的clock_h_l()子程序,所以你的蜂鸣器肯定不会响;还有一个问题就是你写的clock_h_l()子程序使用的dianji应改为MOETOR,前面的定义是sbit MOETOR = P3^6;//水泵控制端口 再者就是 #include "18b20.h" #include "delay.h" #include "key.h" 这三个文件在你的程序里有没有 #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include #include #include "18b20.h" #inc ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
huwqly 发表于 2019-4-23 13:40 | 只看该作者
程序没有调用蜂鸣器控制的clock_h_l()子程序,所以你的蜂鸣器肯定不会响;还有一个问题就是你写的clock_h_l()子程序使用的dianji应改为MOETOR,前面的定义是sbit MOETOR = P3^6;//水泵控制端口
再者就是
#include "18b20.h"
#include "delay.h"
#include "key.h"
这三个文件在你的程序里有没有

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
#include<stdio.h>
#include "18b20.h"
#include "delay.h"
#include "key.h"

#define  uint   unsigned int          
#define  uchar  unsigned char

#define  ZERO   4.5                //湿度传感器放空气中的电压值   对应湿度0%
#define  FULL   0.45                //湿度传感器放水中的电压值         对应湿度100%

float k,b;//计算湿度用斜率

sbit RS = P2^5;   //定义LCD1602端口
sbit RW = P2^6;
sbit EN = P2^7;

#define DataPort P0

sbit CS  = P2^0; //定义ADC0832端口
sbit CLK = P2^1;
sbit DIO = P2^2;

sbit MOETOR = P3^6;//水泵控制端口

sbit beep = P3^3;   //蜂鸣器IO口定义
uint temperature,s_temp ;  //温度的变量
uchar shidu;     //湿度等级
uchar s_high = 70,s_low = 25;        //湿度报警参数

#define RS_CLR RS=0
#define RS_SET RS=1

#define RW_CLR RW=0
#define RW_SET RW=1

#define EN_CLR EN=0
#define EN_SET EN=1

float  d;  //实时湿度值
int RH=50; //湿度上限
int RL=20; //湿度下限

unsigned char KeyValue;        //返回按键值

int temp;
//float temperature;         //温度值   这个变量和前面 uint temperature,s_temp ;  //温度的变量   的重定义了

char displaytemp[16];//定义显示区域临时存储数组

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
    unsigned char LCD_Status;
        RS = 0;
        RW = 1;
        EN = 1;
        DelayMs(1);
           LCD_Status = P0;
        EN = 0;
        return LCD_Status;
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
    while((LCD_Check_Busy()&0x80)==0x80);
        RS = 0;
        RW = 0;
        EN = 0;
        P0 = com;
        EN = 1;
        DelayMs(1);
        EN = 0;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while((LCD_Check_Busy()&0x80)==0x80);
        RS = 1;
        RW = 0;
        EN = 0;
        P0 = Data;
        EN = 1;
        DelayMs(1);
        EN = 0;
}

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);     
s ++;     
        }
}
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
        {     
        LCD_Write_Com(0x80 + x);     
        }   
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*显示模式设置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   //LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   DelayMs(5);
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   DelayMs(5);
   }



unsigned char Get_AD_Result()        //读取AD值
{
uchar i,dat1=0,dat2=0;
        CS  = 0;
        CLK = 0;
        DIO = 1; _nop_(); _nop_();
        CLK = 1; _nop_(); _nop_();
        CLK = 0;DIO = 1; _nop_(); _nop_();
        CLK = 1; _nop_(); _nop_();
        CLK = 0;DIO = 1; _nop_(); _nop_();
        CLK = 1;DIO = 1; _nop_(); _nop_();
        CLK = 0;DIO = 1; _nop_(); _nop_();
        for(i=0;i<8;i++)
        {
                 CLK = 1; _nop_(); _nop_();
                CLK = 0; _nop_(); _nop_();
                dat1 = dat1 << 1 | DIO;       
        }
        for(i=0;i<8;i++)
        {
                 dat2 = dat2 << ((uchar)(DIO)<<i);
                CLK = 1; _nop_(); _nop_();
                CLK = 0; _nop_(); _nop_();
        }
        CS = 1;
        return dat1; //== dat2) ? dat1:0;
}

void clock_h_l()
{
        static uchar value,value1;
        if(shidu <= s_low)
        {
                value ++;
                if(value >= 2)
                {
                        value = 10;
                        beep = ~beep;          //蜂鸣器报警
                        MOETOR = 0;       //打开电机
                }
        }else
                beep = 1;   //关闭蜂鸣器
       
        if(shidu >= s_high)
        {
                value1 ++;
                if(value1 >= 2)
                {
                        value1 = 10;
                        beep = 1;   //关闭蜂鸣器
                        MOETOR = 1;       //关机电机
                }
        }else
                value1 = 0;
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{

       
    LCD_Init();
        DelayMs(10);
//Init_Timer0();
        MOETOR =0;        //默认水泵关闭

while (1)
{  
      KeyValue=KeyScan();
          if(KeyValue!=0)//如果有键按下
          {       
        Keyprocessing(KeyValue); //键值处理
          }

    temp=ReadTemperature();  //读取温度值
    temperature=(float)temp*0.0625;
    sprintf(displaytemp,"T =%3.1f",temperature);//
    LCD_Write_String(0,0,displaytemp);// 显示温度值

    d = Get_AD_Result()*5/255; //计算电压值
        k = 100/(FULL-ZERO);           //根据空气中和水中的电压值列函数y=kx+b 计算 k b
        b = 0-ZERO*k;
        d = k*d+b;          //计算实际的湿度值
        if(d<0)        d=0;
        if(d>100) d=100;
        //d = k*d+b;
    sprintf(displaytemp,"R =%3.1f",d);//
    LCD_Write_String(8,0,displaytemp);// 显示湿度


    sprintf(displaytemp,"RH=%2d",RH);//
    LCD_Write_String(0,1,displaytemp);// 显示湿度上限
    sprintf(displaytemp,"RL=%2d",RL);//
    LCD_Write_String(10,1,displaytemp);//        显示湿度下限

        if(d<RL) MOETOR =1;          //低于下限 开水泵
        if(d>RH) MOETOR =0;          //高于上限 关水泵
       
        clock_h_l();//这里要把你的子程序加入进主循环

    DelayMs(300);

}
}


修改后的你试试
回复

使用道具 举报

板凳
813311514 发表于 2019-4-23 16:59 | 只看该作者
仿真时芯片要写入一个程序生成的文件。
回复

使用道具 举报

地板
zhengjs 发表于 2019-4-23 17:06 | 只看该作者
程序没找到有单片机端口初始化的代码
回复

使用道具 举报

5#
jmkl128 发表于 2019-4-23 17:15 | 只看该作者
好像,蜂鸣器是有源的,你用的是无源的?
回复

使用道具 举报

6#
 楼主| chenchen1 发表于 2019-4-24 13:35 | 只看该作者
jmkl128 发表于 2019-4-23 17:15
好像,蜂鸣器是有源的,你用的是无源的?

我换了一个蜂鸣器也是不响的啊,仿真时候P3.3口一直都是高电平,那兄弟在这个代码的基础上怎么改呢
回复

使用道具 举报

7#
 楼主| chenchen1 发表于 2019-4-24 13:36 | 只看该作者
zhengjs 发表于 2019-4-23 17:06
程序没找到有单片机端口初始化的代码

那请教一下改怎么改呢,谢谢
回复

使用道具 举报

8#
wc86110 发表于 2019-4-24 17:13 | 只看该作者
仿真这东西不能全信,与实物为准
回复

使用道具 举报

9#
yx666 发表于 2019-4-24 18:25 | 只看该作者
你可以试试修改蜂鸣器的电压
回复

使用道具 举报

10#
nemonbee 发表于 2019-4-25 00:08 | 只看该作者
射极接个电阻试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表