找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3185|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)初學(xué)者拿別人的東西仿真,想請(qǐng)教一下為什么這個(gè)系統(tǒng)蜂鳴器不會(huì)響?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
100黑幣

單片機(jī)源程序如下:
  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                //濕度傳感器放空氣中的電壓值   對(duì)應(yīng)濕度0%
  10. #define  FULL   0.45                //濕度傳感器放水中的電壓值         對(duì)應(yīng)濕度100%

  11. float k,b;//計(jì)算濕度用斜率

  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;     //濕度等級(jí)
  23. uchar s_high = 70,s_low = 25;        //濕度報(bào)警參數(shù)

  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;  //實(shí)時(shí)濕度值
  31. int RH=50; //濕度上限
  32. int RL=20; //濕度下限

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

  34. int temp;
  35. float temperature;         //溫度值
  36. char displaytemp[16];//定義顯示區(qū)域臨時(shí)存儲(chǔ)數(shù)組


  37. /*------------------------------------------------
  38.               判忙函數(shù)
  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.               寫(xiě)入命令函數(shù)
  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.               寫(xiě)入數(shù)據(jù)函數(shù)
  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.                 清屏函數(shù)
  81. ------------------------------------------------*/
  82. void LCD_Clear(void)
  83. {
  84. LCD_Write_Com(0x01);
  85. DelayMs(5);
  86. }
  87. /*------------------------------------------------
  88.               寫(xiě)入字符串函數(shù)
  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.               寫(xiě)入字符函數(shù)
  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.               初始化函數(shù)
  123. ------------------------------------------------*/
  124. void LCD_Init(void)
  125. {
  126.    LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
  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);    /*顯示關(guān)閉*/
  135.    LCD_Write_Com(0x01);    /*顯示清屏*/
  136.    DelayMs(5);
  137.    LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
  138.    DelayMs(5);
  139.    LCD_Write_Com(0x0C);    /*顯示開(kāi)及光標(biāo)設(shè)置*/
  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.                     主函數(shù)
  171. ------------------------------------------------*/
  172. void main(void)
  173. {

  174.       
  175.     LCD_Init();
  176.         DelayMs(10);
  177. //Init_Timer0();
  178.         MOETOR =0;        //默認(rèn)水泵關(guān)閉

  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; //計(jì)算電壓值
  191.         k = 100/(FULL-ZERO);           //根據(jù)空氣中和水中的電壓值列函數(shù)y=kx+b 計(jì)算 k b
  192.         b = 0-ZERO*k;
  193.         d = k*d+b;          //計(jì)算實(shí)際的濕度值
  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;          //低于下限 開(kāi)水泵
  204.         if(d>RH) MOETOR =0;          //高于上限 關(guān)水泵

  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;          //蜂鳴器報(bào)警
  218.                         dianji = 0;       //打開(kāi)電機(jī)
  219.                 }
  220.         }else
  221.                 beep = 1;   //關(guān)閉蜂鳴器
  222.       
  223.         if(shidu >= s_high)
  224.         {
  225.                 value1 ++;
  226.                 if(value1 >= 2)
  227.                 {
  228.                         value1 = 10;
  229.                         beep = 1;   //關(guān)閉蜂鳴器
  230.                         dianji = 1;       //關(guān)機(jī)電機(jī)
  231.                 }
  232.         }else
  233.                 value1 = 0;
  234. }



復(fù)制代碼


澆水系統(tǒng).rar

26.76 KB, 下載次數(shù): 6

最佳答案

查看完整內(nèi)容

程序沒(méi)有調(diào)用蜂鳴器控制的clock_h_l()子程序,所以你的蜂鳴器肯定不會(huì)響;還有一個(gè)問(wèn)題就是你寫(xiě)的clock_h_l()子程序使用的dianji應(yīng)改為MOETOR,前面的定義是sbit MOETOR = P3^6;//水泵控制端口 再者就是 #include "18b20.h" #include "delay.h" #include "key.h" 這三個(gè)文件在你的程序里有沒(méi)有 #include //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義 #include #include #include "18b20.h" #inc ...
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:278179 發(fā)表于 2019-4-23 13:40 | 只看該作者
程序沒(méi)有調(diào)用蜂鳴器控制的clock_h_l()子程序,所以你的蜂鳴器肯定不會(huì)響;還有一個(gè)問(wèn)題就是你寫(xiě)的clock_h_l()子程序使用的dianji應(yīng)改為MOETOR,前面的定義是sbit MOETOR = P3^6;//水泵控制端口
再者就是
#include "18b20.h"
#include "delay.h"
#include "key.h"
這三個(gè)文件在你的程序里有沒(méi)有

#include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
#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                //濕度傳感器放空氣中的電壓值   對(duì)應(yīng)濕度0%
#define  FULL   0.45                //濕度傳感器放水中的電壓值         對(duì)應(yīng)濕度100%

float k,b;//計(jì)算濕度用斜率

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;     //濕度等級(jí)
uchar s_high = 70,s_low = 25;        //濕度報(bào)警參數(shù)

#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;  //實(shí)時(shí)濕度值
int RH=50; //濕度上限
int RL=20; //濕度下限

unsigned char KeyValue;        //返回按鍵值

int temp;
//float temperature;         //溫度值   這個(gè)變量和前面 uint temperature,s_temp ;  //溫度的變量   的重定義了

char displaytemp[16];//定義顯示區(qū)域臨時(shí)存儲(chǔ)數(shù)組

/*------------------------------------------------
              判忙函數(shù)
------------------------------------------------*/
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;
}
/*------------------------------------------------
              寫(xiě)入命令函數(shù)
------------------------------------------------*/
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;
}
/*------------------------------------------------
              寫(xiě)入數(shù)據(jù)函數(shù)
------------------------------------------------*/
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;
}

/*------------------------------------------------
                清屏函數(shù)
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
              寫(xiě)入字符串函數(shù)
------------------------------------------------*/
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 ++;     
        }
}
/*------------------------------------------------
              寫(xiě)入字符函數(shù)
------------------------------------------------*/
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);  
}
/*------------------------------------------------
              初始化函數(shù)
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   //LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
   LCD_Write_Com(0x01);    /*顯示清屏*/
   DelayMs(5);
   LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*顯示開(kāi)及光標(biāo)設(shè)置*/
   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;          //蜂鳴器報(bào)警
                        MOETOR = 0;       //打開(kāi)電機(jī)
                }
        }else
                beep = 1;   //關(guān)閉蜂鳴器
       
        if(shidu >= s_high)
        {
                value1 ++;
                if(value1 >= 2)
                {
                        value1 = 10;
                        beep = 1;   //關(guān)閉蜂鳴器
                        MOETOR = 1;       //關(guān)機(jī)電機(jī)
                }
        }else
                value1 = 0;
}
/*------------------------------------------------
                    主函數(shù)
------------------------------------------------*/
void main(void)
{

       
    LCD_Init();
        DelayMs(10);
//Init_Timer0();
        MOETOR =0;        //默認(rèn)水泵關(guān)閉

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; //計(jì)算電壓值
        k = 100/(FULL-ZERO);           //根據(jù)空氣中和水中的電壓值列函數(shù)y=kx+b 計(jì)算 k b
        b = 0-ZERO*k;
        d = k*d+b;          //計(jì)算實(shí)際的濕度值
        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;          //低于下限 開(kāi)水泵
        if(d>RH) MOETOR =0;          //高于上限 關(guān)水泵
       
        clock_h_l();//這里要把你的子程序加入進(jìn)主循環(huán)

    DelayMs(300);

}
}


修改后的你試試
回復(fù)

使用道具 舉報(bào)

板凳
ID:519742 發(fā)表于 2019-4-23 16:59 | 只看該作者
仿真時(shí)芯片要寫(xiě)入一個(gè)程序生成的文件。
回復(fù)

使用道具 舉報(bào)

地板
ID:519756 發(fā)表于 2019-4-23 17:06 | 只看該作者
程序沒(méi)找到有單片機(jī)端口初始化的代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:67356 發(fā)表于 2019-4-23 17:15 | 只看該作者
好像,蜂鳴器是有源的,你用的是無(wú)源的?
回復(fù)

使用道具 舉報(bào)

6#
ID:499243 發(fā)表于 2019-4-24 13:35 | 只看該作者
jmkl128 發(fā)表于 2019-4-23 17:15
好像,蜂鳴器是有源的,你用的是無(wú)源的?

我換了一個(gè)蜂鳴器也是不響的啊,仿真時(shí)候P3.3口一直都是高電平,那兄弟在這個(gè)代碼的基礎(chǔ)上怎么改呢
回復(fù)

使用道具 舉報(bào)

7#
ID:499243 發(fā)表于 2019-4-24 13:36 | 只看該作者
zhengjs 發(fā)表于 2019-4-23 17:06
程序沒(méi)找到有單片機(jī)端口初始化的代碼

那請(qǐng)教一下改怎么改呢,謝謝
回復(fù)

使用道具 舉報(bào)

8#
ID:96682 發(fā)表于 2019-4-24 17:13 | 只看該作者
仿真這東西不能全信,與實(shí)物為準(zhǔn)
回復(fù)

使用道具 舉報(bào)

9#
ID:476431 發(fā)表于 2019-4-24 18:25 | 只看該作者
你可以試試修改蜂鳴器的電壓
回復(fù)

使用道具 舉報(bào)

10#
ID:520990 發(fā)表于 2019-4-25 00:08 | 只看該作者
射極接個(gè)電阻試試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表