版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录1方案设计 1.1单片机电子时钟的背景 11.2电子时钟的意义 11.3电子时钟的工作原理及其具体实现 11.4设计任务 22电路方案设计 32.1模块一电路图 32.2模块二电路图 32.3模块三电路图 42.4总电路图 43程序设计 53.1主程序流程图 53.2模块一DS1302流程图 63.3模块二12864LCD流程图 83.4模块三DS18B20流程图 73.5源程序 74仿真与调试 7总结语 7参考文献 71方案设计1.1单片机电子时钟的背景随着电子技术和计算机技术的迅速发展,单片机已经在工业过程控制、智能仪表、计算机集成控制、人工智能、通信设备的智能化以及家电的智能化等方面得到广泛的应用。以单片机和微控制器为核心仍然是当今实现智能化技术的主流。随着单片机技术广泛地应用与人们生活的各个方面,一些人们经常使用的产品大多数是基于单片机研发的,如电子时钟。钟表从原来的沙漏计时和机械打点塔钟等演变到如今的电池驱动钟、交流钟、指针式石英电子钟表和数字式石英电子钟表,并且钟表的准确度越来越高了。随着人们的时间观念逐渐地增强,时钟在我们人类的世界里扮演着一个非常重要的角色,几乎出现在我们生活的各个角落里,并且人们几乎离不开它了。如今的时钟的功能更加全面,与机械时钟相比具有更高的正确性和直观性,且无机械装置,具有更长的寿命,因此广泛地应用于人类正常生活中,得到人们的关注和研发。1.2电子时钟的意义电子时钟采用数字电路实现对时、分、秒和数字显示的计时装置,广泛使用于个人家庭、车站、机场等公共场所,成为人们日常生活中不可缺少的必需品,给人们的生活、学习、工作、娱乐带来了极大的方便。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得电子时钟的精度、稳定性大幅度提高。现在的钟表的功能越来越强,具有定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动启闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,因此,研究数字时钟及其扩展,有着重大意义。1.3电子时钟的工作原理及其具体实现电子时钟的工作原理是采用单片机最小系统,用DS1302时钟芯片和12864LCD液晶显示屏芯片以及DS18B20温度传感器分别进行寄存相关信息、显示年月日时分秒和采取温度,用四个键分别实现选择调整对象为、增加调节对象的数值、减少调节对象的数值和调整确定,采用24小时制、定时器0中断和外部中断0,从而实现可调式中文电子日历、温度及整点报时功能。采用定时器0中断,定时50ms,其中断服务程序的功能是将时间和日期显示到LCD上。每1s时间,刷新液晶显示屏上的秒钟数值;每60s时间,刷新显示屏的分钟数值;每60min时间,刷新显示屏的小时数值;每24h时间,刷新显示屏的日期;星期是通过年月日进行调整;温度是通过温度传感器芯片DS18B20进行调整;时钟每次到整点时,通过蜂鸣器进行整点报时。采用外部中断0实现时钟的调整,将四个键通过“与门”连接单片机P3^2端口,从而通过键产生外部中断信号。当要调整日期时间的时候,首先要按K1键来选择调整对象,否则按其他键不会进行时间调整,然后可以按K2和K3键对日期时间进行加减调整,最后按K4键可以将改动的日期时间重新显示到LCD上。并且每次按下键后,都会通过蜂鸣器发出按键声音。1.4设计任务(1)可调式中文电子日历的硬件和软件设计;(2)画出程序流程图;(3)编写代码;(4)程序分析与调试;2电路方案设计2.1模块一电路图该模块主要通过DS1302时钟芯片实现计算秒、分、时、星期、日、月、年的信息,且具有闰年补偿的功能,其在proteus中的电路图如图2.1.1所示。图2.1.1记录年月日秒分时星期的电路图2.2模块二电路图该模块主要通过12864LCD实现中文电子日历功能,其在proteus中的电路图如图2.2.1所示图2.2.1显示时间电路图2.3模块三电路图该模块主要通过DS18B20温度传感芯片、四个键以及蜂鸣器实现温度采集,时间调节和闹钟等功能。图2.3.1时间调整电路图2.4总电路图如图2.4.1所示。图2.4.1总体硬件电路图3程序设计3.1主程序流程图图3.1.1主函数流程图3.2模块一DS1302流程图图3.2.1获取当前时间的流程图图3.2.2年月日时分秒++/--流程图
图3.2.3定时器0的中断服务程序图3.2.4外部中断0服务程序3.3模块二12864LCD流程图图3.3.1LCD初始化流程图图3.3.2通用显示函数流程图3.4模块三DS18B20流程图图3.41读取温度值3.5源程序#include<reg51.h>#include<intrins.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedintsbitSDA=P1^0;/*DS1302数据线*/sbitCLK=P1^1;/*DS1302时钟线*/sbitRST=P1^2;/*DS1302复位线*/sbitK1=P3^4;/*选择键*/sbitK2=P3^5;/*加键*/sbitK3=P3^6;/*减键*/sbitK4=P3^7;/*确定键*/sbitSPK=P2^6;/*************子函数定义***************//*************显示年函数***************/externvoidLCD_Initialize();/*液晶初始化函数*//*******读取温度值******/externvoidRead_Temperature();externvoidDisplay_Temperature();/*显示时间函数*/externvoidDisplay_A_Char_8X16(ucharP,ucharL,ucha*M)reentrant;/*显示年月日,星期,时分秒的固定汉字函数*/externvoidDisplay_A_WORD(ucharP,ucharL,uchar*M)reentrant;voidBeep();/*启动蜂鸣器函数*//*在调整日期时间时,用该位决定是否反白显示*/externbitReverse_Display;externucharDisplay_Digit[]={0,0,0,0};/*待显示的各温度数位*/externbitDS18B20_IS_OK=1;/*传感器正常标志*//*********全局变量和数组定义*********/uchartCount=0;/*一年中每个月的天数,2月的天数由年份决定*/ucharMonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};/*所读取的日期时间*/ucharDateTime[7];/*当前调整的时间对象:秒,分,时,日,月,星期,年(0,1,2,3,4,5,6)变量*//*其中星期由年月日调整自动完成*/charAdjust_Index=-1;ucharH_Offset=10,V_Page_Offset=0;/*水平与垂直偏移变量*//*年月日,星期,时分秒汉字点阵16乘16*/ucharcodeDATE_TIME_WORDS[]={0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*年*/0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,/*月*/0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,/*日*/0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,/*星*/0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,/*期*/0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,/*时*/0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,/*分*/0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00,/*秒*/0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,/*温*/0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,/*度*/};/*星期几的汉字点阵16乘16*/ucharcodeWEEKDAY_WORDS[]={0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,/*日*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*一*/0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,/*二*/0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,/*三*/0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,/*四*/0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,/*五*/0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,/*六*/};/*半角数字点阵8乘16*/ucharcodeDIGITS[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*0*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*1*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*2*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*3*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*4*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*5*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*6*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*8*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*9*/};/*生日快乐歌的音符频率表,不同的频率由不同的延时值来决定*/ucharcodeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};/*生日快乐歌节拍表,节拍表决定了每个音符的演奏长短*/ucharcodeSONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};voidDelayMS(uintx)/*调用延时子函数*/{uchari;while(x--)for(i=0;i<120;i++);}voidPlayMusic()/*音乐播放函数*/{uinti=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){/*播放各个音符,SONG_LONG为拍*/for(j=0;j<SONG_LONG[i]*20;j++){SPK=~SPK;/*SONG_TONE延时表决定了每个音符的频率*/for(k=0;k<SONG_TONE[i]/3;k++);}DelayMS(100);/*下一个音符的索引*/i++;}}voidAlarm(uchart)/*温度报警函数*/{uchari,j;for(i=0;i<200;i++){SPK=~SPK;/*由参数t形成不同的频率*/for(j=0;j<t;j++);}}/*向DS1302写入一字节*/voidWrite_A_Byte_TO_DS1302(ucharx){uchari;for(i=0;i<8;i++){SDA=x&1;CLK=1;CLK=0;x>>=1;}}/*从DS1302读取一字节*/ucharGet_A_Byte_FROM_DS1302(){uchari,b,t;for(i=0;i<8;i++){b>>=1;t=SDA;b|=t<<7;CLK=1;CLK=0;}/*BCD码转换*/return(b/16*10+b%16);}/*从DS1302指定位置读数据*/ucharRead_Data(ucharaddr)}uchardat;RST=0;CLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat=Get_A_Byte_FROM_DS1302();CLK=1;RST=0;returndat;}/*向DS1302某地址写入数据*/voidWrite_DS1302(ucharaddr,uchardat){CLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);Write_A_Byte_TO_DS1302(dat);CLK=1;RST=0;}/*设置时间*/voidSET_DS1302(){uchari;Write_DS1302(0x8E,0x00);/*秒分时日月年依次写入*/for(i=0;i<7;i++){/*秒,分,时,日,月,星期,年的起始地址分别为0x80,0x82,0x84,0x86,0x88,0x8A,0x8C*/Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));}Write_DS1302(0x8E,0x80);}/*读取当前时间*/voidGetTime(){uchari;for(i=0;i<7;i++){DateTime[i]=Read_Data(0x81+2*i);}}ucharisLeapYear(uinty)/*判断是否为闰年*/{return(y%4==0&&y%100!=0)||(y%400==0);}/*********刷新星期******/voidRefreshWeekDay(){uinti,d,w=5;/*已知1999.12.31是周五*/for(i=2000;i<2000+DateTime[6];i++){d=isLeapYear(i)?366:365;w=(w+d)%7;}d=0;for(i=1;i<DateTime[4];i++)d+=MonthsDays[i];d+=DateTime[3];/*保存星期,0~6表示星期日,星期一,二,三,四,五,六,为了与DS1302的星期格式匹配,返回值需要加1*/DateTime[5]=(w+d)%7+1;}/*蜂鸣器函数*/voidBeep(uchart){uchari;for(i=0;i<100;i++){SPK=~SPK;DelayMS(t);}SPK=0;}voidDateTime_Adjust(charx)/*年月日时分++或--*/{switch(Adjust_Index){case6:/*年00-99*/if(x==1&&DateTime[6]<99)DateTime[6]++;if(x==-1&&DateTime[6]>0)DateTime[6]--;/*获取2月天数*/MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;/*如果年份变化后当前月份的天数大于上限则设为上限*/if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays[DateTime[4]];RefreshWeekDay();/*刷新星期*/break;case4:/*月01至12*/if(x==1&&DateTime[4]<12)DateTime[4]++;if(x==-1&&DateTime[4]>1)DateTime[4]--;/*获取2月天数*/MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;/*如果年份变化后当前月份的天数大于上限则设为上限*/if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays[DateTime[4]];RefreshWeekDay();/*刷新星期*/break;case3:/*日00至28/29/30/31;调节之前首先根据年份得出该年中2月的天数*/MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;/*再根据当前月份决定调节日期的上限*/if(x==1&&DateTime[3]<MonthsDays[DateTime[4]])DateTime[3]++;if(x==-1&&DateTime[3]>0)DateTime[3]--;RefreshWeekDay();/*刷新星期*/break;case2:/*小时*/if(x==1&&DateTime[2]<23)DateTime[2]++;DateTime[2]--;break;case1:/*分钟*/if(x==1&&DateTime[1]<59)DateTime[1]++;if(x==-1&&DateTime[1]>0)DateTime[1]--;break;case0:/*秒*/if(x==1&&DateTime[0]<59)DateTime[0]++;break;}}/*定时器0每秒刷新LCD显示*/voidT0_INT()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(++tCount!=2)return;tCount=0;/*年(后两位)*/Reverse_Display=Adjust_Index==6;Display_A_Char_8X16(V_Page_Offset,70+H_Offset,DIGITS+DateTime[6]/10*16);Display_A_Char_8X16(V_Page_Offset,78+H_Offset,DIGITS+DateTime[6]%10*16);/*星期*/Reverse_Display=Adjust_Index==5;Display_A_WORD(V_Page_Offset+3,32+H_Offset,WEEKDAY_WORDS+(DateTime[5]%10-1)*32);/*月*/Reverse_Display=Adjust_Index==4;Display_A_Char_8X16(V_Page_Offset,102+H_Offset,DIGITS+DateTime[4]/10*16);Display_A_Char_8X16(V_Page_Offset,110+H_Offset,DIGITS+DateTime[4]%10*16);/*日*/Reverse_Display=Adjust_Index==3;Display_A_Char_8X16(V_Page_Offset,5+H_Offset,DIGITS+DateTime[3]/10*16);Display_A_Char_8X16(V_Page_Offset,13+H_Offset,DIGITS+DateTime[3]%10*16);/*时*/Reverse_Display=Adjust_Index==2;Display_A_Char_8X16(V_Page_Offset+6,56+H_Offset,DIGITS+DateTime[2]/10*16);Display_A_Char_8X16(V_Page_Offset+6,64+H_Offset,DIGITS+DateTime[2]%10*16);/*分钟*/Reverse_Display=Adjust_Index==1;Display_A_Char_8X16(V_Page_Offset+6,88+H_Offset,DIGITS+DateTime[1]/10*16);Display_A_Char_8X16(V_Page_Offset+6,96+H_Offset,DIGITS+DateTime[1]%10*16);/*秒*/Reverse_Display=Adjust_Index==0;Display_A_Char_8X16(V_Page_Offset+6,-10+H_Offset,DIGITS+DateTime[0]/10*16);Display_A_Char_8X16(V_Page_Offset+6,-2+H_Offset,DIGITS+DateTime[0]%10*16);}/*键盘中断(INT0)*/voidEX_INT0()interrupt0{if(K1==0)/*选择调整对象*/{Beep(1);if(Adjust_Index==-1||Adjust_Index==0)Adjust_Index=7;Adjust_Index--;if(Adjust_Index==5)Adjust_Index=4;/*跳过对星期的调整*/}elseif(K2==0)/*加*/{Beep(1);DateTime_Adjust(1);}elseif(K3==0)/*减*/{Beep(1);DateTime_Adjust(-1);}elseif(K4==0)/*确定*/{Beep(1);SET_DS1302();/*将调整后的时间写入DS1302*/Adjust_Index=-1;/*操作索引重设为-1,时间继续正常显示*/}}/***************主函数**********************/voidmain(){LCD_Initialize();/*液晶初始化*/Read_Temperature();DelayMS(50);DelayMS(50);/****显示年的固定前两位****/Display_A_Char_8X16(V_Page_Offset,55+H_Offset,DIGITS+2*16);Display_A_Char_8X16(V_Page_Offset,62+H_Offset,DIGITS);/*******显示固定汉字:年月日,星期,时分秒,温度:********/Display_A_WORD(V_Page_Offset,86+H_Offset,DATE_TIME_WORDS+0*32);Display_A_WORD(V_Page_Offset,-10+H_Offset,DATE_TIME_WORDS+1*32);Display_A_WORD(V_Page_Offset,21+H_Offset,DATE_TIME_WORDS+2*32);Display_A_WORD(V_Page_Offset+3,0+H_Offset,DATE_TIME_WORDS+3*32);Display_A_WORD(V_Page_Offset+3,16+H_Offset,DATE_TIME_WORDS+4*32);Display_A_WORD(V_Page_Offset+3,56+H_Offset,DATE_TIME_WORDS+8*32);Display_A_WORD(V_Page_Offset+3,72+H_Offset,DATE_TIME_WORDS+9*32);Display_A_WORD(V_Page_Offset+6,72+H_Offset,DATE_TIME_WORDS+5*32);Display_A_WORD(V_Page_Offset+6,104+H_Offset,DATE_TIME_WORDS+6*32);Display_A_WORD(V_Page_Offset+6,6+H_Offset,DATE_TIME_WORDS+7*32);/****************允许外部中断,定时器0中断*******************/IE=0x83;IP=0x01;IT0=0x01;TMOD=0x01;TH0=0x3C;TL0=0xB0;TR0=1;while(1){/******如果未执行调整时间操作,则就继续显示当前时间*******/if(Adjust_Index==-1)GetTime();Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayMS(100);/*温度*/if(Display_Digit[3]!=0)Display_A_Char_8X16(V_Page_Offset+3,80+H_Offset,DIGITS+Display_Digit[3]*16);if(Display_Digit[3]==0&&Display_Digit[2]!=0)Display_A_Char_8X16(V_Page_Offset+3,88+H_Offset,DIGITS+Display_Digit[2]*16);Display_A_Char_8X16(V_Page_Offset+3,96+H_Offset,DIGITS+Display_Digit[1]*16);if((Display_Digit[3]!=0)||((Display_Digit[2]==6)&&(Display_Digit[1]==5))){Alarm(90);Alarm(120);}if(DateTime[0]==0&&DateTime[1]==0){Playmusic();DelayMS(5001);}}}/*LCD_12864.c*//*名称:12864LCD显示驱动程序(不带字库)*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineLCD_DB_PORTP0/*液晶DB0~DB7*/#defineLCD_START_ROW0xC0/*起始行*/#defineLCD_PAGE0xB8/*页指令*/#defineLCD_COL0x40/*列指令*//*****液晶引脚定义******/sbitDI=P2^0;sbitRW=P2^1;sbitE=P2^2;sbitCS1=P2^3;sbitCS2=P2^4;sbitRS=P2^5;/*是否反相显示(白底黑字/黑底白字)*/bitReverse_Display=0;/*检查LCD是否忙*/bitLCD_Check_Busy(){RW=1;_nop_();DI=0;E=1;_nop_();E=0;return(bit)(P0&0x80);}/*向LCD发送命令*/voidLCD_Write_Command(ucharc){while(LCD_Check_Busy());LCD_DB_PORT=0x00;RW=0;_nop_();DI=0;LCD_DB_PORT=c;E=1;_nop_();E=0;}/*向LCD发送数据*/voidLCD_Write_Data(uchard){while(LCD_Check_Busy());LCD_DB_PORT=0x00;RW=0;_nop_();DI=1;/*根据Reverse_Display决定是否反相显示*/if(!Reverse_Display)LCD_DB_PORT=d;elseLCD_DB_PORT=~d;E=1;_nop_();E=0;}/*初始化LCD*/voidLCD_Initialize(){CS1=1;CS2=1;LCD_Write_Command(0x38);/*8位形式,2行字符*/LCD_Write_Command(0x0F);/*开显示*/LCD_Write_Command(0x01);/*清屏*/LCD_Write_Command(0x06);/*画面不动光标右移*/LCD_Write_Command(LCD_START_ROW);/*设置起始行*/}/*********通用显示函数*********//*从第p页第L列开始显示W字节,数据在r所指向的缓冲*//*每字节8位是垂直显示的,高位在下,低位在上*//*每个8*128的矩形区域为一页(每页分左半页与右半页)*//*整个LCD又由64*64的左半屏和64*64的右半屏构成*/voidCommon_Show(ucharP,ucharL,ucharW,uchar*r)reentrant{uchari;if(L<64)/*显示在左半屏或右半屏*/{CS1=1;CS2=0;LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL+L);if(L+W<64)/*全部显示在左半屏*/{for(i=0;i<W;i++)LCD_Write_Data(r[i]);}else/*如果越界则跨越左右半屏显示*/{for(i=0;i<64-L;i++)LCD_Write_Data(r[i]);/*左半屏显示*/CS1=0;CS2=1;/*右半屏显示*/LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL);for(i=64-L;i<W;i++)LCD_Write_Data(r[i]);}}else/*全部显示在左右半屏*/{CS1=0;CS2=1;LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL+L-64);for(i=0;i<W;i++)LCD_Write_Data(r[i]);}}/*显示一个8*16点阵字符*/voidDisplay_A_Char_8X16(ucharP,ucharL,uchar*M)reentrant{Common_Show(P,L,8,M);/*显示汉字上半部分*/Common_Show(P+1,L,8,M+8);}/*显示一个16*16点阵汉字*/voidDisplay_A_WORD(ucharP,ucharL,uchar*M)reentrant{Common_Show(P,L,16,M);/*显示汉字上部分*/Common_Show(P+1,L,16,M+16);/*显示汉字下部分*/}/*名称:DS18B20温度传感器*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}sbitDQ=P3^3;ucharCurrentT=0;/*当前温度整数部分*/ucharTemp_Value[]={0x00,0x00};/*从DS18B20读取的温度值*//************延时2************/voidDelay(uintx){while(--x);}/*************初始化DS18B20**************/ucharInit_DS18B20(){ucharstatus;DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);status=DQ;Delay(100);DQ=1;returnstatus;}/*************读一字节*************/ucharReadOneByte(){uchari,dat=0;DQ=1;_nop_();for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;_nop_();_nop_();if(DQ)dat|=0x80;Delay(30);DQ=1;}returndat;/*************写一字节**********/voidWriteOneByte(uchardat){uchari;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;}}/*******读取温度值******/voidRead_Temperature(){if(Init_DS18B20()==1)/*判断DS18B20故障*/DS18B20_IS_OK=0;else{WriteOneByte(0xCC);/*跳过序列号*/WriteOneByte(0x44);/*启动温度寄存器*/Init_DS18B20();WriteOneByte(0xCC);/*跳过序列号*/WriteOneByte(0xBE);/*读取温度寄存器*/Temp_Value[0]=ReadOneByte();/*温度低8位*/Temp_Value[1]=ReadOneByte();/*温度高8位*/DS18B20_IS_OK=1;}}/*在12864LCD上显示当前温度*/voidDisplay_Temperature(){uchari;/*延时值与负数标识*/uchart=150,ng=0;/*高五位全为1(0xF8)则为负数,为负数时取反加1,并设置负数标识*/if((Temp_Value[1]&0xF8)==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;/*负数标识置1*/ng=1;}/*获取温度整数部分(高字节中的低3位与低字节中的高4位,无符号)*/CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);/*将整数部分分解为3位待显示数字*/Display_Digit[3]=CurrentT/100;Display_Digit[2]=CurrentT%100/10;Display_Digit[1]=CurrentT%10;}4仿真与调试其调试结果如图4.1所示。图4.1调试结果图4.2按K1键之后的结果图图4.3按K2键之后的结果图图4.4按K3键之后的结果图图4.5按K4键之后的结果图总结通过短暂的两周时间的课程设计,我对单片机的基本原理以及单片机的C语言编程有了一定的了解,同时我不仅对proteus仿真技能也有了进一步地了解,也扩展了自己对一些重要芯片工作原理的了解,提高了我的实践能力和理论水平。模块化设计让思路变得明了,冗长的程序也变得条理清晰。本次课程设计让我了解到单片机在生活应用中的重要性,了解了它的广阔的应用前景。学好单片机对我今后找工作有很大的帮助,不仅可以充实自己的精神风貌和掌握各种操作技巧具有重大意义,而且还可以研发出一些对人们有意义的产品,促进社会的发展。在当今科学发达的社会中,各行各业对这种人才非常急需,因此,这次课程设计对我们今后的学习有很大的帮助,我们应该多参加一些对学好单片机有帮助的活动。总之,本次设计锻炼了我们的动手能力,激发了我们的创新思维,培养了我们勇于面对困难、克服困难的坚强意志和不懈的精神,最后,我要感谢在本次设计中帮助过的同学,要不是有他们的帮助,时间对于我来说不足够的,同时,我也再次体会到团队精神的力量和合作的重要性;更重要的是使我体会到理论与实际结合的重要性和知识的海洋是无穷无尽的,这将激励我们对新知识的追求。参考文献[1].郭天祥编著,51单片机C语言教程,电子工业出版社。[2].彭伟编著,单片机C语言程序设计实训100例,电子工业出版社。[3].周润景等编著,基于proteus的电路及单片机设计与仿真,北京航空航天大学出版社。[4].江世明编著,单片机原理及应用,中国铁道出版社。 基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究HYPERLINK"/detail.htm?3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024中外合资企业教育培训与经营合同书
- 2024广州市房地产中介服务合同(卖方出租方使用)
- 2024个人民间借款合同范例
- 2024年信息安全保密协议
- 2024年合伙人分伙协议书
- 2024果树苗木定购合同范本
- 跨境电商商品销售合同
- 承包商土地使用权赠与合同模板
- 精装修室内工程合同
- 2024英文合同范本
- 艾滋病反歧视培训
- 民政局离婚协议书范文模板标准版
- 2024年代工生产机密保护协议
- 2023-2024学年湖北省武汉市洪山区九年级(上)期末物理试卷(含答案)
- 2024年新人教版五年级数学下册《第4单元第7课时 最大公因数(1)》教学课件
- 小学生感恩节国旗下讲话稿(35篇)
- 一年级新生家长会课件(共25张课件)
- 品牌经理招聘面试题与参考回答(某大型集团公司)2024年
- 五年级上册道德与法治说课稿-3 主动拒绝烟酒与毒品 部编版
- 术后谵妄的预防及护理
- 二次函数专题知识点-常考(典型)题型-重难点题型(含详细答案)
评论
0/150
提交评论