电气工程及其自动化单片机课程设计_电气工程及自动化课程

其他范文 时间:2020-02-28 13:36:34 收藏本文下载本文
【www.daodoc.com - 其他范文】

电气工程及其自动化单片机课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“电气工程及自动化课程”。

河北建筑工程学院

单片机课程设计任务书

课程名称:

单片机原理及应用 系 :

电气工程系 专 业:

电气工程及其自动化 班 级: 学 号: 2008308112 学生姓名:

指导教师: 职 称:

讲师

2012 年 1 月 1 日

一·摘要

近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此越来越广泛地应用各个领域.本文的电子钟系统是以单片机(AT89C51)为核心,时钟芯片DS1302、数码管显示驱动芯片74LS164等元器件组成。具体介绍应用protell软件进行单片机系统的电子钟设计与仿真的实现方法。该方法既能准确验证所设计的系统是否满足技术要求,又能提高系统设计的效率和质量,降低开发成本,具有推广价值。

关键词:单片机; 时钟芯片 ;数码管显示驱动芯片 ;电子钟

二·系统总体方案设计

随着电子技术的发展,人类不断研究,不断创新纪录。万年历目前已经不再局限于以书本形式出现。以电脑软件或者电子产品形式出现的万年历被称为电子万年历。与传统书本形式的万年历相比,电子万年历得到了越来越广泛的应用,采用电子时钟作为时间显示已经成为一种时尚。目前市场上各式各样的电子时钟数不胜数,但多数是只针对时间显示,功能单一不能满足人们日常生活需求。

本文提出了一种基于AT89C51单片机的万年历设计方案,本方案以AT89C51单片机作为主控核心,与时钟芯片DS1302、按键、LED显示等模块组成硬件系统。在硬件系统中设有独立按键和LED显示器,能显示丰富的信息,根据使用者的需要可以随时对时间进行校准、选择时间等,综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

1.功能要求

本电子时钟能显示星期、小时、分钟、秒

2.技术可行性

随着国内超大规模集成电路的出现,微处理器及其外围芯片有了迅速的发展。集成技术的最新发展之一是将CPU和外围芯片,如程序存储器、数据存储器、并行I/O口、串行I/O口、定时/计数器、中断控制器及其他控制部件集成在一个芯片之中,制成单片计算机(Single-Chip Microcomputer)。而近年来推出的一些高档单片机还包括有许多特殊功能单元,如A/D、D/A转换器、调制解调器、通信控制器、锁相环、DMA、浮点运算单元、PWM控

4.DS1302简介

(1)DS1302特性介绍

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。

(2)DS1302引脚介绍

各引脚的功能为:

8、Vcc1:备用电池端;

1、Vcc2:5V电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2

7、SCLK:串行时钟,输入;

6、I/O:数据输入输出口;

5、CE/RST:复位脚

3、X1、X2 是外接晶振脚(32.768KHZ的晶振)

4、地(GND)

(4)DS1302有关日历、时间的寄存器

寄存器的说明如下:

1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开

6(2)时钟电路DS1302

DS1302的性能特性: ● 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行比较; ● 用于高速数据暂存的31*8位RAM; ● 最少引脚的串行I/O; ● 2.5~5.5V电压工作范围; ● 2.5V时耗小于300nA;

● 用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式; ● 简单的三线接口;

● 可选的慢速充电(至Vcc1)的能力。

DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。

DS1302的控制字如表所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。位5~1(A4~A0)指示操作单元的地址。最低有效位(位0)如果为0,则表示药进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。

为了提高对32个地址寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能存储数据。在多字节方式下,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至RAM。

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字如上表所示,其中奇数为读操作,偶数为写操作。

时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。

AM-PM/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时位(20~23h)。

DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。

9DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。

四· 系统软件设计

1.程序设计

电子万年历的程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是74LS164从单片机中读取数据驱动LED数码管显示时间。

AT89C51单片机主要I/O口的分配,P2.0-P2.2分别接74LS164的DIN,LOAD,CLK三个功能端,P3接查询式按键,P1.0-P1.2分别接DS1302的CLK,IO,RST端。

2.时间控制流程图

DS1302时控流程图

附录 电子时钟程序

#include #include #define uchar unsigned char #define uint unsigned int uchar count_10ms;

//定义10ms计数器 sbit K1 = P3^2;

//定义K1键 sbit K2 = P3^3;

//定义K2键 sbit K3 = P3^4;

//定义K3键 sbit K4 = P3^5;

//定义K4键 sbit BEEP=P3^7;//定义蜂鸣器 sbit reset = P1^2;sbit sclk = P1^0;sbit io

= P1^1;sbit LCD_RS=P2^0;

sbit LCD_RW=P2^1;

sbit LCD_EN=P2^2;bit K1_FLAG=0;

//定义按键标志位,当按下K1键时,该位置1,K1键未按下时,该位为0。uchar code line1_data[] = {“---LCD Clcok---”};

//定义第1行显示的字符 uchar code line2_data[] = {“****”};

//定义第2行显示的字符 uchar disp_buf[8] ={0x00};

//定义显示缓冲区 uchar time_buf[7] ={0,0,0x12,0,0,0,0};//DS1302时间缓冲区,存放秒、分、时、日、月、星期、年 uchar temp [2]={0};

//用来存放设置时的小时、分钟的中间值 /********以下是函数声明********/ void Delay_ms(uint xms);bit lcd_busy();

void lcd_wcmd(uchar cmd);

void lcd_wdat(uchar dat);

void lcd_clr();void lcd_init();void write_byte(uchar inbyte);

//写一字节数据函数声明 uchar read_byte();

//读一字节数据函数声明 void write_ds1302(uchar cmd,uchar indata);//写DS1302函数声明 uchar read_ds1302(uchar addr);

//读DS1302函数声明

void set_ds1302(uchar addr,uchar *p,uchar n);//设置DS1302初始时间函数声明 void get_ds1302(uchar addr,uchar *p,uchar n);//读当前时间函数声明 void init_ds1302();

//DS1302初始化函数声明 /********以下是延时函数********/ void Delay_ms(uint xms)

{ uint i,j;for(i=xms;i>0;i--)

//i=xms即延时约xms毫秒

for(j=110;j>0;j--);} /********以下是LCD忙碌检查函数********/

_nop_();

LCD_EN = 1;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN = 0;

}

/********以下是LCD清屏函数********/ void lcd_clr()

{

lcd_wcmd(0x01);

//清除LCD的显示内容

Delay_ms(5);

}

/********以下是LCD初始化函数********/ void lcd_init()

{

Delay_ms(15);

//等待LCD电源稳定

lcd_wcmd(0x38);

//16*2显示,5*7点阵,8位数据

Delay_ms(5);

lcd_wcmd(0x38);

Delay_ms(5);

lcd_wcmd(0x38);

Delay_ms(5);

lcd_wcmd(0x0c);

//显示开,关光标

Delay_ms(5);

lcd_wcmd(0x06);

//移动光标

Delay_ms(5);

lcd_wcmd(0x01);

//清除LCD的显示内容

Delay_ms(5);

}

/********以下是写一字节数据函数********/ void write_byte(uchar inbyte){

uchar i;

for(i=0;i

{

sclk=0;

//写时低电平改变数据

if(inbyte&0x01)

io=1;

else

io=0;

sclk=1;

//高电平把数据写入DS1302

_nop_();

inbyte=inbyte>>1;

{

write_ds1302(addr,*p);

p++;

addr=addr+2;

}

write_ds1302(0x8e,0x80);

//写保护,不允许写 } ********读取当前时间函数******** void get_ds1302(uchar addr,uchar *p,uchar n){

for(;n>0;n--)

{

*p=read_ds1302(addr);

p++;

addr=addr+2;

} } ********初始化DS1302函数********/ void init_ds1302(){

reset=0;

sclk=0;

write_ds1302(0x80,0x00);//写秒寄存器

write_ds1302(0x90,0xab);//写充电器

write_ds1302(0x8e,0x80);//写保护控制字,禁止写 }

/*********以下是蜂鸣器响一声函数********/ void beep(){

BEEP=0;

//蜂鸣器响

Delay_ms(100);

BEEP=1;

//关闭蜂鸣器

Delay_ms(100);

} /********以下是转换函数,负责将走时数据转换为适合LCD显示的数据********/ void LCD_conv(uchar in1,in2,in3)

//形参in1、in2、in3接收实参time_buf[2]、time_buf[1]、time_buf[0]传来的小时、分钟、秒数据 { disp_buf[0]=in1/10+0x30;

//小时十位数据

disp_buf[1]=in1%10+0x30;

//小时个位数据

disp_buf[2]=in2/10+0x30;

//分钟十位数据

disp_buf[3]=in2%10+0x30;

//分钟个位数据

disp_buf[4]=in3/10+0x30;

//秒十位数据

disp_buf[5]=in3%10+0x30;

//秒个位数据 } {

Delay_ms(10);//延时去抖

if(K4==0)

{

while(!K4);//等待K4键释放

beep();

write_ds1302(0x80,0x00);//调整完毕后,启动时钟运行

write_ds1302(0x8e,0x80);//写保护控制字,禁止写

K1_FLAG=0;//将K1键按下标志位清0

} } }

/********以下是读取时间函数,负责读取当前的时间,并将读取到的时间转换为10进制数********/ void get_time(){ uchar sec,min,hour;

//定义秒、分和小时变量

write_ds1302(0x8e,0x00);

//控制命令,WP=0,允许写操作

write_ds1302(0x90,0xab);

//涓流充电控制

sec=read_ds1302(0x81);

//读取秒

min=read_ds1302(0x83);

//读取分

hour=read_ds1302(0x85);

//读取时

time_buf[0]=sec/16*10+sec%16;

//将读取到的16进制数转化为10进制

time_buf[1]=min/16*10+min%16;

//将读取到的16进制数转化为10进制

time_buf[2]=hour/16*10+hour%16;

//将读取到的16进制数转化为10进制 } /********以下是主函数********/ void main(void){ uchar i;P0 = 0xff;P2 = 0xff;lcd_init();

//LCD初始化函数(在LCD驱动程序软件包中)

lcd_clr();

//清屏函数(在LCD驱动程序软件包中)

lcd_wcmd(0x00|0x80);

//设置显示位置为第1行第0列

i = 0;

while(line1_data[i]!= '')

//在第1行显示“---LCD Clcok---”

{

lcd_wdat(line1_data[i]);

//显示第1行字符

i++;

//指向下一字符

}

lcd_wcmd(0x40|0x80);

//设置显示位置为第2行第0列

i = 0;

while(line2_data[i]!= '')

//在第2行0~3列显示“****”

{

lcd_wdat(line2_data[i]);

//显示第2行字符

920-

下载电气工程及其自动化单片机课程设计word格式文档
下载电气工程及其自动化单片机课程设计.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

    热门文章
      整站推荐
        点击下载本文