粮库温度巡检系统仿真原理图如下,1602液晶屏显示(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include"LCD1602.h"
- #include "ds18b20.h"
- #include "eepom52.h"
- sbit buzzer = P1^3; //蜂鸣器
- sbit Reduc = P3^4; //减
- sbit Add = P3^5; //加
- sbit Mode = P3^6; //设置
- ///************************************************
- //** 函数名称 : void InitUART(void)
- //** 函数功能 : 串口初始化函数
- //** 输 入 : 无
- //** 输 出 : 无
- //** 说 明 : 定时器1方式2波特率发生模式,波特率9600bps,晶振11.0592MHZ,误差0%
- //************************************************/
- //void InitUART(void)
- //{
- // TMOD |= 0x20;
- // SCON = 0x50;
- // TH1 = 0xFD;
- // TL1 = 0xFD;
- // PCON = 0x00;
- // ES = 0;
- // TR1 = 1;
- // EA = 1;
- //}
- ///*********************************************
- //**名称:void TxChar(uchar ch)
- //**功能:串口发送函数
- //**输入:uchar ch>当前发送数据
- //**输出:无
- //*********************************************/
- //void TxChar(unsigned char ch)
- //{
- // SBUF=ch;
- // while(!TI);
- // TI=0;
- //}
- /************************************************
- ** 函数名称 : void main(void)
- ** 函数功能 : 主函数
- ** 输 入 : 无
- ** 输 出 : 无
- ** 说 明 :
- ************************************************/
- void main(void)
- {
- uint buzzer_count=0,buzzer_flag=0,buzzer_time=40;//蜂鸣器报警变量
- uint as=0;
- uint wendu1=2000,wendu2=2000,wendu3=2000,wendu4=2000;//温度变量
- uint wendu5=2000,wendu6=2000,wendu7=2000,wendu8=2000;//温度变量
- uchar disp_count=0;//显示计时变量
- uint data_l=10,data_h=30; //上下限报警值
- uchar Mode_project=1,Mode_flag=1,Mode_count=0;//设置变量
- uchar disp1[16]={"1:00.0C 2:00.0C"};
- uchar disp2[16]={"3:00.0C 4:00.0C"};
- uchar disp3[16]={"5:00.0C 6:00.0C"};
- uchar disp4[16]={"7:00.0C 8:00.0C"};
-
- LCD_Init();
- // InitUART();
- /****读出每个传感器的序列号****/
- // while(1)
- // {
- // uchar i;
- // uchar *ds18b20_rom;
- // ds18b20_rom=read_rom(); //读序列号
- // for(i=0;i<8;i++)
- // {
- // disp1[i]=*ds18b20_rom;
- // TxChar(disp1[i]);
- // ds18b20_rom++;
- // }
- // WriteCOMDATA(0x80,0);
- // for(i=0;i<8;i++) //显示序列号
- // {
- // print_char(disp1[i]/16);
- // print_char(disp1[i]%16);
- // }
- // }
- /***开机把数据从单片机内部eepom中读出来***/
- if(byte_read(0x2050)!=1)
- {
- SectorErase(0x2000);
- byte_write(0x2000,data_l);
- byte_write(0x2001,data_h);
- byte_write(0x2050,1);
- }
- if(byte_read(0x2050)==1)
- {
- data_l=byte_read(0x2000);
- data_h=byte_read(0x2001);
- }
-
- while(1)
- {
- if(disp_count>80)disp_count=0;
- if(++disp_count==10)
- {
- wendu1=read_temp(1);
- disp1[2]=wendu1/1000+0x30; //温度十位
- disp1[3]=wendu1/100%10+0x30;//温度个位
- disp1[5]=wendu1/10%10+0x30;//温度小数第一位
- }
- else if(disp_count==20)
- {
- wendu2=read_temp(2);
- disp1[11]=wendu2/1000+0x30; //温度十位
- disp1[12]=wendu2/100%10+0x30;//温度个位
- disp1[14]=wendu2/10%10+0x30;//温度小数第一位
- }
- else if(disp_count==30)
- {
- wendu3=read_temp(3);
- disp2[2]=wendu3/1000+0x30; //温度十位
- disp2[3]=wendu3/100%10+0x30;//温度个位
- disp2[5]=wendu3/10%10+0x30;//温度小数第一位
-
- }
- else if(disp_count==40)
- {
- wendu4=read_temp(4);
- disp2[11]=wendu4/1000+0x30; //温度十位
- disp2[12]=wendu4/100%10+0x30;//温度个位
- disp2[14]=wendu4/10%10+0x30;//温度小数第一位
- }
- else if(disp_count==50)
- {
- wendu5=read_temp(5);
- disp3[2]=wendu5/1000+0x30; //温度十位
- disp3[3]=wendu5/100%10+0x30;//温度个位
- disp3[5]=wendu5/10%10+0x30;//温度小数第一位
- }
- else if(disp_count==60)
- {
- wendu6=read_temp(6);
- disp3[11]=wendu6/1000+0x30; //温度十位
- disp3[12]=wendu6/100%10+0x30;//温度个位
- disp3[14]=wendu6/10%10+0x30;//温度小数第一位
- }
- else if(disp_count==70)
- {
- wendu7=read_temp(7);
- disp4[2]=wendu7/1000+0x30; //温度十位
- disp4[3]=wendu7/100%10+0x30;//温度个位
- disp4[5]=wendu7/10%10+0x30;//温度小数第一位
- }
- else if(disp_count==80)
- {
- wendu8=read_temp(8);
- disp4[11]=wendu8/1000+0x30; //温度十位
- disp4[12]=wendu8/100%10+0x30;//温度个位
- disp4[14]=wendu8/10%10+0x30;//温度小数第一位
- }
- //温度值与报警值比较
- if(wendu1/10>data_l*10 &&
- wendu1/10<data_h*10 &&
- wendu2/10>data_l*10 &&
- wendu2/10<data_h*10 &&
- wendu3/10>data_l*10 &&
- wendu3/10<data_h*10 &&
- wendu4/10>data_l*10 &&
- wendu4/10<data_h*10 &&
- wendu5/10>data_l*10 &&
- wendu5/10<data_h*10 &&
- wendu6/10>data_l*10 &&
- wendu6/10<data_h*10 &&
- wendu7/10>data_l*10 &&
- wendu7/10<data_h*10 &&
- wendu8/10>data_l*10 &&
- wendu8/10<data_h*10)
- {
- buzzer_flag=0;
- buzzer=1;
- }
- else
- {
- buzzer_flag=1;
- }
- /****蜂鸣器报警****/
- if(buzzer_flag)
- {
- buzzer_count++;if(buzzer_count>buzzer_time*10)buzzer_count=buzzer_time+1;
- if(buzzer_count%buzzer_time==0)
- {
- buzzer=~buzzer;
- }
- }
- //按下设置键,进入设置页面
- if(Mode==0 && Mode_flag)
- {
- buzzer=1;
- as=0;
- WriteCOMDATA(0x0F,0);
- delayms(100);
- if(Mode==0)
- {
- while(Mode==0);
- Mode_flag=0;
- Mode_project=1;
- //设置页面显示内容
- WriteChar(1,0,16," T SET ");
- WriteChar(2,0,16,"T-L:00c T-H:000c");
- WriteCOMDATA(0xC4,0);
- WriteCOMDATA(data_l/10+0x30,1);
- WriteCOMDATA(data_l%10+0x30,1);
- WriteCOMDATA(0xCC,0);
- WriteCOMDATA(data_h/100+0x30,1);
- WriteCOMDATA(data_h/10%10+0x30,1);
- WriteCOMDATA(data_h%10+0x30,1);
- while(Mode==0);
- while(1)
- {
- switch(Mode_project)
- {
- case 1:
- WriteCOMDATA(0xC4,0);
- WriteCOMDATA(data_l/10+0x30,1);
- WriteCOMDATA(data_l%10+0x30,1);
- WriteCOMDATA(0xC5,0);
- break;
- case 2:
- WriteCOMDATA(0xCC,0);
- WriteCOMDATA(data_h/100+0x30,1);
- WriteCOMDATA(data_h/10%10+0x30,1);
- WriteCOMDATA(data_h%10+0x30,1);
- WriteCOMDATA(0xCE,0);
- break;
-
- }
- delayms(400);
- //按下加键,对设定目标加
- if(Add==0)
- {
- delayms(400);
- switch(Mode_project)
- {
- case 1:data_l+=1;break;
- case 2:data_h+=1;break;
- }
- }
- //按下减键,对设定目标减
- if(Reduc==0)
- {
- delayms(400);
- switch(Mode_project)
- {
- case 1:data_l-=1;break;
- case 2:data_h-=1;break;
- }
- }
- //短按设置键,切换设定目标,长按设置键2S,则退出设置页面
- if(Mode==0)
- {
- delayms(600);
- while(Mode==0)
- {
- delayms(600);
- Mode_count++;
- if(Mode_count>6)
- {
- WriteCOMDATA(0x0C,0);
- delayms(100);
- WriteChar(1,0,16,disp1); //第一行显示内容
- WriteChar(2,0,16,disp2); //第二行显示内容
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
这个程序是网上下载的,里面的hex可以运行,但是用keil编译后的程序不行 屏幕不显示,求大神指导如何修改:
粮仓粮库8点温度采集系统.rar
(92.51 KB, 下载次数: 122)
这里有一个可用的版本,大家可以参考http://www.51hei.com/bbs/dpj-55028-1.html
|