天津职业技术师范大学电子工程学院电子信息工程课程设计报告课程设计题目:基于单片机的电子万年历设计同组学生姓名(学号):王珂0990*******、王飞龙0990*******班级:电信12技术1班任务分工:王珂:编写程序、软件调试、整理报告王飞龙:查找资料、硬件连接、整理报告设计时间: 2013年1月7 日—— 2013 年 1月18日指导教师:姜德宁、王天慧目录题目:基于单片机的电子万年历设计目录 (1)一、课程设计的目的与要求(含设计指标) (1)二、方案论证及选择 (1)1. 单片机芯片的选择方案和论证 (1)2. 显示模块选择方案和论证 (1)3. 时钟芯片的选择方案和论证 (1)4. 电路设计最终方案决定 (2)三、原理设计(或基本原理) (2)1. 基本原理: (2)2. 总体框图 (2)3. 单元电路设计 (2)4. 元件列表 (4)四、方案实现与测试(或调试) (5)五、总结 (6)六、个人总结 (6)七、参考书目: (6)附录:C程序一、课程设计的目的与要求(含设计指标)1.要有完整的设计过程及设计图2.最终的设计结果。
3.个人总结不少于1000字。
二、方案论证及选择1.单片机芯片的选择方案和论证方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,所以选择采用AT89S52作为主控制系统。
2.显示模块选择方案和论证方案一:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。
方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。
方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,并且我做的最小系统上带一个TS1620-1,和A T89S52已经接好,省了很多麻烦,所以在此设计中采用LCD液晶显示屏。
3.时钟芯片的选择方案和论证方案一:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA。
方案二:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本。
虽然实现的时间误差较大,但是,考虑到需要采购芯片,综合考虑,对于课程设计来说能用较省事的方法达到目的最好。
4. 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统; 直接采用单片机定时计数器提供秒信号;LCD 液晶显示屏作为显示。
三、 原理设计(或基本原理)1. 基本原理:本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V 超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD 液晶显示屏显示。
同时还添加了提醒功能,通过蜂鸣器实现。
2. 总体框图图13. 单元电路设计◆ 单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O 口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O 口(P0、P1、P2、P3),每一条I/O 线都能独立地作输出或输入。
单片机的最小系统如下图2所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。
◆ 显示模块的设计如图3为LCD 显示模块: 此模块需要注意上拉电阻。
图2图3温度模块考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。
另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。
DS18B20性能●独特的单线接口仅需一个端口引脚进行通信●简单的多点分布应用●无需外部器件●可通过数据线供电●零待机功耗●测温范围-55~+125℃,以0.5℃递增●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃●温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字●应用包括温度控制、工业系统、消费品、温度计和任何热感测系统●负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作●GND:地●DQ:单线运用的数据输入/输出引脚●VD:可选的电源引脚4.元件列表四、方案实现与测试(或调试)此方案由于只用到51单片机芯片,因此各个功能都是由编程来实现。
大体程序流程框图如下在本成电子万年历的设计调试中遇到了很多的问题。
回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:1)烧入程序后,LCD液晶显示屏显示亮度不好。
解决:一边旋转KT1滑动变阻器,一边观看LCD显示屏,知道看到合适的亮度为止。
2)蜂鸣器声音过小或没声。
解决:在相应管脚接上拉电阻。
3)液晶屏显示乱码,显示字符错行。
解决:程序在合并时起冲突,调试程序,重新定义变量等;仔细检查程序错误。
五、总结经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。
同时在软件的编程方面得到更多的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。
六、个人总结另附七、参考书目:[1]柴诚敬,刘国维,李阿娜,《化工原理课程设计》,天津,天津科学技术出版社,1994年[2]网络参考文献资料附录:程序源代码:#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DS18B20#ifdef DS18B20#define READROM (0x33)#define MATCHROM (0x55)#define SKIPROM (0xCC)#define SEARCHROM (0xF0)#define ALARMSEARCH (0xEC)#define WIRTESCRATCHPAD (0x4E)#define READSCRATCHPAD (0xBE)#define COPYSCRATCHPAD (0x48)#define CONVETT (0x44)#define RECALLE2 (0xB8)#define READPOWERSUPPLY (0xB4)sbit DS18B20_Port = P2^6;unsigned char T;unsigned char flag_t = 0;unsigned char Buffer_DS18B20[9];unsigned long Temperature_DS18B20_LONG;unsigned char Temperature_DS18B20_STRING[9] = {0x00};unsigned char flag_temp = 0;unsigned char Board_InputOutput_DS18B20(unsigned char _mode);//模式选择:Read_Temp(读取温度),Updata_Info(更新所有信息)#endifsbit rs=P2^2;sbit rw=P2^1;sbit lcden=P2^0;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;uchar count,s1num;char nian_1,nian_0,yue,ri,week,miao,shi,fen,b,a,c;uchar code table[]=" - - week ";uchar code table1[]=" : : ";void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){uchar num;lcden=0;rw=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<16;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void write_sfm(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_sfm1(uchar add,uchar date) {write_com(0x80+add);write_date(0x30+date);}void write_sfm2(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void keyscan(){if(s1==0){delay(5);if(s1==0){ s1num++;while(!s1);if(s1num==1){a=0;TR1=0;TR0=0;write_com(0x80);write_com(0x0f);}}if(s1num==2){write_com(0x80+2);}if(s1num==3){write_com(0x80+5);}if(s1num==4){write_com(0x80+8);}if(s1num==5){write_com(0x80+15);}if(s1num==6){write_com(0x80+0x40+0);}if(s1num==7){write_com(0x80+0x40+3);}if(s1num==8){write_com(0x80+0x40+6);}if(s1num==9){s1num=0;write_com(0x0c);TR0=1;TR1=1;a=1;}}if(s1num!=0){if(s2==0){delay(5);if(s2==0){while(!s2);if(s1num==1){nian_1++;while(nian_1==99)nian_1=0;write_sfm2(0,nian_1);write_com(0x80+0);}if(s1num==2){nian_0++;while(nian_0==100)nian_0=0;write_sfm2(2,nian_0);write_com(0x80+2);}if(s1num==3){yue++;if(yue==13)yue=1;write_sfm2(5,yue);write_com(0x80+5);}if(s1num==4){ri++;if(ri==32)ri=1;write_sfm2(8,ri);write_com(0x80+8);}if(s1num==5){week++;if(week==8)week=1;write_sfm1(15,week);write_com(0x80+15);}if(s1num==6){shi++;if(shi==24)shi=0;write_sfm(0,shi);write_com(0x80+0x40+0);}if(s1num==7){fen++;if(fen==60)fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);}if(s1num==8){miao++;if(miao==60)miao=0;write_sfm(6,miao);write_com(0x80+0x40+6);}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){nian_1--;if(nian_0==-1)nian_0=99;write_sfm2(0,nian_1);write_com(0x80+0);}if(s1num==2){nian_0--;if(nian_0==-1)nian_0=99;write_sfm2(2,nian_0);write_com(0x80+2);}if(s1num==3){yue--;if(yue==0)yue=12;write_sfm2(5,yue);write_com(0x80+5);}if(s1num==4){ri--;if(ri==0)ri=31;write_sfm2(8,ri);write_com(0x80+8);}if(s1num==5){week--;if(week==0)week=7;write_sfm1(15,week);write_com(0x80+15);}if(s1num==6){shi--;if(shi==-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40+0);}if(s1num==7){fen--;if(fen==-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+3);}if(s1num==8){miao--;if(miao==-1)miao=59;write_sfm(6,miao);write_com(0x80+0x40+6);}}}}}void main(){init();nian_1=20;nian_0=14;yue=12;ri=30;week=2;shi=23;fen=59;miao=55;write_sfm2(0,nian_1);write_sfm2(2,nian_0);write_sfm2(5,yue);write_sfm2(8,ri);write_sfm1(15,week);write_sfm(0,shi);write_sfm(3,fen);write_sfm(6,miao);a=1;while(1){if(a==1){#ifdef DS18B20flag_t = 1;while(flag_t){EA = 0;TR1 = 0;write_com(0x80+0x40+9);Board_InputOutput_DS18B20(0x01);write_date(Temperature_DS18B20_STRING[1]);write_date(Temperature_DS18B20_STRING[2]);write_date(Temperature_DS18B20_STRING[3]);write_date(Temperature_DS18B20_STRING[4]);write_date(Temperature_DS18B20_STRING[5]);write_date(Temperature_DS18B20_STRING[6]);write_date(Temperature_DS18B20_STRING[7]);T = (Temperature_DS18B20_STRING[1]-0x30)*10 + (Temperature_DS18B20_STRING[2]-0x30);if(T>=26||T<19)////////////////////////{flag_t = 1;SPK = 1;}else{flag_t = 0;SPK = 0;}}EA = 1;TR1 = 1;#endif}keyscan();if(b==0){bee();b++;}if(c==0){bee1();c++;}}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==15){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;week++;if(week==8){week=1;}write_sfm1(15,week);ri++;if(ri>28){if(nian_0%4==0){switch(yue){ case 1: if(ri==32){ri=1;yue++;}break;case 2: if(ri==30){ri=1;yue++;}break;case 3: if(ri==32){ri=1;yue++;}break;case 4: if(ri==31){ri=1;yue++;}break;case 5: if(ri==32){ri=1;yue++;}break;case 6: if(ri==31){ri=1;yue++;}break;case 7: if(ri==32){ri=1;yue++;}break;case 8: if(ri==32){ri=1;yue++;}break;case 9: if(ri==31){ri=1;yue++;}break;case 10: if(ri==32){ri=1;yue++;}break;case 11: if(ri==31){ri=1;yue++;}break;case 12: if(ri==32){ri=1;yue++;}break;} }else{switch(yue){case 1: if(ri==32){ri=1;yue++;}break;case 2: if(ri==29){ri=1;yue++;}break;case 3: if(ri==32){ri=1;yue++;}break;case 4: if(ri==31){ri=1;yue++;}break;case 5: if(ri==32){ri=1;yue++;}break;case 6: if(ri==31){ri=1;yue++;}break;case 7: if(ri==32){ri=1;yue++;}break;case 8: if(ri==32){ri=1;yue++;}break;case 9: if(ri==31){ri=1;yue++;}break;case 10: if(ri==32){ri=1;yue++;}break;case 11: if(ri==31){ri=1;yue++;}break;case 12: if(ri==32){ri=1;yue++;}break;}}if(yue==13){yue=1;nian_0++;if(nian_0==100){nian_0=0;nian_1++;if(nian_1==99){nian_1=0;}}}write_sfm2(0,nian_1);write_sfm2(2,nian_0);write_sfm2(5,yue);}write_sfm2(8,ri);}write_sfm(0,shi);}write_sfm(3,fen);}write_sfm(6,miao);}}#ifdef DS18B20void Delay_DS18B20_us(unsigned char _t){while(--_t);}void Delay_DS18B20_ms(unsigned char _t){while(_t--){Delay_DS18B20_us(245);Delay_DS18B20_us(245);}}void DS18B20_WriteByte(unsigned char _byte){unsigned char i = 0;for(i = 0; i < 8; i++){DS18B20_Port = 0;DS18B20_Port = _byte & 0x01;Delay_DS18B20_us(25);DS18B20_Port = 1;_byte >>= 1;}Delay_DS18B20_us(25);}unsigned char DS18B20_ReadByte(void){unsigned char dat;unsigned char i = 0;for(i = 0; i < 8; i++){DS18B20_Port = 0;dat >>= 1;DS18B20_Port = 1;_nop_();_nop_();_nop_();_nop_();_nop_();if(DS18B20_Port){dat |= 0x80;}Delay_DS18B20_us(25);}return dat;}unsigned char DS18B20_Initialization(void){unsigned char flag = 0;DS18B20_Port = 1;Delay_DS18B20_us(5);DS18B20_Port = 0;Delay_DS18B20_us(200);Delay_DS18B20_us(200);DS18B20_Port = 1;Delay_DS18B20_us(50);flag = DS18B20_Port;Delay_DS18B20_us(25);return flag;}void DS18B20_Updata_Info(void){unsigned char i = 0;DS18B20_Initialization();DS18B20_WriteByte(SKIPROM);DS18B20_WriteByte(CONVETT);Delay_DS18B20_ms(10);DS18B20_Initialization();DS18B20_WriteByte(SKIPROM);DS18B20_WriteByte(READSCRATCHPAD);for(i=0; i<9; i++){Buffer_DS18B20[i] = DS18B20_ReadByte();}}void DS18B20_Read_Temp(void){unsigned int temperature_ds18b20 = 0;DS18B20_Updata_Info();temperature_ds18b20 = (unsigned int)Buffer_DS18B20[1] * 0x0100 + (unsigned int)Buffer_DS18B20[0];Temperature_DS18B20_LONG = (unsigned long)temperature_ds18b20 * 625 ;Temperature_DS18B20_STRING[8] = '\0';Temperature_DS18B20_STRING[7] = 0x30+(Temperature_DS18B20_LONG%10) /1;Temperature_DS18B20_STRING[6] = 0x30+(Temperature_DS18B20_LONG%100) /10;Temperature_DS18B20_STRING[5] = 0x30+(Temperature_DS18B20_LONG%1000) /100;Temperature_DS18B20_STRING[4] = 0x30+(Temperature_DS18B20_LONG%10000) /1000;Temperature_DS18B20_STRING[3] = '.';Temperature_DS18B20_STRING[2] = 0x30+(Temperature_DS18B20_LONG%100000)/10000;Temperature_DS18B20_STRING[1] = 0x30+(Temperature_DS18B20_LONG%1000000)/100000;Temperature_DS18B20_STRING[0] =0x30+(Temperature_DS18B20_LONG%10000000)/1000000;}unsigned char Board_InputOutput_DS18B20(unsigned char _mode){switch(_mode){case 0x01:DS18B20_Read_Temp(); break;case 0x02:DS18B20_Updata_Info(); break;default :return 1; break;}return 0;}#endif第19 页。