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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于STC89C52單片機的火災報警器設計資料(Proteus仿真+源碼)

[復制鏈接]
跳轉到指定樓層
樓主
這是以前做小玩意的成品資料,包含了原理圖,單片機程序,仿真圖。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


制作出來的實物圖如下:


電路原理圖如下:


單片機源程序如下:
  1. //程序頭函數
  2. #include <reg52.h>
  3. //顯示函數
  4. #include <display.h>

  5. //宏定義
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #include <intrins.h>
  9. #include "eeprom52.h"
  10. #define Data_ADC0809 P1

  11. //管腳聲明
  12. sbit LED_wendu= P2^2;
  13. sbit LED_yanwu= P2^1;
  14. sbit baojing= P2^5;
  15. sbit DQ = P2^0;
  16. sbit fs=P3^4;
  17. //ADC0809
  18. sbit ST=P3^3;
  19. sbit EOC=P3^6;
  20. sbit OE=P3^2;
  21. //按鍵
  22. sbit Key1=P2^6;
  23. sbit Key2=P2^7;
  24. sbit Key3=P3^7;

  25. signed char w;                                     //溫度值全局變量
  26. uint c;                                         //溫度值全局變量
  27. bit bdata flag=0;
  28. //酒精含量變量
  29. uchar temp;
  30. uchar yushe_wendu;
  31. uchar yushe_yanwu;
  32. //按鈕模式|  
  33. uchar Mode=0;

  34. //函數聲明
  35. extern uchar ADC0809();
  36. extern void Key();

  37. /******************把數據保存到單片機內部eeprom中******************/
  38. void write_eeprom()
  39. {
  40.         SectorErase(0x2000);
  41.         byte_write(0x2000, yushe_wendu);
  42.         byte_write(0x2001, yushe_yanwu);
  43.         byte_write(0x2060, a_a);       
  44. }

  45. /******************把數據從單片機內部eeprom中讀出來*****************/
  46. void read_eeprom()
  47. {
  48.         yushe_wendu   = byte_read(0x2000);
  49.         yushe_yanwu   = byte_read(0x2001);
  50.         a_a      = byte_read(0x2060);
  51. }

  52. /**************開機自檢eeprom初始化*****************/
  53. void init_eeprom()
  54. {
  55.         read_eeprom();                //先讀
  56.         if(a_a != 1)                //新的單片機初始單片機內問eeprom
  57.         {
  58.                 yushe_wendu=50;
  59.                 yushe_yanwu=45;
  60.                 a_a = 1;
  61.                 write_eeprom();           //保存數據
  62.         }       
  63. }

  64. void delay(uint z)
  65. {
  66.         uint i,j;
  67.         for(i=0;i<z;i++)
  68.         for(j=0;j<121;j++);
  69. }
  70. /*****延時子程序*****/
  71. void Delay_DS18B20(int num)
  72. {
  73.   while(num--) ;
  74. }
  75. /*****初始化DS18B20*****/
  76. void Init_DS18B20(void)
  77. {
  78.   unsigned char x=0;
  79.   DQ = 1;         //DQ復位
  80.   Delay_DS18B20(8);    //稍做延時
  81.   DQ = 0;         //單片機將DQ拉低
  82.   Delay_DS18B20(80);   //精確延時,大于480us
  83.   DQ = 1;         //拉高總線
  84.   Delay_DS18B20(14);
  85.   x = DQ;           //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
  86.   Delay_DS18B20(20);
  87. }
  88. /*****讀一個字節*****/
  89. unsigned char ReadOneChar(void)
  90. {
  91.   unsigned char i=0;
  92.   unsigned char dat = 0;
  93.   for (i=8;i>0;i--)
  94.   {
  95.     DQ = 0;     // 給脈沖信號
  96.     dat>>=1;
  97.     DQ = 1;     // 給脈沖信號
  98.     if(DQ)
  99.     dat|=0x80;
  100.     Delay_DS18B20(4);
  101.   }
  102.   return(dat);
  103. }
  104. /*****寫一個字節*****/
  105. void WriteOneChar(unsigned char dat)
  106. {
  107.   unsigned char i=0;
  108.   for (i=8; i>0; i--)
  109.   {
  110.     DQ = 0;
  111.     DQ = dat&0x01;
  112.     Delay_DS18B20(5);
  113.     DQ = 1;
  114.     dat>>=1;
  115.   }
  116. }
  117. /*****讀取溫度*****/
  118. unsigned int ReadTemperature(void)
  119. {
  120.   unsigned char a=0;
  121.   unsigned char b=0;
  122.   unsigned int t=0;
  123.   float tt=0;
  124.   Init_DS18B20();
  125.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  126.   WriteOneChar(0x44);  //啟動溫度轉換
  127.   Init_DS18B20();
  128.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  129.   WriteOneChar(0xBE);  //讀取溫度寄存器
  130.   a=ReadOneChar();     //讀低8位
  131.   b=ReadOneChar();    //讀高8位
  132.   t=b;
  133.   t<<=8;
  134.   t=t|a;
  135.   tt=t*0.0625;
  136.   t= tt*10+0.5;     //放大10倍輸出并四舍五入
  137.   return(t);
  138. }
  139. //=====================================================================================
  140. //=====================================================================================
  141. //=====================================================================================


  142. /*****讀取溫度*****/
  143. void check_wendu(void)
  144. {
  145.         c=ReadTemperature()-5;                          //獲取溫度值并減去DS18B20的溫漂誤差
  146.         if(c<0) c=0;
  147.         if(c>=999) c=999;
  148. }

  149. //ADC0809讀取信息
  150. uchar ADC0809()
  151. {
  152.         uchar temp_=0x00;
  153.         //初始化高阻太

  154.         OE=0;
  155.         //轉化初始化
  156.         ST=0;
  157.         //開始轉換
  158.         ST=1;
  159.         ST=0;
  160.         //外部中斷等待AD轉換結束
  161.         while(EOC==0)
  162.         //讀取轉換的AD值
  163.         OE=1;
  164.         temp_=Data_ADC0809;
  165.         OE=0;
  166.         return temp_;
  167. }

  168. void Key()
  169. {
  170.         //模式選擇
  171.         if(Key1==0)
  172.         {
  173.                 while(Key1==0);
  174.                 if(Mode>=3) Mode=0;
  175.                 else
  176.                 {
  177.                            write_com(0x38);//屏幕初始化
  178.                            write_com(0x0d);//打開顯示 無光標 光標閃爍
  179.                            write_com(0x06);//當讀或寫一個字符是指針后一一位
  180.                         Mode++;
  181.                         switch(Mode)
  182.                         {
  183.                                 case 1:
  184.                                 {
  185.                                         write_com(0x80+7);//位置
  186.                                         break;
  187.                                 }
  188.                                 case 2:
  189.                                 {
  190.                                         write_com(0x80+15);//位置
  191.                                         break;
  192.                                 }
  193.                                 case 3:
  194.                                 {
  195.                                         write_com(0x38);//屏幕初始化
  196.                                         write_com(0x0c);//打開顯示 無光標 無光標閃爍
  197.                                         Mode=0;
  198.                                         write_eeprom();                           //保存數據
  199.                                         break;
  200.                                 }
  201.                         }
  202.                 }
  203.         }
  204.         if(Key2==0&&Mode!=0)
  205.         {
  206.                 while(Key2==0);
  207.                 switch(Mode)
  208.                 {
  209.                         case 1:
  210.                         {
  211.                                 yushe_wendu++;
  212.                                 if(yushe_wendu>=99)
  213.                                 yushe_wendu=99;
  214.                                 write_com(0x80+6);
  215.                                 write_data(0x30+yushe_wendu/10);
  216.                                 write_data(0x30+yushe_wendu%10);
  217.                                 break;
  218.                         }
  219.                         case 2:
  220.                         {
  221.                                 yushe_yanwu++;
  222.                                 if(yushe_yanwu>=255)
  223.                                 yushe_yanwu=255;
  224.                                 write_com(0x80+13);
  225.                                 write_data(0x30+yushe_yanwu/100);
  226.                                 write_data(0x30+yushe_yanwu%100/10);
  227.                                 write_data(0x30+yushe_yanwu%10);
  228.                                 break;                               
  229.                         }
  230.                 }
  231.         }
  232.         if(Key3==0&&Mode!=0)
  233.         {
  234.                 while(Key3==0);
  235.                 switch(Mode)
  236.                 {
  237.                         case 1:
  238.                         {
  239.                                 yushe_wendu--;
  240.                                 if(yushe_wendu<=0)
  241.                                 yushe_wendu=0;
  242.                                 write_com(0x80+6);
  243.                                 write_data(0x30+yushe_wendu/10);
  244.                                 write_data(0x30+yushe_wendu%10);
  245.                                 break;
  246.                         }
  247.                         case 2:
  248.                         {
  249.                                 yushe_yanwu--;
  250.                                 if(yushe_yanwu<=0)
  251.                                 yushe_yanwu=0;
  252.                                 write_com(0x80+13);
  253.                                 write_data(0x30+yushe_yanwu/100);
  254.                                 write_data(0x30+yushe_yanwu%100/10);
  255.                                 write_data(0x30+yushe_yanwu%10);
  256.                                 break;                               
  257.                         }
  258.                 }
  259.         }
  260.         delay(200);
  261.         write_com(0x38);//屏幕初始化
  262.         write_com(0x0c);//打開顯示 無光標 無光標閃爍
  263. }

  264. void main()
  265. {
  266.         check_wendu();
  267.         check_wendu();
  268.         Init1602();
  269.         init_eeprom();  //開始初始化保存的數據
  270.         while(1)
  271.         {
  272.                 temp=ADC0809();
  273.                 check_wendu();
  274.                 Key();

  275.                 if(Mode==0)
  276.                 {
  277.                         Display_1602(yushe_wendu,yushe_yanwu,c,temp);
  278.                         if(temp>=yushe_yanwu)
  279.                         {
  280.                                 LED_yanwu=0;
  281.                                 baojing=0;
  282.                                 fs=0;
  283.                         }
  284.                         else
  285.                         {
  286.                                 LED_yanwu=1;
  287.                         }
  288.                         if(c>=(yushe_wendu*10))
  289.                         {
  290.                                 baojing=0;
  291.                                 LED_wendu=0;
  292.                         }
  293.                         else
  294.                         {
  295.                                 LED_wendu=1;
  296.                         }
  297.                         if((temp<yushe_yanwu)&&(c<(yushe_wendu*10)))
  298.                         {
  299.                                 baojing=1;
  300.                                 fs=1;
  301.                         }
  302.                 }
  303.         }
  304. }       
復制代碼

Keil代碼與Proteus仿真下載: 仿真程序.7z (312.34 KB, 下載次數: 104)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50

查看全部評分

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

使用道具 舉報

沙發
ID:441043 發表于 2022-10-31 17:10 | 只看該作者
題主,protues用得是那個版本
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级艳情片免费观看 | 午夜爱爱网 | www.久久精品视频 | 成av在线| 亚洲成av人片在线观看 | 久久99国产精一区二区三区 | 日韩中文字幕在线观看 | 男人的天堂久久 | 一区二区三区四区电影视频在线观看 | 国产亚洲网站 | 国产成人网 | 日韩中文字幕在线不卡 | 亚洲欧洲成人av每日更新 | 欧美一级全黄 | 成人性视频免费网站 | 国产成人麻豆免费观看 | 亚洲久久 | 久久人爽 | 国产在线精品一区二区三区 | 中文字幕蜜臀av | 久久久久免费 | 中文字幕在线观看视频一区 | 韩国久久精品 | 亚洲一区二区久久 | 亚洲三区在线观看 | 国产一区二区三区免费观看视频 | 在线看一区二区 | 青青草国产在线观看 | 亚洲日日 | 婷婷福利 | 91色视频在线观看 | 羞羞视频免费在线观看 | 午夜精品视频 | 欧美a在线观看 | 亚洲91精品 | 神马影院一区二区三区 | 91视频进入| 午夜影院在线观看视频 | 日本精品一区二区 | 亚洲成人精 | 欧美日一区二区 |