




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 单片机电子时钟设计报告1、 设计任务 本次课程设计的电子时钟电路,是基于单片机stc89c52、时钟芯片和液晶显示,运用c语言编程实现。电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。2、 系统硬件设备及芯片简介 数字电子钟系统设计已经成熟,但是目前系统设计时基本 都是采用 led 作为显示电路,造成硬件电路复杂、功耗高、产 品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、 体积小、显示内容丰富、价格低、接口控制方便等优点,因此 在各类电子产品中被极广泛地推广和应用。字符型液晶显示模 块是一类专门用于显示字母、数字、符号等点阵式液晶显示模 块。本系统设计采用字符型液品
2、显示模块 lcd1602 作为显示器 件,这样不仅简化了系统的硬件设计,而且极大地提高了系统 的可靠性。1lcd1602 简介字符型液晶显示模块 lcd1602 已经是单片机应用设计中 最常用的信息显示器件。lcd1602 可以显示两行,每行 16 个 字符,采用5v 电源供电,外围电路配置简单,价格便宜,具 有很高的性价比。2lcd1602 功能介绍2.1 引脚功能lcd1602 采用标准 14 脚(无背光)或 16 脚(带背光)接口,各引脚功能见表 1。表 1 引脚功能编号符号引脚说明编号符号引脚说明1vss电源地9d2data i/o2vdd电源正极10d3data i/o3vl液晶显示
3、偏压信号11d4data i/o4rs数据/命令选择端12d5data i/o5r/w读/写选择端13d6data i/o6e使能信号14d7data i/o7d0data i/o15bla背光源正极8d1data i/o16blk背光源负极2.2 lcd1602 读写指令lcd1602 读写指令较多且较复杂,具体使用可以查相关资料,下面仅列出最常用的的一些命令:写指令 38h:显示模式设置;写指令 08h:显示关闭;写指令 01h:显示清屏;写指令 06h:显示光标移动设置;写指令 0ch:显示开及光标设置。2.3 lcd1602 读写操作时序lcd1602 读写操作时序总体上来说是比较简单
4、的,掌握其有两种方法:一种是只看时序图,另外一种方法是直接记忆和总结读写时电平高低和变化。很显然第二种更简单和直接,下面就列出典型读写的时序要求,以方便编写程序。(1) 读状态:输入:rsl,rwh,eh。 输出:d0d7状态字。(2) 写指令:输入:rsl,rwl,d0d7指令码,e上升沿。输出:无。(3)读数据:输入:rsh,rwh,eh。输出:d0d7数据。(4)写 数 据:输入:rsh,rwl,d0d7数据,e上升沿。输出:无。2.4 lcd1602 显示方法液晶显示模块是慢速显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平(即不忙),否则该指令失效。显示字符时,要先输入
5、显示字符地址,即告诉模块在哪里显示字符。因为写入显示地址时要求最高位 d7 恒定为高电平,所以实际写入的数据应该是要显示地址值加上 80h,即将最高位 d7 置为 1。在使用此显示模块时一般要对其进行初始化,设置所需要的显示参数。液晶模块在显示字符时光标是自动右移的,无需人工干预。每次输入指令前,都要判断液晶模块是否处于忙状态。3数字电子钟硬件电路设计硬件电路系统设计主要由单片机最小系统、输入电路、输 出电路等组成。单片机最小系统同所有单片机系统,在此不作 讨论。输入电路主要时间调节电路,为简化系统我们使两个外 部中断来调节“时”和“分”数值,即将 int0、int1 分别接 两个按钮。lcd
6、 显示器和单片机接口电路可以采用总线方式或 者是模拟口线方式,本设计采用第二种方式,即以单片机 i/o 模拟控制信号。具体电路见图 1,p0 口作为数据,并接上拉电 阻提升电压,p2.0 接 lcd 的 rs 端、p2.1 接 lcd 的 r/w 端、 p2.2 接 lcd 的 e 端,“分”调节按钮接 int0,“时”调节按钮 接 int1,图 1 省略了电源和单片机最小系统电路。图 1 数字电子钟硬件电路 3、 设计电路图及程序1. 电路图如下原理图如下:2. 程序共有四段程序,用keil仿真是程序列表如图regx52.h程序为:#ifndef _at89x52_h_#define _at
7、89x52_h_sfr p0 = 0x80;sfr sp = 0x81;sfr dpl = 0x82;sfr dph = 0x83;sfr pcon = 0x87;sfr tcon = 0x88;sfr tmod = 0x89;sfr tl0 = 0x8a;sfr tl1 = 0x8b;sfr th0 = 0x8c;sfr th1 = 0x8d;sfr p1 = 0x90;sfr scon = 0x98;sfr sbuf = 0x99;sfr p2 = 0xa0;sfr ie = 0xa8;sfr p3 = 0xb0;sfr ip = 0xb8;sfr t2con = 0xc8;sfr t2m
8、od = 0xc9;sfr rcap2l = 0xca;sfr rcap2h = 0xcb;sfr tl2 = 0xcc;sfr th2 = 0xcd;sfr psw = 0xd0;sfr acc = 0xe0;sfr b = 0xf0;/*-p0 bit registers-*/sbit p0_0 = 0x80;sbit p0_1 = 0x81;sbit p0_2 = 0x82;sbit p0_3 = 0x83;sbit p0_4 = 0x84;sbit p0_5 = 0x85;sbit p0_6 = 0x86;sbit p0_7 = 0x87;/*-pcon bit values-*/#d
9、efine idl_ 0x01#define stop_ 0x02#define pd_ 0x02 /* alternate definition */#define gf0_ 0x04#define gf1_ 0x08#define smod_ 0x80/*-tcon bit registers-*/sbit it0 = 0x88;sbit ie0 = 0x89;sbit it1 = 0x8a;sbit ie1 = 0x8b;sbit tr0 = 0x8c;sbit tf0 = 0x8d;sbit tr1 = 0x8e;sbit tf1 = 0x8f;/*-tmod bit values-*
10、/#define t0_m0_ 0x01#define t0_m1_ 0x02#define t0_ct_ 0x04#define t0_gate_ 0x08#define t1_m0_ 0x10#define t1_m1_ 0x20#define t1_ct_ 0x40#define t1_gate_ 0x80#define t1_mask_ 0xf0#define t0_mask_ 0x0f/*-p1 bit registers-*/sbit p1_0 = 0x90;sbit p1_1 = 0x91;sbit p1_2 = 0x92;sbit p1_3 = 0x93;sbit p1_4 =
11、 0x94;sbit p1_5 = 0x95;sbit p1_6 = 0x96;sbit p1_7 = 0x97;sbit t2 = 0x90; /* external input to timer/counter 2, clock out */sbit t2ex = 0x91; /* timer/counter 2 capture/reload trigger & dir ctl */*-scon bit registers-*/sbit ri = 0x98;sbit ti = 0x99;sbit rb8 = 0x9a;sbit tb8 = 0x9b;sbit ren = 0x9c;sbit
12、 sm2 = 0x9d;sbit sm1 = 0x9e;sbit sm0 = 0x9f;/*-p2 bit registers-*/sbit p2_0 = 0xa0;sbit p2_1 = 0xa1;sbit p2_2 = 0xa2;sbit p2_3 = 0xa3;sbit p2_4 = 0xa4;sbit p2_5 = 0xa5;sbit p2_6 = 0xa6;sbit p2_7 = 0xa7;/*-ie bit registers-*/sbit ex0 = 0xa8; /* 1=enable external interrupt 0 */sbit et0 = 0xa9; /* 1=en
13、able timer 0 interrupt */sbit ex1 = 0xaa; /* 1=enable external interrupt 1 */sbit et1 = 0xab; /* 1=enable timer 1 interrupt */sbit es = 0xac; /* 1=enable serial port interrupt */sbit et2 = 0xad; /* 1=enable timer 2 interrupt */sbit ea = 0xaf; /* 0=disable all interrupts */*-p3 bit registers (mnemoni
14、cs & ports)-*/sbit p3_0 = 0xb0;sbit p3_1 = 0xb1;sbit p3_2 = 0xb2;sbit p3_3 = 0xb3;sbit p3_4 = 0xb4;sbit p3_5 = 0xb5;sbit p3_6 = 0xb6;sbit p3_7 = 0xb7;sbit rxd = 0xb0; /* serial data input */sbit txd = 0xb1; /* serial data output */sbit int0 = 0xb2; /* external interrupt 0 */sbit int1 = 0xb3; /* exte
15、rnal interrupt 1 */sbit t0 = 0xb4; /* timer 0 external input */sbit t1 = 0xb5; /* timer 1 external input */sbit wr = 0xb6; /* external data memory write strobe */sbit rd = 0xb7; /* external data memory read strobe */*-ip bit registers-*/sbit px0 = 0xb8;sbit pt0 = 0xb9;sbit px1 = 0xba;sbit pt1 = 0xbb
16、;sbit ps = 0xbc;sbit pt2 = 0xbd;/*-t2con bit registers-*/sbit cp_rl2= 0xc8; /* 0=reload, 1=capture select */sbit c_t2 = 0xc9; /* 0=timer, 1=counter */sbit tr2 = 0xca; /* 0=stop timer, 1=start timer */sbit exen2= 0xcb; /* timer 2 external enable */sbit tclk = 0xcc; /* 0=serial clock uses timer 1 over
17、flow, 1=timer 2 */sbit rclk = 0xcd; /* 0=serial clock uses timer 1 overflow, 1=timer 2 */sbit exf2 = 0xce; /* timer 2 external flag */sbit tf2 = 0xcf; /* timer 2 overflow flag */*-t2mod bit values-*/#define dcen_ 0x01 /* 1=timer 2 can be configured as up/down counter */#define t2oe_ 0x02 /* timer 2
18、output enable */*-psw bit registers-*/sbit p = 0xd0;sbit fl = 0xd1;sbit ov = 0xd2;sbit rs0 = 0xd3;sbit rs1 = 0xd4;sbit f0 = 0xd5;sbit ac = 0xd6;sbit cy = 0xd7;/*-interrupt vectors:interrupt address = (number * 8) + 3-*/#define ie0_vector0 /* 0x03 external interrupt 0 */#define tf0_vector1 /* 0x0b ti
19、mer 0 */#define ie1_vector2 /* 0x13 external interrupt 1 */#define tf1_vector3 /* 0x1b timer 1 */#define sio_vector4 /* 0x23 serial port */#define tf2_vector5 /* 0x2b timer 2 */#define ex2_vector5 /* 0x2b external interrupt 2 */#endiflcd1602驱动程序为:#ifndef lcd_char_1602_2005_4_9#define lcd_char_1602_2
20、005_4_9#include /port definitions*sbit lcdrs= p20;sbit lcdrw= p21;sbit lcden = p22;sfr dbport = 0x80;/p0=0x80,p1=0x90,p2=0xa0,p3=0xb0.数据端口/内部等待函数*unsigned char lcd_wait(void)lcdrs=0;lcdrw=1;_nop_();lcden=1;_nop_();/while(dbport&0x80);/在用proteus仿真时,注意用屏蔽此语句,在调用gotoxy()时,会进入死循环, /可能在写该控制字时,该模块没有返回写入完备
21、命令,即dbport&0x80=0x80 /实际硬件时打开此语句lcden=0;return dbport;/向lcd写入命令或数据*#define lcd_command0 / command#define lcd_data1 / data#define lcd_clear_screen0x01 / 清屏#define lcd_homing 0x02 / 光标返回原点void lcd_write(bit style, unsigned char input)lcden=0;lcdrs=style;lcdrw=0;_nop_();dbport=input;_nop_();/注意顺序lcden=
22、1;_nop_();/注意顺序lcden=0;_nop_();lcd_wait();/设置显示模式*#define lcd_show0x04 /显示开#define lcd_hide0x00 /显示关 #define lcd_cursor0x02 /显示光标#define lcd_no_cursor0x00 /无光标 #define lcd_flash0x01 /光标闪动#define lcd_no_flash0x00 /光标不闪动void lcd_setdisplay(unsigned char displaymode)lcd_write(lcd_command, 0x08|displaym
23、ode);/设置输入模式*#define lcd_ac_up0x02#define lcd_ac_down0x00 / default#define lcd_move0x01 / 画面可平移#define lcd_no_move0x00 /defaultvoid lcd_setinput(unsigned char inputmode)lcd_write(lcd_command, 0x04|inputmode);/移动光标或屏幕*/*#define lcd_cursor0x02 #define lcd_screen0x08#define lcd_left0x00#define lcd_righ
24、t0x04void lcd_move(unsigned char object, unsigned char direction)if(object=lcd_cursor)lcd_write(lcd_command,0x10|direction);if(object=lcd_screen)lcd_write(lcd_command,0x18|direction);*/初始化lcd*void lcd_initial()lcden=0;lcd_write(lcd_command,0x38); /8位数据端口,2行显示,5*7点阵lcd_write(lcd_command,0x38);lcd_set
25、display(lcd_show|lcd_no_cursor); /开启显示, 无光标lcd_write(lcd_command,lcd_clear_screen); /清屏lcd_setinput(lcd_ac_up|lcd_no_move); /ac递增, 画面不动/*void gotoxy(unsigned char x, unsigned char y)if(y=0)lcd_write(lcd_command,0x80|x);if(y=1)lcd_write(lcd_command,0x80|(x-0x40);void print(unsigned char *str)while(*s
26、tr!=0)lcd_write(lcd_data,*str);str+;/*void lcd_loadchar(unsigned char user8, unsigned char place)unsigned char i;lcd_write(lcd_command,0x40|(place*8);for(i=0; i0; i-) ds1302_io = acc0; /相当于汇编中的 rrc ds1302_clk = 1; ds1302_clk = 0; acc = acc 1; unsigned char ds1302outputbyte(void) /实时时钟读取一字节(内部函数) uns
27、igned char i; for(i=8; i0; i-) acc = acc 1; /相当于汇编中的 rrc acc7 = ds1302_io; ds1302_clk = 1; ds1302_clk = 0; return(acc); void write1302(unsigned char ucaddr, unsigned char ucda)/ucaddr: ds1302地址, ucdata: 要写的数据 ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr); / 地址,命令 ds1302inpu
28、tbyte(ucda); / 写1byte数据 ds1302_clk = 1; ds1302_rst = 0; unsigned char read1302(unsigned char ucaddr)/读取ds1302某地址的数据 unsigned char ucdata; ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr|0x01); / 地址,命令 ucdata = ds1302outputbyte(); / 读1byte数据 ds1302_clk = 1; ds1302_rst = 0; retu
29、rn(ucdata);void ds1302_setprotect(bit flag) /是否写保护if(flag)write1302(0x8e,0x10);elsewrite1302(0x8e,0x00);void ds1302_settime(unsigned char address, unsigned char value) / 设置时间函数ds1302_setprotect(0);write1302(address, (value/10)second = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1
30、302_minute);time-minute = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_hour);time-hour = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_day);time-day = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_week);time-week = (readvalue&0x70
31、)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_month);time-month = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_year);time-year = (readvalue&0x70)4)*10 + (readvalue&0x0f);void datetostr(systemtime *time)time-datestring0 = time-year/10 + 0;time-datestring1 = time-year%1
32、0 + 0;time-datestring2 = -;time-datestring3 = time-month/10 + 0;time-datestring4 = time-month%10 + 0;time-datestring5 = -;time-datestring6 = time-day/10 + 0;time-datestring7 = time-day%10 + 0;time-datestring8 = 0;void timetostr(systemtime *time)time-timestring0 = time-hour/10 + 0;time-timestring1 =
33、time-hour%10 + 0;time-timestring2 = :;time-timestring3 = time-minute/10 + 0;time-timestring4 = time-minute%10 + 0;time-timestring5 = :;time-timestring6 = time-second/10 + 0;time-timestring7 = time-second%10 + 0;time-datestring8 = 0;void initial_ds1302(void)unsigned char second=read1302(ds1302_second);if(second&0x80) ds1302_settime(ds1302_seco
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 联合营销活动执行协议书
- 童年的味道记一次童年趣事作文8篇范文
- 护理学专业人才培养模式与影响因素分析
- 产品配方表格-原料配比
- 个人用户隐私保护条款合作协议
- 高中以定格为话题作文9篇范文
- 教育行业教师资格证书持有证明(8篇)
- 英语听力与口语技能试题集
- 区域性与文化差异在地理学人才培养中的适应性策略
- 生活中的好习惯值得培养议论文作文(5篇)
- 四川宜宾珙县选聘县属国有企业领导人员4人模拟试卷【共500题附答案解析】
- 斯皮仁诺治疗真菌疾病信心十足培训课件
- 生产现场精细化管理全案
- 部编版语文八年级下册《我一生中的重要抉择》同步练习 含答案.docx
- 手术风险评估表
- 行政能力测试知识点
- 供应商入库协议
- SetupFactory使用教程
- 开展“质量管理百日奋战”活动的实施方案
- 2015艺考(音乐专业)乐理知识模拟自测试题(共四套)
- 水的密度和黏度虽温度变化
评论
0/150
提交评论