找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3110|回复: 0
收起左侧

一种智能粮仓安全监控系统的设计(下位机单片机部分)

[复制链接]
ID:123523 发表于 2016-5-27 16:37 | 显示全部楼层 |阅读模式
  硬件设计包括如下模块:
n      最小系统模块: STC89C52RC正常工作的最小系统;
n      模拟输入模块:一路光照、一路电压;
n      数字输入模块:两路温度、一路湿度、多个按键;
n      模拟输出模块:一路光照;
n      数字输出模块:一路PWM波控制直流电机、蜂鸣器、多个工作状态指示灯;
n      液晶显示模块:一块12864LCD显示输出;
n      串口通信模块:CH340T模块电路
  软件设计包括如下模块:

n      C代码:AD采集、数字传感器驱动、DA输出、按键与液晶控制、串口收发处理等

  1. #include<reg52.h>
  2. #include<stdio.h>
  3.        
  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. #include"12864.c"
  7. #include"PCF8591ADDA.c"
  8. #include"DS18B20.C"
  9. #include"DTH11.C"

  10.         sbit led0=P1^0;//通信测试灯
  11.         sbit led1=P1^1;
  12.         sbit led2=P1^2;
  13.         sbit led3=P1^3;
  14.         sbit MOTOR=P1^4;
  15.         uchar ren_flag,ren_buff;
  16.         uchar buff[8];
  17.         char *get="Get it.";
  18.         char *sendflag="sendflag";
  19.         unsigned char num;                   //DA数模输出变量
  20.         unsigned char ADtemp;      //定义中间变量

  21. void serial_init(void)        //串口初始化函数
  22. {
  23.         TMOD=0x20;//00100000
  24.         PCON=0x00;//波特率不加倍
  25.         SCON=0x50;//01010000 方式1,允许接收
  26.         TH1=0xfd;          //波特率9600
  27.         TL1=0xfd;
  28.         EA=1;
  29.     ES=1;
  30.         TR1=1;
  31.         ET1=0;
  32.        
  33. }
  34. void serial_send(char*parr)   //串口数据发送函数
  35. {
  36.         do
  37.         {
  38.                 SBUF=*parr++;  //发送数据
  39.                 while(!TI);  //等待发送完成标志为1
  40.                 TI=0;                 //标志清0  
  41.         }while(*parr);   //保持循环直到字符为‘\0’

  42. }

  43. void DAQ_display_sender()
  44. {
  45. //DS18B20
  46.                
  47.                 show_char(0,0,"Data acquisition");
  48.                 tempchange();              //温度转换函数
  49.                 get_temp();
  50.                 show_char(1,2,"              ");       
  51.                 show_char(1,0,"TEM:");
  52.                
  53.                 sprintf(buff,"%.8s",sendflag);
  54.                 serial_send(buff);                       
  55.                 sprintf(buff,"%.3f",f_temp);//将浮点型温度格式化为字符型               
  56.                 show_char(1,2,buff);   //获取温度并显示
  57.                 show_char(1,5,"℃");

  58.                 f_temp+=0x64;
  59.                 sprintf(buff,"%.3f",f_temp);                                                                  
  60.                 serial_send(buff);                  //串口发送数据
  61.              
  62.                   /*DA
  63.            DAC(num);       //DA输出,可以用LED模拟电压变化
  64.                    num++;          //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
  65.                   */
  66.                   
  67.                   //DTH11
  68.                         RH();
  69.                         sprintf(buff,"%.1f",f_temp_T);//将浮点型温度格式化为字符型                  
  70.                     show_char(2,0,"T:    ℃");
  71.                         show_char(2,1,buff);   
  72.                         serial_send(buff);

  73.                         sprintf(buff,"%.1f",f_temp_RH);//将浮点型温度格式化为字符型                  
  74.                     show_char(2,4,"R:    %");
  75.                         show_char(2,5,buff);   
  76.                         serial_send(buff);

  77.                   //AD
  78.                    if(ADFlag)      //定时采集输入模拟量
  79.            {
  80.                            ADFlag=0;

  81.                            ADtemp=ReadADC(0);
  82.                         TempData[0]=(ReadADC(0))/50;//处理0通道电压显示
  83.                           TempData[1]=((ReadADC(0))%50)/10;
  84.                          
  85.                         ADtemp=ReadADC(2);
  86.                         TempData[4]=(ReadADC(2))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  87.                           TempData[5]=((ReadADC(2))%50)/10;
  88.                        
  89.                         /* ADC通道2、通道4采集
  90.                         ADtemp=ReadADC(1);
  91.                         TempData[2]=(ReadADC(1))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  92.                           TempData[3]=((ReadADC(1))%50)/10;                           
  93.                     
  94.                  
  95.                       ADtemp=ReadADC(3);
  96.                         TempData[6]=(ReadADC(3))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  97.                           TempData[7]=((ReadADC(4))%50)/10;
  98.                     */                     
  99.                         }
  100.                         ADFlag=1;
  101.                        
  102.                         f_temp=TempData[4]+TempData[5]*0.1;//通道3光敏电阻电压值
  103.                         sprintf(buff,"%.1f",f_temp);//                  
  104.                         show_char(3,0,"O:     V");
  105.                         show_char(3,1,buff);
  106.                         serial_send(buff);              

  107.                                                                                                                  
  108.                         f_temp=TempData[0]+TempData[1]*0.1;
  109.                         sprintf(buff,"%.1f",f_temp);//将浮点型温度格式化为字符型                  
  110.                         show_char(3,4,"V:     V");
  111.                         show_char(3,5,buff);      
  112.                         serial_send(buff);//串口发送数据
  113.                        
  114.                 /*  ADC通道3、通道4处理显示信息                      
  115.                         f_temp=TempData[4]+TempData[5]*0.1;
  116.                         sprintf(buff,"%.1f",f_temp);//将浮点型温度格式化为字符型                  
  117.                     show_char(3,0,"3:   V");
  118.                         show_char(3,1,buff);                          
  119.                         serial_send(buff);                  //串口发送数据
  120.                        
  121.                         f_temp=TempData[6]+TempData[7]*0.1;
  122.                         sprintf(buff,"%.1f",f_temp);//将浮点型温度格式化为字符型                  
  123.                     show_char(3,4,"4:   V");
  124.                         show_char(3,5,buff);   
  125.                         serial_send(buff);                  //串口发送数据
  126.                 */
  127.                   

  128.                
  129. }

  130. void main()                 //主函数
  131. {
  132.        
  133.        
  134.         cmg();//  数码管锁存函数                   关时钟DS1302   
  135.     wela=0;
  136.         dula=0;
  137.     lcd_init();                //初始化LCD         
  138.         serial_init();
  139.         MOTOR=0;
  140.         while(1)
  141.         {
  142.           if(ren_flag==0)
  143.           {
  144.                   led0=1;
  145.                 MOTOR=0;            
  146.                   show_char(0,0,"Wait for command");
  147.                   show_char(1,0,"                ");
  148.                   show_char(2,0,"                ");
  149.                   show_char(3,0,"                ");
  150.           }
  151.       if(ren_flag==1) //测试通信
  152.           {                  
  153.                   led0=0;
  154.                   delay_ms(10);
  155.                   led0=1;
  156.                   MOTOR=0;
  157.                   show_char(0,0,"Connection Succe");
  158.                   show_char(1,0,"ssful!          ");
  159.                   show_char(2,0,"                ");
  160.                   show_char(3,0,"                ");
  161.                   sprintf(buff,"%.8s",get);
  162.                   serial_send(buff);                  
  163.            }       
  164.           if(ren_flag==2)//
  165.                 {
  166.                   MOTOR=0;
  167.              DAQ_display_sender();
  168.                 }        
  169.        
  170.           if(ren_flag==3)
  171.            {
  172.             MOTOR=1;
  173.                 DAQ_display_sender();
  174.                 }

  175.            if(ren_flag==4)
  176.            {
  177.             MOTOR=0;
  178.                 DAQ_display_sender();

  179.             }
  180.        
  181.          if(ren_flag==5)
  182.           {
  183.            show_char(0,0,"Stop DAQ and sen");
  184.            show_char(1,0,"ding!          ");
  185.            show_char(2,0,"                ");
  186.            show_char(3,0,"                ");
  187.            MOTOR=0;
  188.            led0=1;
  189.           }
  190.           }
  191.         }

  192. void ser() interrupt 4
  193. {

  194. if(TI)
  195.    ;
  196.   else
  197.   {       
  198.     if(RI)
  199.     lcd_clean();
  200.           ES=0;       
  201.     RI=0;       

  202.         ren_buff=SBUF;
  203.         switch(ren_buff)
  204.            {
  205.       case 0x31: ren_flag=1; break;  //接受到1,第一个LED亮         
  206.       case 0x32: ren_flag=2; break;  //接受到2,第二个LED亮        
  207.       case 0x33: ren_flag=3; break;  //接受到3,第三个LED亮        
  208.       case 0x34: ren_flag=4;break;  //接受到4,第四个LED亮      
  209.       case 0x35: ren_flag=5;break;  //接受到5,第五个LED亮            
  210.       case 0x36: ren_flag=6;break;  //接受到5,第六个LED亮                  
  211.       case 0x37: ren_flag=7;break;  //接受到5,第七个LED亮
  212.           case 0x38: ren_flag=8;break;  //接受到5,第八个LED亮
  213.           default:   ren_flag=0;break;  //接受到其它数据,蜂鸣器响         
  214.       led1=~led1;
  215.            }

  216.         ES=1;
  217.         }
  218. }                  
复制代码

0.png


C源码.rar

59.77 KB, 下载次数: 13, 下载积分: 黑币 -5

下位机源代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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