




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机系统设计作品名称温度控制器姓名刘欢材料清单温度传感器,缓冲器,12864液晶屏,时钟芯片DS1302,模数转换器ADC0808,单片机AT89C52作品简介1.说明:社会在不断进步,人们对电子产品的设计要求越来越高。温度在工业控制中起着很重要的作用,如何用单片机设计这一系统并使它发挥出应有的功能显得尤为关键。2.介绍:DS1302具有掉电记忆功能,可以准确的记录时间,保证时间的准确性。用ADC0808模数转换器进行模拟量到数字量之间的转换,并在12864液晶屏上显示出来。利用74LS244三态输出,作为地址驱动器、时钟驱动器、总线驱动器和定向发送器等3.功能:此系统具有体积小,功耗低,抗干扰性强,工作温度范围宽等优点。能够准确测定当前温度,根据不同的场所可以设定温度不同的上限和下限值,以便达到控制的要求。设计说明开机启动界面可以看到当前的测量值,设置值以及时间和日期。所用器件较少,电路连接清晰明了,便于观察。时钟芯片DS1302及数模转换器ADC0808,其中数模转换器是一个比较重要的部分要 设 计 说 明部分。现在看到的这个窗口是温度控制器的显示窗口,用户可以根据地点要求很方便的观测到当前的温度变化。通过此系统的按键可以进入温度和时间日期的设置界面,按键有确定,退出,上下,左右几个键,操作方便,可以根据相应的要求此系统进行调整来达到用户要求值。进行设置的按键以及74LS244缓冲器,如对12864屏中所显示的数据及工业控制所要求的参数进行相应的设置,来完成工业控制的要求。这是温度控制器在工作时的指示灯,可以看到它是亮的,说明此系统工作正常。温度控制器整体布局连接,经过连接调试之后成功运行。下面是实现此系统功能的程序:/设计程序/#include /宏定义/#define uchar unsigned char/定义uchar为无符号字符#define uint unsigned int/定义uint为无符号整形#define ENT 0 /定义确定键为0#define ESC 1 /定义退出键为1#define L 2 /定义左移键为2#define R 3 /定义右移键为3#define UP 4 /定义上移键为4#define DOWN 5 /定义下移键为5#define ADD 6 /定义加移键为6#define SUB 7 /定义减移键为7/位定义/sbit wr=P20;sbit rd=P21;sbit ce=P22;sbit cd=P23;sbit rst=P24;sbit tsclk=P26;sbit tdio=P27;sbit tce=P25;sbit ad_st=P34;sbit ad_oe=P33;sbit ad_eoc=P32;sbit LED=P35;sbit KEY_OE=P36;sbit ad_c=P37;/包含函数声明/void delay(uint t); /延时函数void init_12864(); /初始化函数void write_data(uchar dat); /写数据函数void write_cmd1(uchar cmd); /写命令函数void write_cmd2(uchar dat,uchar cmd); void write_cmd3(uchar data1,uchar data2,uchar cmd);uchar read_status(); /读状态函数void check_status(); /检查状态函数void clear_screen(); /清屏函数void display_char(uchar x,uchar y,uchar ch); /显示字符函数void display_dat(uchar x,uchar y,uchar ch); /显示数据函数void display_uint(uchar x,uchar y,uint dat);void display_uint3(uchar x,uchar y,uint dat);void display_int(uchar x,uchar y,int dat);void display_float(uchar x,uchar y,float dat,uchar dp);void setfs(void);/设置方式函数void setsj(void);/设置时间函数uchar fs,set,key;float cl;uchar year,mon,day,hour,min,sec; /定义年月日时分秒uchar gbn,setbuf3,sbuf8; /定义光标及光标位置void dispiay_time(void); void display_mainbt(void);void display_setbt(void);void display_maindat(void);void display_setdat(void);void display_setbt1(void);void display_setdat1(void);void write_t(uchar add,uchar date);uchar read_t(uchar add);uchar adzh(uchar add);uchar read_key(void);/汉字代码/ uchar code HZ02032=0x40,0x00,0x27,0xF0,0x24,0x10,0x07,0xF0,0x94,0x10,0x54,0x10,0x17,0xF0,0x20,0x00, /温0x2F,0xFC,0xC9,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x5F,0xFE,0x40,0x00, 0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x2F,0xFC,0x22,0x20,0x23,0xE0, /度0x20,0x00,0x27,0xF8,0x22,0x10,0x21,0x20,0x20,0xC0,0x41,0x30,0x46,0x0E,0x98,0x04,0x10,0x00,0x10,0x20,0x10,0x10,0xFD,0xFE,0x11,0x04,0x10,0x50,0x14,0x8C,0x19,0x04,/控0x30,0x00,0xD1,0xFC,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x53,0xFE,0x20,0x00,0x24,0x04,0x34,0x04,0x24,0x24,0x3F,0xA4,0x44,0x24,0x04,0x24,0x7F,0xA4,0x04,0x24,/制0x3F,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x24,0x84,0x27,0x84,0x05,0x14,0x04,0x08,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C,0x01,0x10,0x01,0x08,0xFF,0xFC,0x06,0xC0,/器0x18,0x30,0xE0,0x0E,0x3E,0xFC,0x22,0x88,0x22,0x88,0x22,0x88,0x3E,0xF8,0x00,0x00,0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,/测0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x00,0x00,0xFF,0xFE,0x11,0x10,/量0x1F,0xF0,0x11,0x10,0x1F,0xF0,0x01,0x00,0x1F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x00,0x40,0x00,0x21,0xF0,0x31,0x10,0x21,0x10,0x01,0x10,0x01,0x10,0xE2,0x0E,0x25,0xF8, /设0x21,0x08,0x21,0x08,0x20,0x90,0x20,0x90,0x28,0x60,0x30,0x90,0x23,0x0E,0x0C,0x04,0x3F,0xF8,0x24,0x48,0x24,0x48,0x3F,0xF8,0x01,0x00,0x7F,0xFC,0x02,0x00,0x1F,0xF0, /置0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /:0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0x40,0x97,0xF8,0x94,0x08,0xA0,0x00,0xA3,0xF0,0x90,0x00,0x90,0x00,0x97,0xF8,0x91,0x20,0xE1,0x20,0x82,0x20,0x84,0x28,0x88,0x18;/显示汉字函数/void display_HZ(uchar x,uchar y,uchar *hz)/x 0-3 y 0-7uchar i,j=0;for(i=0;i16;i+) write_cmd3(j/2)4)|(y*2),x,0x24);/地址指针设置.低地址,高地址,命令 write_cmd2(hzj+,0xc0); write_cmd2(hzj+,0xc0);void display_HZchar(uchar x,uchar y,uchar *hz)/x 0-3 y 0-7uchar i,j=0;for(i=0;i8;i+) write_cmd3(j)|(y),x,0x24);/地址指针设置.低地址,高地址,命令 write_cmd2(hzj+,0xc0);void main()uchar i,j,t=0;uchar ad_dat;uint dat;float v;/定时器设置/SCON=0X50; /串行口控制寄存器,工作方式2TMOD=0X20; /工作方式寄存器,工作方式2PCON=0X00; /电源控制寄存器,波特率不加倍TH1=253; /装初值,高八位TL1=253;/装初值,低八位TR1=1;/启动定时器1ad_oe=0;KEY_OE=1;fs=0;set=25;init_12864();/初始化函数display_mainbt(); display_maindat(); while(1) for(i=0;i100;i+) key=read_key(); /读键if(key8) break; if(key=0) fs=1;clear_screen();/清屏display_setbt();/设置gbn=0; if(key=1) fs=2;clear_screen();display_setbt1();gbn=0; switch(fs) case 0:display_maindat();break;case 1:setfs();break;case 2:setsj();break;default:break; /显示字符函数,处在x y处显示chvoid display_char(uchar x,uchar y,uchar ch)/x 0-7 y 0-15write_cmd3(x*2)4)+y),0x00,0x24);/地址指针位置write_cmd2(ch-32,0xc0);/t6963c字符表与ASCII差32void display_dat(uchar x,uchar y,uchar ch)/x 0-7 y 0-15write_cmd3(x*2)4)+y),0x00,0x24);/地址指针位置write_cmd2(ch+16,0xc0);/t6963c字符表与ASCII差32void display_uint(uchar x,uchar y,uint dat) /x,y在屏中位置及显示的数据 display_dat(x,y,dat/10000); display_dat(x,y+1,(dat%10000)/1000); display_dat(x,y+2,(dat%1000)/100); display_dat(x,y+3,(dat%100)/10); display_dat(x,y+4,dat%10);void display_uint3(uchar x,uchar y,uint dat) display_dat(x,y,(dat%1000)/100); display_dat(x,y+1,(dat%100)/10); display_dat(x,y+2,dat%10);void display_int(uchar x,uchar y,int dat) if(dat0) dat=-dat;display_char(x,y,-); display_dat(x,y+1,dat/10000); display_dat(x,y+2,(dat%10000)/1000); display_dat(x,y+3,(dat%1000)/100); display_dat(x,y+4,(dat%100)/10); display_dat(x,y+5,dat%10);void display_float(uchar x,uchar y,float dat,uchar dp) /测量值显示的数据 uint n; switch(dp) case 0: n=dat; display_dat(x,y+1,n/1000); display_dat(x,y+2,(n%1000)/100); display_dat(x,y+3,(n%100)/10); display_dat(x,y+4,n%10); break; case 1: n=dat*10; display_dat(x,y+1,n/1000); display_dat(x,y+2,(n%1000)/100); display_dat(x,y+3,(n%100)/10); display_char(x,y+4,.); display_dat(x,y+5,n%10); break; case 2: n=dat*100; display_dat(x,y+1,n/1000); display_dat(x,y+2,(n%1000)/100); display_char(x,y+3,.); display_dat(x,y+4,(n%100)/10); display_dat(x,y+5,n%10); break; case 3: n=dat*1000; display_dat(x,y+1,n/1000); display_char(x,y+2,.); display_dat(x,y+3,(n%1000)/100); display_dat(x,y+4,(n%100)/10); display_dat(x,y+5,n%10); break; void delay(uint t)uint i,j;for(i=0;it;i+) for(j=0;j5;j+);void init_12864()rst=0;delay(10);rst=1;wr=1;rd=1;ce=1;cd=1;rst=1;check_status();write_cmd3(0x00,0x00,0x21);/光标指针设置check_status();write_cmd3(0x00,0x00,0x42);/图形区首地址check_status();write_cmd3(16,0x00,0x43);/图形区宽度check_status();write_cmd1(0x80);/显示方式设置,正常显示check_status();/write_cmd1(0x94);/文本显示状态设置 1 0 1 0 N3 N2 N1 N0 文本显示,光标不显示,不闪烁/write_cmd1(0x98);/图形方式显示,不显示字母,只打点write_cmd1(0x9c); /文本图形check_status();write_cmd1(0xa1);/光标形状设置1 0 1 0 0 N2 N1 N0check_status(); void clear_screen()uint i;write_cmd3(0x00,0x00,0x24);/地址指针设置check_status();write_cmd1(0xb0);/数据自动写,每写一次,地址指针自动加一check_status();for(i=0;i8192;i+) / check_status(); write_data(0X00);check_status();write_cmd1(0xb2);/数据自动写结束void write_data(uchar dat)rd=1; /读数据置高电平cd=0; /P23为低电平ce=0; / P22为低电平wr=0; /写命令为低电平 P0=dat;/把读到的数据送到P0口delay(10); /延时10mswr=1; /写命令为高电平,开始工作ce=1; /接收数据cd=1; /接收数据void write_cmd1(uchar cmd)rd=1;cd=1;ce=0;wr=0;P0=cmd;delay(10);wr=1;ce=1;cd=0;/先送参数,再送指令void write_cmd2(uchar dat,uchar cmd)check_status();write_data(dat);check_status();write_cmd1(cmd);void write_cmd3(uchar data1,uchar data2,uchar cmd)check_status();write_data(data1);check_status();write_data(data2);check_status();write_cmd1(cmd);uchar read_status()uchar status;rd=0;wr=1;ce=0;cd=1;status=P1;return status;void check_status()uchar s;while(s&0x80)!=0x80) s=read_status();/等待位1,2置为。命令读写准备好。数据读写准备好void write_t(uchar add,uchar date)uchar temp,t;tce=0;tsclk=0;tce=1;temp=add;for(t=0;t1;temp=date; /把数据送给tempfor(t=8;t0;t-)if(temp&0x01)=1)tdio=1;elsetdio=0;tsclk=1;delay(1);tsclk=0;temp=temp1;tce=0;uchar read_t(uchar add)uchar temp,t;tce=0;tsclk=0;tce=1;temp=add;/把地址送给tempfor(t=0;t1;temp=0;for(t=0;t1;tce=0;return(temp);uchar adzh(uchar add) /检测温度传感器接收到的数据函数 uchar ad_dat; ad_st=1; delay(1); ad_st=0; while(!ad_eoc); ad_oe=1; delay(1); P1=0xff; ad_dat=P1; ad_oe=0; return(ad_dat);uchar read_key(void)/读键 uchar i,n,key1; ad_oe=0; key1=P1; n=0; for(i=0;i1;/键号右移一位n+;/每次循环n自动加1 ad_oe=1; return(n); void display_time(void)sec=read_t(0x81); /读秒命令min=read_t(0x83); /读分命令hour=read_t(0x85); /读小时命令day=read_t(0x87); /读天命令mon=read_t(0x89); /读月命令year=read_t(0x8d); /读年命令/显示年月日时分秒/display_dat(6,6,2);display_dat(6,7,0);display_dat(6,8,year/16);display_dat(6,9,year%16);display_char(6,10,-);display_dat(6,11,mon/16);display_dat(6,12,mon%16);display_char(6,13,-);display_dat(6,14,day/16);display_dat(6,15,day%16);display_dat(7,8,hour/16);display_dat(7,9,hour%16);display_char(7,10,:);display_dat(7,11,min/16);display_dat(7,12,min%16);display_char(7,13,:);display_dat(7,14,sec/16);display_dat(7,15,sec%16);/void display_mainbt(void) uchar ad_dat; float v; write_cmd1(0x9C); display_HZ(1,0,HZ05); display_HZ(1,1,HZ06); display_HZ(2,0,HZ07); display_HZ(2,1,HZ08); display_char(3,4,:); display_char(5,4,:);void display_maindat(void) /显示主函数数据 uchar ad_dat; uchar buf6; uchar i; float v; ad_dat=adzh(0); v=ad_dat; cl=(v/255)*5; display_float(3,5,cl,1); display_char(3,11,c); display_uint3(5,6,set); display_char(5,9,c); if(vset) LED=1;else LED=0; display_time(); buf0=cl/100+0x30;/ASSIC码转化为数字 i=cl/10; buf1=i%10+0x30; i=cl; buf2=i%10+0x30; buf3=.; i=cl*10; buf4=i%10+0x30; buf5= ; for(i=0;i0) gbn-; /如果光标位置大于0,则光标左移 break; case R: if(gbn2) gbn+; /如果光标位置小于2,则光标右移 break; case UP:break; case DOWN:break; case ADD: if(setbufgbn0) setbufgbn-; /如果此时光标位置的数据大于0,那么数据进行减操作break; default:break; if(escset=1) break; display_setdat(); if(key7) break; delay(1); void display_setbt1(void)/在第x行,第y列显示年月日时分秒的数据 write_cmd1(0x9f);display_dat(4,4,year/16);display_dat(4,5,year%16);display_char(4,6,-);display_dat(4,7,mon/16);display_dat(4,8,mon%16);display_char(4,9,-);display_dat(4,10,day/16);display_dat(4,11,day%16);display_dat(5,4,hour/16);display_dat(5,5,hour%16);display_char(5,6,:);display_dat(5,7,min/16);display_dat(5,8,min%16);display_char(5,9,:);display_dat(5,10,sec/16);display_dat(5,11,sec%16); sbuf0=year/16; /年的十位 sbuf1=year%16; /年的个位 sbuf2=-; sbuf3=mon/16;/月的十位 sbuf4=mon%16;/月的个位 sbuf5=-; sbuf6=day/16;/天的十位 sbuf7=day%16;/天的个位void display_setdat1(void) /显示数据设置及位置 display_dat(4,4,sbuf0); display_dat(4,5,sbuf1); display_dat(4,6,sbuf2); display_dat(4,7,sbuf3); display_dat(4,8,sbuf4); display_dat(4,9,sbuf5); display_dat(4,10,sbuf6); display_dat(4,11,sbuf7); write_cmd3(4+gbn,4,0x21);void setsj(void) uchar escset; escset=0; gbn=0; while(1) key=read_key(); /检测是否有键按下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公共卫生与预防医学能力测评试题及答案
- 2025年公共卫生突发事件管理考试题及答案
- 临床用血管理办法培训考试试卷与答案
- 2025年幼儿园书香寒假读书阅读活动方案(附书单)
- 2025年工艺用压缩机项目规划申请报告
- 枣庄市重点中学2026届高一化学第一学期期中综合测试模拟试题含解析
- 甘肃省武威市民勤一中2026届化学高二第一学期期末教学质量检测模拟试题含答案
- 2025年二手车市场备案登记委托书
- 2025年医疗质量安全事件(隐患)报告制度
- 2025年神经外科护理查房记录
- 2025年内河船员考试(主推进动力装置2103·一类三管轮)历年参考题库含答案详解(5套)
- 城市轨道交通工程监测技术
- 2025年海南省财金集团有限公司招聘笔试冲刺题(带答案解析)
- 2025年新七年级数学暑假衔接 (人教版)专题05 有理数的加法和减法 (3知识点+10大题型+思维导图+过关测) (学生版)
- 2025年综合基础知识题库(含答案)
- (正式版)HGT 6313-2024 化工园区智慧化评价导则
- 建设工地每日消杀记录表
- 硫酸氢钠(酸式硫酸钠)的理化性质及危险特性表
- 工程项目管理实施方案(5篇)
- 建筑施工应急处置明白卡
- 环境污染刑事案件司法解释学习课件
评论
0/150
提交评论