找回密码
 注册

QQ登录

只需一步,快速开始

搜索

51单片机火灾报警Proteus仿真程序 adc0808+1602显示

[复制链接]
coolice 发表于 2020-1-22 12:10:39 | 显示全部楼层 |阅读模式
用滑动变阻代替烟雾、温度传感器。采有adc0808双通道,通过at89c52,lcd1602显示。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png

单片机源程序如下:

  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define yushe_wendu 54
  6. #define yushe_yanwu 23

  7. uchar code Init1[]="SET:000  NOW:000";
  8. uchar code Init2[]="SEY:000  NOW:000";
  9. uchar code num[]="0123456789";
  10. uchar temp;
  11. unsigned char CHANNEL; //AD channel variable

  12. sbit ST_ALE=P3^0;   //START and ALE both connect to P3.0
  13. sbit EOC=P3^1;   //EOC connect to P3.1      
  14. sbit OE=P3^2;    //OE conect to P3.2
  15. sbit CLK=P3^3;
  16. sbit lcdrs=P2^4;
  17. sbit lcdrw=P2^5;
  18. sbit lcden=P2^6;
  19. sbit beep=P3^4;
  20. sbit led=P3^5;

  21. void delay(uint x)
  22. {
  23.         uint i;
  24.         for(;x>0;x--)
  25.                 for(i=5;i>0;i--);        
  26. }

  27. void write_com(uchar com )
  28. {
  29.         lcden = 0;
  30.         lcdrs = 0;//表示命令选择
  31.         P1 = com;
  32.         delay(5);
  33.         lcden=1;
  34.         delay(5);
  35.         lcden=0;
  36.                
  37. }

  38. void write_data(uchar date)
  39. {
  40.         lcden = 0;
  41.         lcdrs = 1;//n.1 write into the data;
  42.         P1 = date;
  43.         delay(5);
  44.         lcden=1;
  45.         delay(5);
  46.         lcden=0;        
  47. }

  48. //1602初始化
  49. void Init1602()
  50. {
  51.   uchar i=0;
  52.   write_com(0x38);//屏幕初始化
  53.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  54.   write_com(0x06);//当读或写一个字符是指针后一一位
  55.   write_com(0x80);//设置位置
  56.   
  57. for(i=0;i<4;i++)
  58.   {
  59.                 write_data(Init1[i]);          //显示数组1的数据
  60.   }
  61.         write_com(0x80+9);
  62. for(i=9;i<13;i++)
  63.   {
  64.                 write_data(Init1[i]);          //显示数组1的数据
  65.   }        
  66.   write_com(0x80+0x40);//设置位置
  67. for(i=0;i<4;i++)
  68.   {
  69.                 write_data(Init2[i]);          //显示数组2的数据
  70.   }
  71.         write_com(0x80+0x40+9);
  72. for(i=9;i<13;i++)
  73.   {
  74.                 write_data(Init2[i]);          //显示数组2的数据
  75.   }
  76. }

  77. void display(uchar channel)

  78. {

  79. unsigned long temp;
  80. unsigned int k=0,i=0;

  81. temp=P0;    //the temporary variable

  82.         if(channel==0)
  83.         {
  84.         write_com(0x80+4);                    //设置烟雾
  85.         write_data(0x30+yushe_wendu/100);
  86.         write_data(0x30+yushe_wendu%100/10);
  87.         write_data(0x30+yushe_wendu%10);

  88.         write_com(0x80+13);               //时时烟雾
  89.         write_data(0x30+temp/100);
  90.         write_data(0x30+temp%100/10);
  91.         write_data(0x30+temp%10);        
  92.         }
  93.         if(channel==1)
  94.         {
  95.   write_com(0x80+0x40+4);           //设置烟雾
  96.         write_data(0x30+yushe_yanwu/100);
  97.         write_data(0x30+yushe_yanwu%100/10);
  98.         write_data(0x30+yushe_yanwu%10);

  99.         write_com(0x80+0x40+13);           //时时烟雾
  100.         write_data(0x30+temp/100);
  101.         write_data(0x30+temp%100/10);
  102.         write_data(0x30+temp%10);
  103.         }
  104. }  

  105. void main()
  106. {
  107. CHANNEL=0xF8;  //AD channel 0
  108. ST_ALE=0;   //START and ALE default
  109. OE=0;    //OE default
  110. TMOD=0x02;  //T0 operate in mode 2  
  111. TH0=0xFF;   //auto load value
  112. TL0=0xFF;   //default value
  113. EA=1;    //all interrupt enable
  114. ET0=1;    //T0 interrupt enable
  115. TR0=1;    //T0 run
  116. beep=0;
  117. led=0;
  118. while(1)
  119. {  
  120.   P2=0x07&CHANNEL;  //choose AD channel
  121.   ST_ALE=1;  //lock the AD channel address
  122.   ST_ALE=0;  //AD run
  123.   Init1602();
  124.   while(EOC==0); //wait until AD over
  125.   OE=1;   //enable to transmit AD data
  126.   if(CHANNEL==0xF8)
  127.   {
  128.   display(0);   //view the AD result and diaplay LED  
  129.   }
  130.   if(CHANNEL==0xF9)
  131.   {
  132.   display(1);   //view the AD result and diaplay LED  
  133.   }
  134.   delay(50);     //delay to prepare for next AD channel  
  135.   OE=0;          //forbit to transmit AD data  
  136.   if(CHANNEL==0xF9)
  137.   CHANNEL=0xF7;             //AD channel loop
  138.   CHANNEL++;                //next AD channel   
  139. }  
  140. }

  141. void T1_TIME() interrupt 1 using 0
  142. {
  143. CLK=~CLK;   //CLK 500 kHz
  144. }
复制代码
火灾报警两路.zip (301.94 KB, 售价: 1 E币)

duzailian 发表于 2024-6-11 20:37:17 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-21 14:21

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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