周能康定时器课程设计报告 2.docx
《周能康定时器课程设计报告 2.docx》由会员分享,可在线阅读,更多相关《周能康定时器课程设计报告 2.docx(25页珍藏版)》请在冰点文库上搜索。
周能康定时器课程设计报告2
皖西学院
课程设计任务书
系别:
机电学院
专业:
电子信息科学与技术
学生姓名:
周能康
学号:
2011011273
课程设计题目:
基于STC12C5A60S2的定时器设计
起迄日期:
4月21日~4月30日
课程设计地点:
教学实验楼204楼
指导教师:
翁志远
下达任务书日期:
2014年4月20日
基于STC12C5A60S2的定时器设计
目录:
1.课程设计目的…………………………………….............................3
2.课程设计目的描述要求…………………………………………….3
2.1.设计描述………………………………………………………………...3
2.2.设计要求………………………………………………………………...3
3.课程设计硬件电路的设计……………………………………….….3
3.1设计项目简介……………………………………………………………..3
3.2设计方案的确定与说明……..…………………………………………...3
3.3设计方案的详细硬件设计…………………………………………….....3
3.4最小系统板的资料.....................................................................................4
3.5硬件电路图的绘制……………………………………………………….5
3.6实物图.........................................................................................................8
4.keil编译…………………………………………..........................….9
4.1.keil编译…………………………………………………………………..9
5.程序设计思路和程序框图………………………………………....11
5.1程序设计思路……………………………………………………………11
5.2定时器工作方式设置……………………………………………………11
5.3特殊功能寄存器TCON的设置………………………………………...11
5.4中断标号的查询…………………………………………………………11
5.5定时器程序详细程序框图……………………………………………....12
6.相关的计算……………………………………………………….…13
7.总结……………………………………………………………….…13
8.定时器程序清单……………………………………..…………….…14
9.参考文献…………………………………………………………....25
10.附录………………………………………………..…………….…26
1课程设计目的:
基于STC12C5A60S2的定时器设计
2课程设计题目描述和要求
2.1设计描述:
利用8253等接口芯片设计计时器(或51单片机),要求通过键盘输入计时时间,并提供一种以上的报警方式。
2.2设计要求:
1.利用8253等接口芯片设计计时器(或51单片机)完成相应的功能
2.画出详细的硬件连接图
3.给出程序设计思路,画出软件流程图
4.给出所有程序清单并加上必要注释
5.完成proteus仿真
6.撰写设计报告,调试报告及设计心得
3.课程设计硬件电路设计:
3.1设计项目简介:
定时器设计,此定时器是一款基于最小系统板做的计时工具,手动利用时间加减按键设定定时时间,当检测到开始计时按键按下后,定时器开始倒数计时,当计时结束的时候打开蜂鸣器和报警小灯,再检测到暂停按键按下的时候,关闭蜂鸣器和报警小灯。
3.2设计方案的选定与说明
因为STC12C5A60S2芯片I/O口完全能满足定时器设计的需求,所以就没有外接芯片来扩展单片机I/O的使用。
硬件电路最基础的是单片机所需要的最小系统:
电源电路,晶振电路,复位电路。
除此之外,单片机通过P0口接上拉电阻后连接了数码管的段选,P1^0口和P1^1口分别用作数码管十位和个位的位选,P1^2口用作蜂鸣器的控制,P1^3口用作报警小灯的控制,P1^4口P1^5口和P1^6口用作定时器按键的控制,风别控制时间的加/连加,减/连减和开始/暂停。
3.3设计方案的详细硬件设计:
因为对STC12C5A60S2有过编程经验,对于用它设计一个定时器还是有把握的,所有我们在8086和STC12C5A60S2这两款单片机的选择中选择了STC12C5A60S2
单片机最小系统板资料
3.4一单片机最小系统板:
二.单片机原理图:
3.5硬件电路图的绘制
AT89C52它有四个八位I/O口,我们用P0口接了上拉电阻,原因有三点:
1:
P0口片内无上拉电阻
2:
P0为I/O工作状态时,上方FET被关段,从而输出脚浮空,因此,P0用于输出线时为开漏输出。
3:
由于片内无上拉电阻,上方FET又被关断,P0输出时无法拉升端口电平。
考虑到单片机I/O口的驱动电流问题,高电平时输出拉电流,大概0.08—0.16mA,低电平时输入灌电流,最大20mA左右。
因为没有外接驱动芯片驱动数码管,为了保护单片机不在高负荷下工作和简化电路,选择了共阳数码管,数码管的公共端连接三极管,根据一个二极管点亮大约需要电流5—10mA,当一个数码管的段和小数点全部点亮的时候,大约需要电流50—80mA,为使三极管工作在饱和状态并达到数码管全部显示时的驱动电流,基极电流的100倍需要大于发射极和集电极这间的电流,所以三极管接了一个1K的限流电阻。
三级管的开关作用由P1^0口和P1^1口控制。
设定时间需要按键,为了操作方便和编程方便设计了三个独立按键,每个独立按键设计了两种功能。
按键按下后单片机I/O口被置低,三个按键分别用作时间的加,减和定时器的开关,按键信号分别由p1^4口p1^5口和p1^6口输入单片机!
电源电路设计了两路,一路是用USB接口供电,比较方便,另一路就是外接电源,可以将3—5V电源正负极接在相应插针上对定时器供电!
4.实物图:
4Keil编译与proteus仿真:
4.1.Keil编译
5程序设计思路与程序框图:
5.1程序设计思路:
在程序中用到了两个定时器和两个中断,定时器0主要用作数码管计时,每过一秒,数码管显示时间减一秒,减到零时停止计数并点亮报警小灯和打开蜂鸣器报警。
它的工作原理是利用程序使定时器0每1毫秒产生一次时间中断,以1000次时间中断定义一秒,再利用程序对得到的秒数进行计数,再对得到的秒数分别对10整除和取余数得到数码管显示的十位和个位,通过定时器0每1毫秒刷新数码管一次将秒数显示出来,定时结束后,进入中断1,点亮小灯和打开蜂鸣器报警。
中断0主要用作数码管的扫描和定时并在定时结束后打开报警小灯,报警蜂鸣器以及进入中断1服务子程序。
定时器1和中断1用作产生不同频率的波形送给蜂鸣器让蜂鸣器报警。
主函数中初始化各个变量和函数后,首先进入中断0服务子程序,然后循环进行按键的扫描。
5.2定时器工作方式设置:
5.3特殊功能寄存器TCON的设置:
5.4中断标号的查询:
5.5.定时器程序详细程序框图:
定时器1服务子程序:
目的是产生不规则的脉冲送给蜂鸣器,让蜂鸣器以不同响声报警。
6相关计算:
定时器每经过一个机器周期定时器加1,51单片机的一个机器周期默认包括12个时钟周期,这次用的定时器0和定时器1都是16位定时器,最高计数能达到65535,因为用的是11.0592M晶振,所以设定1毫秒的定时计算如下:
12*(65535-X)/11059200=0.001
X=64615
将十进制的X=64615转换成十六进制得到FC67,定时器的高低位分别是:
THXx=FC,TLx=67.
7总结:
本次试验是一个基于STC12C5A60S2的定时器设计,根据老师提供的设计要求,这次试验是在最小系统板上进行的。
设计中需要用到数码管,按键和报警小灯等,在硬件电路的设计中考虑了一下上电复位的时候单片机的引脚都置高电平了,接小灯和蜂鸣器和数码管的时候都特别注意了一下,防止上电复位对设计造成影响。
在这次设计中我对三极管和数码管的用法和接线有了更加深刻的理解。
在写程序的时候,自己突然觉得迷茫了,毕竟之前没有写过这样的程序,觉得理论和实际还有好长的路要走!
后来查书查资料才把所有的程序给写完的,包括数码管的显示,按键的扫描,中断的调用等,但是仿真的时候出不来结果。
然后就一个一个模块调试,先调试的是数码管,发现数码管的动态刷新时间还是有较高要求的,时间太长会闪烁,时间太短会造成重影,用了两个数码管,最后调整在大约3毫秒。
调试按键的时候出现按一次跳变几个数的情况,原因是按键没有硬件去抖也没有软件去抖,因为软件去抖也挺好实现的,就决定了在程序里面软件去抖,最后去抖延时调整在大约15毫秒,按键可以很好的被识别。
每个按键设计了两种功能,对按键没有放开的时候进行了计时,超过2秒就认为达到长按模式,这个调试的时候也出现过问题,就是按键去抖延时太长或者太短的时候,按下去很久数码管依旧刷新不了,放开的时候会加1,最后按键去抖大约10到15毫秒的时候这个问题就不出现了。
本来想让报警小灯闪烁的,但是在中断里面加程序的时候出现了死循环,最后就让小灯常亮了,这是一个缺陷,蜂鸣器程序是在中断1里面的,本来想加警车报警声音的,但是延时控制的不是很好,这也是一个缺陷。
最后定时器还是能完全实现老师要求的功能的。
再同学们去实验室调试的时候,感谢老师对芯片用法的细心指导。
8定时器程序清单:
#include
#include"intrins.h"
#ifndef_CH452_H_
#define_CH452_H_
sbitCH452_SCL=P1^7;
sbitCH452_SDA=P1^6;
sbitCH452_INT=P3^2;
#defineCH452_NOP0x0000//空操作
#defineCH452_RESET0x0201//复位
#defineCH452_LEVEL0x0100//加载光柱值,需另加7位数据
#defineCH452_CLR_BIT0x0180//段位清0,需另加6位数据
#defineCH452_SET_BIT0x01C0//段位置1,需另加6位数据
#defineCH452_SLEEP0x0202//进入睡眠状态
#defineCH452_LEFTMOV0x0300//设置移动方式-左移
#defineCH452_LEFTCYC0x0301//设置移动方式-左循环
#defineCH452_RIGHTMOV0x0302//设置移动方式-右移
#defineCH452_RIGHTCYC0x0303//设置移动方式-右循环
#defineCH452_SELF_BCD0x0380//自定义BCD码,需另加7位数据
#defineCH452_SYSOFF0x0400//关闭显示、关闭键盘
#defineCH452_SYSON10x0401//开启显示
#defineCH452_SYSON20x0403//开启显示、键盘
#defineCH452_SYSON2W0x0423//开启显示、键盘,真正2线接口
#defineCH452_NO_BCD0x0500//设置默认显示方式,可另加3位扫描极限
#defineCH452_BCD0x0580//设置BCD译码方式,4位扫描占空比(默认0为16/16)
#defineCH452_TWINKLE0x0600//设置闪烁控制,需另加8位数据
#defineCH452_GET_KEY0x0700//获取按键,返回按键代码
#defineCH452_DIG00x0800//数码管位0显示,需另加8位数据
#defineCH452_DIG10x0900//数码管位1显示,需另加8位数据
#defineCH452_DIG20x0a00//数码管位2显示,需另加8位数据
#defineCH452_DIG30x0b00//数码管位3显示,需另加8位数据
#defineCH452_DIG40x0c00//数码管位4显示,需另加8位数据
#defineCH452_DIG50x0d00//数码管位5显示,需另加8位数据
#defineCH452_DIG60x0e00//数码管位6显示,需另加8位数据
#defineCH452_DIG70x0f00//数码管位7显示,需另加8位数据
//#defineCH452_00X0510
/*******CH452在BCD译码方式下的特殊字符**********/
#defineCH452_BCD_SPACE0x10
#defineCH452_BCD_PLUS0x11
#defineCH452_BCD_MINUS0x12
#defineCH452_BCD_EQU0x13
#defineCH452_BCD_LEFT0x14
#defineCH452_BCD_RIGHT0x15
#defineCH452_BCD_UNDER0x16
#defineCH452_BCD_CH_H0x17
#defineCH452_BCD_CH_L0x18
#defineCH452_BCD_CH_P0x19
#defineCH452_BCD_DOT0x1A
#defineCH452_BCD_SELF0x1E
#defineCH452_BCD_TEST0x88
#defineCH452_BCD_DOT_X0x80
/*******2线接口的CH452定义************/
#defineCH452_I2C_ADDR00x40//CH452的ADDR=0时的地址
#defineCH452_I2C_ADDR10x60//CH452的ADDR=1时的地址,默认值
#defineCH452_I2C_MASK0x3E//CH452的2线接口高字节命令掩码
#defineDELAY_IO{_nop_();_nop_();nop_();_nop_();}//IO操作需延时,STC单片机12MHz下2个即可
/*******此程序作为头文件时CH452对外子程序声明************/
externunsignedcharCH452_Read_Key();//从CH452读取按键代码
externvoidCH452_Write(unsignedshortcmd);//向CH452发出操作命令、显示等
#endif
#include"ch452.h"
/******************************
函数说明:
模拟I2C启动
******************************/
voidCH452_I2c_Start(void)
{
CH452_SDA=1;DELAY_IO;//发送起始条件的数据信号
CH452_SCL=1;DELAY_IO;
CH452_SDA=0;DELAY_IO;//发送起始信号
CH452_SCL=0;DELAY_IO;//钳住I2C总线,准备发送或接收数据
}
/******************************
函数说明:
模拟I2C结束
******************************/
voidCH452_I2c_Stop(void)
{
CH452_SDA=0;DELAY_IO;
CH452_SCL=1;DELAY_IO;
CH452_SDA=1;DELAY_IO;//发送I2C总线结束信号
}
/******************************
函数说明:
模拟I2C写一个字节数据
入口参数:
dat=要写入的数据或者命令
******************************/
voidCH452_I2c_WrByte(unsignedchardat)
{
unsignedchari;
for(i=0;i!
=8;i++)//输出8位数据
{
if(dat&0x80){CH452_SDA=1;}
else{CH452_SDA=0;}
DELAY_IO;
CH452_SCL=1;
dat<<=1;DELAY_IO;
CH452_SCL=0;DELAY_IO;
}
CH452_SDA=1;DELAY_IO;
CH452_SCL=1;DELAY_IO;//接收应答
CH452_SCL=0;DELAY_IO;
}
/******************************
函数说明:
模拟I2C读取一个字节数据
出口参数:
dat=要读取的数据,一般为按键值
******************************/
unsignedcharCH452_I2c_RdByte(void)
{
unsignedchardat;
unsignedchari;
CH452_SDA=1;DELAY_IO;
dat=0;
for(i=0;i!
=8;i++)//输入8位数据
{
CH452_SCL=1;DELAY_IO;
dat<<=1;
if(CH452_SDA)dat++;//输入1位
CH452_SCL=0;DELAY_IO;
}
CH452_SDA=1;DELAY_IO;
CH452_SCL=1;DELAY_IO;//发出无效应答
CH452_SCL=0;DELAY_IO;
returndat;
}
/******************************
函数说明:
模拟I2C写入指令
入口参数:
cmd=要写入的指令代码
******************************/
voidCH452_Write(unsignedintcmd)
{
CH452_I2c_Start();//启动总线
CH452_I2c_WrByte((unsignedchar)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1);
CH452_I2c_WrByte((unsignedchar)cmd);//发送数据
CH452_I2c_Stop();//结束总线
}
/******************************
函数说明:
模拟I2C读取CH452按键值
入口参数:
read_cmd=读取指令代码
出口参数:
按键值0x00~0x3F
******************************/
unsignedcharCH452_Read(unsignedintread_cmd)
{
unsignedchartemp;
CH452_I2c_Start();//启动总线
CH452_I2c_WrByte((unsignedchar)(read_cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1|0x01);
temp=CH452_I2c_RdByte();//读取数据
CH452_I2c_Stop();//结束总线
returntemp;
}
/******************************
函数说明:
读取CH452按键值
******************************/
unsignedcharCH452_Read_Key()
{
unsignedchartemp,keyboard=0;
temp=CH452_Read(CH452_GET_KEY);
switch(temp&0x3f)
{
case0x1b:
keyboard=15;break;
case0x1a:
keyboard=14;break;
case0x19:
keyboard=13;break;
case0x18:
keyboard=12;break;
case0x13:
keyboard=11;break;
case0x12:
keyboard=10;break;
case0x11:
keyboard=9;;break;
case0x10:
keyboard=8;break;
case0x0b:
keyboard=7;break;
case0x0a:
keyboard=6;break;
case0x09:
keyboard=5;break;
case0x08:
keyboard=4;break;
case0x03:
keyboard=3;break;
case0x02:
keyboard=2;break;
case0x01:
keyboard=1;break;
case0x00:
keyboard=0;break;
}
returnkeyboard;
}
#include"reg52.h"
#include"ch452.h"
typedefunsignedcharuint8;
typedefunsignedintuint16;
uint16temp=0,number=0;
uint8key;
bitflag=1;
sbitBUZZER=P0^0;//J3第二个引脚
sbitLED=P0^1;//J3第三个引脚,报警小灯
voidtimer1_init()
{
TMOD|=0X10;
TMOD&=0XDF;
TH1=0XFC;
TL1=0X67;
TR1=0;
ET1=1;
EA=1;
}
voiddisplay()
{
if(temp<1000)
CH452_Write(CH452_DIG