久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2693|回復: 6
打印 上一主題 下一主題
收起左側

關于單片機+ds18b20和數碼管還有蜂鳴器亂叫的問題?

[復制鏈接]
跳轉到指定樓層
樓主
大佬們我想問一下為什么數碼管會突然閃一下呢,然后蜂鳴器就會叫有時候不會有時候就會這樣是為什么呢,現在仿真不會這樣了,但是實物會,求求了!!

單片機源程序如下:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. void ksxs();
  5. sbit DQ=P2^0;        //溫度數據口
  6. sbit set=P3^1;                   //設置鍵
  7. sbit add=P3^2;                 //增加
  8. sbit dec=P3^3;                 //減少
  9. sbit beer=P2^5;                 //蜂鳴器
  10. sbit out =P2^1;      //風扇電機
  11. sbit wx1=P0^0;       //位選1
  12. sbit wx2=P0^1;       //位選2
  13. sbit wx3=P0^2;       //位選3
  14. sbit wx4=P0^3;       //位選4
  15. sbit wx5=P0^4;       //位選5
  16. sbit wx6=P0^5;       //位選6
  17. sbit wx7=P0^6;
  18. sbit wx8=P0^7;
  19. uint high=30,low=5;
  20. uint a=0;
  21. bit fg=0;
  22. uint temp,js,djs;
  23. uchar temp_xs,flag;

  24. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
  25.                     0x92,0x82,0xf8,0x80,0x90,
  26.                                         0x7f          };

  27. void init()
  28. {
  29.   TMOD=0x10;
  30.   TR1=1;
  31.   ET1=1;
  32.   IT1=1;  //脈沖方式
  33.   IT0=1;
  34.   EX1=1;  //打開中斷
  35.   EX0=1;
  36.   EA=1;
  37.   TH1=(65536-50000)/256;
  38.   TL1=(65536-50000)%256;
  39. }

  40. /******延時程序*******/
  41. void delay_ms(unsigned int m)
  42.     {
  43.       unsigned int i,j;
  44.       for(i=m;i>0;i--)
  45.        for(j=110;j>0;j--);
  46.          }

  47. /******ds18b20延時程序(微秒)*******/
  48. void delay_us(unsigned int m)     //溫度延時程序
  49.     {
  50.       for(m;m>0;m--);
  51.          }

  52. /***********ds18b20的初始化**************/
  53. void Init_DS18B20(void)  
  54. {
  55. unsigned char x=0;
  56. DQ = 1;          //DQ復位 ds18b20通信端口
  57. delay_us(8); //稍做延時
  58. DQ = 0;          //單片機將DQ拉低
  59. delay_us(80); //精確延時 大于 480us
  60. DQ = 1;          //拉高總線   
  61. delay_us(4);
  62. x=DQ;            //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  63. delay_us(20);
  64. }

  65. /***********ds18b20讀一個字節**************/
  66. uchar ReadOneChar(void)
  67. {
  68. unsigned char i;
  69. unsigned char dat = 0;
  70. for (i=8;i>0;i--)
  71. {        DQ=1;
  72.     delay_us(1);
  73.     DQ = 0; // 高電平拉成低電平時讀周期開始
  74.     dat>>=1;
  75.     DQ = 1; // 給脈沖信號
  76.     if(DQ)
  77.     dat|=0x80;   //
  78.     delay_us(10);
  79. }
  80.    return(dat);
  81. }

  82. /*************ds18b20寫一個字節****************/
  83. void WriteOneChar(unsigned char dat)
  84. {
  85.    unsigned char i;
  86.    for (i=8; i>0; i--)
  87.    {
  88.    DQ = 0; //從高電平拉至低電平時,寫周期的開始
  89.     DQ = dat&0x01;   //數據的最低位先寫入
  90.     delay_us(15); //60us到120us延時
  91.     DQ = 1;//釋放總線準備下一次數據的寫入        
  92.     dat>>=1; //從最低位到最高位傳入
  93. }
  94. delay_us(4);
  95. }

  96. /**************讀取ds18b20當前溫度************/
  97. void ReadTemperature(bit flag)
  98.   {
  99.     uchar a=0;
  100.     uchar b=0;
  101.         uint i;
  102.     Init_DS18B20();
  103.     WriteOneChar(0xCC);    // 跳過讀序號列號的操作/
  104.     WriteOneChar(0x44); // 啟動溫度轉換
  105.         if(flag==1)
  106.         {
  107.          ksxs();
  108.         }
  109.         else
  110.     delay_us(125);       // this message is wery important
  111.     Init_DS18B20();
  112.     WriteOneChar(0xCC); //跳過讀序號列號的操作
  113.     WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度/

  114.     a=ReadOneChar();    //讀取溫度值低位  /
  115.     b=ReadOneChar();      //讀取溫度值高位    /

  116.         i=b;
  117.         i>>=4;
  118.         if(i!=0)
  119.         {
  120.           fg=1;
  121.           a=~(a)+1;
  122.           b=~b;
  123.           if(a==0) b=b+1;   //寫的過程發現-16度本來是0x10卻輸出0x00,20卻是10,這樣就好了
  124.           temp=((a>>4)|(b<<4));
  125.           a=(a&0x0f);
  126.           temp_xs=a;
  127.         }
  128.     else
  129.       {
  130.           fg=0;
  131.           temp=((a>>4)|(b<<4));
  132.           a=(a&0x0f);
  133.           temp_xs=a;
  134.           }
  135. }

  136. /*************主顯示函數************/
  137. void display()
  138. {
  139.           uint a,b,c,d,e,j;
  140.           a=temp/100;              // 百位
  141.           b=temp/10%10;            // 十位
  142.           c=temp%10;               // 個位
  143.           temp_xs=(int)(temp_xs*6.25+0.5);
  144.           d=temp_xs/10;                            //  小數第一位
  145.           e=temp_xs%10;           //  小數第二位
  146.          for(j=0;j<7;j++)
  147.          {
  148.           switch(j)
  149.           {
  150.                 case 0:
  151.                 wx1=1;
  152.                 if(fg==0)
  153.                 {
  154.                  if(a==0)        P1=0Xff;
  155.                  else       P1=table[a];
  156.                 }
  157.                 if(fg==1)
  158.                 {
  159.                  if(b==0)        P1=0Xff;
  160.                  else       P1=0xbf;
  161.                 }
  162.                 delay_ms(1);
  163.                 wx1=0;
  164.                 break;
  165.                
  166.                 case 1:
  167.                 wx2=1;
  168.                 if(fg==0)
  169.                 {
  170.                  if((a==0)&&(b==0))      P1=0Xff;
  171.                  else                    P1=table[b];
  172.                 }
  173.                 if(fg==1)
  174.                 {
  175.                  if(b==0)      P1=0Xbf;
  176.                  else          P1=table[b];
  177.                 }
  178.                 delay_ms(1);
  179.                 wx2=0;
  180.                 break;

  181.                 case 3:
  182.                 wx3=1;
  183.                 P1=table[c];   //+0x80 表示字母加小數點
  184.                 delay_ms(1);
  185.                 wx3=0;
  186.                 break;

  187.             case 2:
  188.                 wx4=1;
  189.                 P1=table[10];
  190.                 delay_ms(1);
  191.                 wx4=0;
  192.                 break;

  193.                 case 4:
  194.                 wx5=1;
  195.                 P1=table[d];
  196.                 delay_ms(1);
  197.                 wx5=0;
  198.                 break;

  199.                 case 5:
  200.                 wx6=1;
  201.                 P1=table[e];
  202.                 delay_ms(1);
  203.                 wx6=0;
  204.                 break;
  205.           }
  206.          }

  207. }

  208. /**********調溫顯示函數***********/
  209. void xianshi(temp1)
  210. {
  211.   uint x,y,z,j;
  212.           x=temp1/100;              // 百位
  213.           y=temp1/10%10;            // 十位
  214.           z=temp1%10;               // 個位

  215.          for(j=0;j<4;j++)
  216.          {
  217.           switch(j)
  218.           {
  219.            case 0:
  220.            wx1=1;
  221.        if(a==1)            P1=0x89;
  222.            if(a==2)                           P1=0xc7;
  223.            delay_ms(5);
  224.            wx1=0;
  225.            
  226.            case 1:
  227.            wx5=1;
  228.            if(x==0)          P1=0Xff;
  229.            else       P1=table[x];
  230.            delay_ms(5);
  231.            wx5=0;
  232.            break;

  233.            case 2:
  234.            wx6=1;
  235.            if((x==0)&&(y==0))      P1=0Xff;
  236.            else                    P1=table[y];
  237.            delay_ms(5);
  238.            wx6=0;
  239.            break;

  240.            case 3:
  241.            wx7=1;
  242.            P1=table[z];
  243.            delay_ms(5);
  244.            wx7=0;
  245.            break;
  246.           }
  247.          }
  248. }

  249. /**********開機顯示函數***********/
  250. void ksxs()
  251. { uchar i;
  252. for (i=0;i<120;i++)
  253. {

  254. P1=0x10c;
  255. wx1=1;
  256. delay_ms(1);
  257. wx1=0;

  258. P1=0x10c;
  259. wx2=1;
  260. delay_ms(1);
  261. wx2=0;

  262. P1=0x10c;
  263. wx3=1;
  264. delay_ms(1);
  265. wx3=0;

  266. P1=0x10c;
  267. wx4=1;
  268. delay_ms(1);
  269. wx4=0;

  270. P1=0x10c;
  271. wx5=1;
  272. delay_ms(1);
  273. wx5=0;

  274. P1=0x10c;
  275. wx6=1;
  276. delay_ms(1);
  277. wx6=0;

  278. wx7=1;
  279. P1=0x10c;
  280. delay_ms(1);
  281. wx7=0;

  282. wx8=1;
  283. P1=0x10c;
  284. delay_ms(1);
  285. wx8=0;
  286. }
  287. }

  288. /**********按鍵函數***********/
  289. void keyscan()
  290. {


  291. if(set==0)
  292. {

  293.   while(1)
  294.   {
  295.    if(set==0)
  296.    {
  297.     while(!set);
  298.         a++;
  299.          
  300.    }
  301.    if(a==1||a==2)
  302.    {
  303.      if(a==1) xianshi(high);
  304.          if(add==0)
  305.          {
  306.          delay_ms(10);
  307.          while(!add);
  308.          if(flag==1)
  309.          {
  310.           while(!flag);
  311.          if(a==1&&high<125)
  312.          {
  313.          high=high+5;
  314.          }
  315.          if(a==2)
  316.          low=low+5;
  317.           }
  318.           flag=0;
  319.           EX0=1;
  320.           }

  321.          if(a==2) xianshi(low);
  322.          if(dec==0)
  323.          {
  324.      delay_ms(5);
  325.          if(flag==2)
  326.          {
  327.          while(!flag);
  328.          if(a==1) high=high-1;
  329.          if(a==2) low=low-1;
  330.           }
  331.           flag=0;
  332.           EX1=1;
  333.           }
  334.    }
  335.    if(a>=3)
  336.    {
  337.         a=0;
  338.         break;
  339.    }
  340.   }
  341. }
  342. }

  343. /**********報警函數***********/
  344. void alarm()
  345. {
  346.   if(temp<=low||temp>=high)
  347.   {
  348.    delay_ms(10);
  349.    beer=0;
  350.    if(djs==0&&temp>=high)
  351.    {

  352.    TR1=0;
  353.    beer=1;
  354.    out=0;
  355.    }
  356.    else
  357.    {
  358.    beer=0;
  359.    out=1;
  360.    }
  361.   }

  362. else
  363.   {
  364.   out=1;
  365.   beer=1;
  366.    TR1=1;
  367.    djs=10;
  368.   }
  369. }
  370. /**********主函數***********/
  371. void main()
  372. {        
  373.          beer=1;
  374.          out=1;
  375.      init();
  376.            ReadTemperature(1);
  377.          ksxs();
  378.          djs=3;
  379.      js=0;
  380.   while(1)
  381. {
  382.            keyscan();
  383.        ReadTemperature(0);
  384.        display();
  385.            alarm();

  386. }
  387. }

  388. void exzd0(void)interrupt 0
  389. {
  390.   flag=1;
  391.   EX0=0;
  392. }
  393. void exzd1(void)interrupt 2
  394. {
  395.   flag=2;
  396.   EX1=0;
  397. }
  398. void time1() interrupt 3   //定時器中斷1
  399. {
  400.   TH1=(65536-50000)/256;
  401.   TL1=(65536-50000)%256;
  402.   js++;
  403.   if(js>=20)
  404.   {
  405.    js=0;
  406.    djs--;
  407.   }
  408. }
復制代碼


溫度計.png (65.37 KB, 下載次數: 117)

溫度計.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:180919 發表于 2020-11-12 08:48 | 只看該作者
1.建議把Q1,Q3換成NPN管,
2.不換也需要再D2,D3并一個上拉電阻,讓Q1,Q3完全關關閉.
回復

使用道具 舉報

板凳
ID:498772 發表于 2020-11-12 11:20 | 只看該作者
changhz 發表于 2020-11-12 08:48
1.建議把Q1,Q3換成NPN管,
2.不換也需要再D2,D3并一個上拉電阻,讓Q1,Q3完全關關閉.

想問一下怎么并,實物做出來了不太好改了嗚嗚,感覺并簡單一點,就是現在不知道是不是ds18b20的哪里我搞錯了,就是數碼管有的時候會跳然后蜂鳴器就叫一下,突然這樣不知道為啥┭┮﹏┭┮
回復

使用道具 舉報

地板
ID:687694 發表于 2020-11-12 15:27 | 只看該作者
軟件中,你在按鍵函數中有一個while(1),這個執行到這里就跳不出去了。一直在等待中斷,中斷執行完畢后又回到這個無限循環中。這是不對的。while(1)不應該在子函數中出現。
硬件中,pnp三極管用法不對,你按照圖中接,現實中有可能無法正常飽和導通,PNP管,發射極接電源正極,基極與驅動之間設限流電阻,為保證控制可靠,基極需上拉電阻,集電極與電源地之間接直接驅動負載。通常單片機直接驅動PNP管比較方便,因為灌電流一般比輸出電流大,即驅動能力強一點。
如果需要高電平驅動,請查閱手冊,可否將gpio配置為推挽輸出,驅動與基極加限流電阻,基極加下拉電阻驅動NPN三極管,集電極與電源正極之間接負載,發射極接地。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:498772 發表于 2020-11-12 15:49 | 只看該作者
lovexulu 發表于 2020-11-12 15:27
軟件中,你在按鍵函數中有一個while(1),這個執行到這里就跳不出去了。一直在等待中斷,中斷執行完畢后又 ...

大佬按鍵那里我把while(1)那個去掉就可以了是吧,那我實物已經做出來了,有點不太好改pnp接法,那我再集電極和基極加一個10k的電阻嘛,那蜂鳴器會突然叫一下是這個原因嘛,
回復

使用道具 舉報

6#
ID:687694 發表于 2020-11-12 18:14 | 只看該作者
2929198192 發表于 2020-11-12 15:49
大佬按鍵那里我把while(1)那個去掉就可以了是吧,那我實物已經做出來了,有點不太好改pnp接法,那我再 ...

89c52高電平驅動能力太弱,輸出電流不到1ma,驅動三極管集電極電流就算管子放大系數200也不到200ma的電流,估計帶蜂鳴器是可以的,帶電機就懸了,不如改低電壓驅動的場管吧,我記得si2302有直插封裝的n管,直接代換,G接驅動R4/R7(2k)D接蜂鳴器/電機下端,S接地。G接個10K下拉電阻。驅動電流3A,耐壓20V。
回復

使用道具 舉報

7#
ID:180919 發表于 2020-11-13 09:20 | 只看該作者
2929198192 發表于 2020-11-12 11:20
想問一下怎么并,實物做出來了不太好改了嗚嗚,感覺并簡單一點,就是現在不知道是不是ds18b20的哪里我搞 ...

現在有問題了,哥們不改不穩定.
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人麻豆免费观看 | 亚洲一区二区久久 | 日韩一区二区三区在线观看视频 | 综合成人在线 | 草草视频在线播放 | 一区二区三区四区电影 | 中文字幕的av | 亚洲精品自在在线观看 | 视频1区2区 | 成人中文字幕av | 亚洲91精品 | 国产高清亚洲 | 成人午夜精品 | 一区二区不卡视频 | 久久国产精品免费一区二区三区 | 久久婷婷色| 亚洲综合视频 | 成人精品一区二区 | 欧美自拍另类 | 欧洲成人免费视频 | 欧美黄色大片在线观看 | 欧美xxxx黑人又粗又长 | 久久久www成人免费无遮挡大片 | 亚洲精品国产成人 | av资源中文在线 | 成人性生交a做片 | 精品在线免费观看视频 | 久久9999久久 | 亚洲欧洲色视频 | 日韩欧美三级 | 五月婷婷丁香 | 二区亚洲 | 国产成人精品免费 | 国产精品99久久久久久久vr | 午夜三级在线观看 | 精品日韩一区二区 | 亚洲伦理自拍 | www.青青草| 天天干成人网 | 国产精品国色综合久久 | 成人网视频 |