单片机技术课程设计报告.docx
- 文档编号:8604018
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:17
- 大小:218.78KB
单片机技术课程设计报告.docx
《单片机技术课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机技术课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
单片机技术课程设计报告
课设报告
题目:
基本时钟和倒计时时钟
班级:
姓名:
学号:
指导老师:
日期:
2013年10月11日
目录
目录2
1 摘要2
2 设计要求2
2.1 功能需求 (即实现的功能)2
2.2 设计要求 (用哪些部件实现功能需求)2
3 硬件设计及描述2
3.1 总体描述 (整体实现的功能简述)2
3.2 系统总体框图3
3.3 Proteus电路图(暂时不需)3
3.4 各部分硬件介绍 (proteus截图+解释)3
4 软件设计流程及描述3
4.2 函数模块及功能4
5 功能实现(功能介绍+照片)5
6 心得体会5
7 源程序5
1 摘要
采用单片机STC90C516RD+和MCS-51实验开发板,在实验开发板上,根据预定的功能,选定了数码管, 独立按键,4*4键盘等模块设计出一个基本的时钟和倒计时时钟。
实验采用C语言进行程序编写,实现基本时钟和倒计时时钟可以自行设置时间并且每过一秒自动加一,当59秒后自动向分进位,59分后自动向是进位,而倒计时每一秒自动减1,当00秒后自动向分借位、59分后自动向时借位。
2 设计要求
2.1 功能需求 (即实现的功能)
实现的功能如下:
时钟
基本功能:
(1)设置当前时间,(按键或键盘设置),在数码管上显示,如12-23-33
(2)从当前设置的时间开始走时,每一秒自动加1,当59秒后自
动向分进位、59分后自动向时进位。
倒计时表
基本功能:
(1)设置当前时间,(按键或键盘设置),在数码管上显示,如12-23-33
(2)从当前设置的时间开始倒计时,每一秒自动减1,当00秒后自
动向分借位、59分后自动向时借位。
2.2 设计要求 (用哪些部件实现功能需求)
实验功能实现所需的部件有:
单片机最小系统:
AT89C51;显示模块:
数码管;按键模块:
4*4键盘,独立按键。
3 硬件设计及描述
3.1 总体描述 (整体实现的功能简述)
首先按独立按键的p3^2进入时间的设置,时间格式为:
12-34-56。
在按下p3^2时相应的数码管会显示A,表示可以对该数码管进行时间设置。
当时间设置完成后,按下P3^3第一个数码管会显示A,此时表示你可以选择是以基本时钟工作还是倒计时时钟工作,在键盘上按下s1选择基本时钟工作,按下s2选择倒计时时钟工作。
选择后,单片机就会进行工作。
3.2 系统总体框图
3.3 Proteus电路图(暂时不需)
3.4 各部分硬件介绍 (proteus截图+解释)
1.AT89C51简介:
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.数码管:
数码管是一种半导体发光器件,其基本单元是发光二极管。
3.74HC138译码器:
74HC138译码器可接受3位二进制加权地址输入(A0,A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:
两个低有效(E1和E2)和一个高有效(E3)。
除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。
利用这种复合使能特性,仅需4片74HC138芯片和1个反相器,即可轻松实现并行扩展,组合成为一个1-32(5线到32线)译码器。
任选一个低有效使能输入端作为数据输入,而把其余的使能输入端作为选通端,则74HC138亦可充当一个8输出多路分配器,未使用的使能输入端必须保持绑定在各自合适的高有效或低有效状态。
4软件设计流程及描述
4.1 程序流程图
4.2 函数模块及功能
1)
voidoutside_interrupt()外部中断0和1的设置
voidseconds_time0()定时器t0设置
voidseconds_time1()定时器t1设置
voidINT0_ISP()interrupt0选择那个数码管设置时间(外部中断0)
time1()对选择的数码管设置数值
voidINT1_ISP()interrupt2选择基本时钟或者倒计时时钟(外部中断1)
voidtime0_0()interrupt1基本时钟的时间进位处理
voidtime1_1()interrupt3倒计时时钟的借位处理
5 功能实现(功能介绍+照片)
6 心得体会
此次课程设计用到了单片机的多块模块,包括 数码管显示,4*4键盘,独立按键。
实验过程让我更加了解并进一步掌握了中断,定时计数,4*4键盘输入等程序编写。
通过此次课程设计,初步掌握了使单片机多个模块进行工作的原理和方法。
7 源程序
#include
sbitg1=P2^0;//数码管显示
sbitg2=P2^1;
sbitg3=P2^2;
sbitk1=P3^2;//外部输入为p3.2,p3.3,p3.4
sbitk2=P3^3;
sbitk3=P3^4;
typedefunsignedintunint;
unintcount=0;//count是一秒的计数
staticcharc=0;
unints0=0,s1=0,s2=0,s3=0,s4=0,s5=0;//按键记录按下的是(0~9)?
unintw=0,d=0;
staticunintb0=0x3f,b1=0x3f,b2=0x3f,b3=0x3f,b4=0x3f,b5=0x3f;//记录当前p0的值
charcodenumber[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x77};//数码管显示值(0~9)
/***************外部中断0和1的设置****************/
voidoutside_interrupt()
{
EA=1;
EX0=1;
EX1=1;
IT0=0;
IT1=0;
}
/*************定时器t0设置******************/
voidseconds_time0()//
{
TMOD=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
TR1=0;
}
/*****************定时器t1设置********************/
voidseconds_time1()
{
TMOD=0X01;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
TR0=0;
}
/********************************************/
/**************选择那个数码管设置时间(外部中断0)***************/
/********************************************/
voidINT0_ISP()interrupt0
{
switch(w)
{
case1:
g1=0;g2=0;g3=0;time1();s5=d;b0=number[s5];break;
case2:
g1=1;g2=0;g3=0;time1();s4=d;b1=number[s4];break;
case3:
g1=1;g2=1;g3=0;time1();s3=d;b2=number[s3];break;
case4:
g1=0;g2=0;g3=1;time1();s2=d;b3=number[s2];break;
case5:
g1=0;g2=1;g3=1;time1();s1=d;b4=number[s1];break;
case6:
g1=1;g2=1;g3=1;time1();s0=d;b5=number[s0];break;
default:
break;
}
w++;
while(w==7)
{
w=0;
}
}
/********************************************/
/***********对选择的数码管设置数值*****************/
/********************************************/
time1()
{
unsignedcharh_code,l_code,key_code;
P0=number[11];
while(P0==number[11])
{
P1=0xf0;
h_code=P1;
h_code=h_code&0xf0;
P1=0x0f;
l_code=P1;
l_code=l_code&0x0f;
key_code=h_code|l_code;
if(key_code!
=0xff)
{
switch(key_code)
{
case0xee:
P0=number[0];d=0;break;
case0xde:
P0=number[1];d=1;break;
case0xbe:
P0=number[2];d=2;break;
case0x7e:
P0=number[3];d=3;break;
case0xed:
P0=number[4];d=4;break;
case0xdd:
P0=number[5];d=5;break;
case0xbd:
P0=number[6];d=6;break;
case0x7d:
P0=number[7];d=7;break;
case0xeb:
P0=number[8];d=8;break;
case0xdb:
P0=number[9];d=9;break;
default:
break;
}
}
}
}
/********************************************/
/******选择基本时钟或者倒计时时钟(外部中断1)*************/
/********************************************/
voidINT1_ISP()interrupt2
{
unsignedcharh_code,l_code,key_code,a=0;
P0=number[11];
while(a==0)
{g1=1;g2=1;g3=1;
P1=0xf0;
h_code=P1;
h_code=h_code&0xf0;
P1=0x0f;
l_code=P1;
l_code=l_code&0x0f;
key_code=h_code|l_code;
if(key_code!
=0xff)
{
switch(key_code)
{
case0xee:
P0=number[0];a=1;break;
case0xde:
P0=number[1];a=2;break;
default:
break;
}
}
}
if(a==1)
{
seconds_time0();
}
if(a==2)
{
seconds_time1();
}
}
/********************************************/
/**************基本时钟的时间进位处理****************************/
/********************************************/
voidtime0_0()interrupt1//中断定时器0
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
count++;
TF0=0;
switch(c)
{
case0:
g1=0;g2=0;g3=0;P0=b0;c++;break;
case1:
g1=1;g2=0;g3=0;P0=b1;c++;break;
case2:
g1=0;g2=1;g3=0;P0=0x40;c++;break;
case3:
g1=1;g2=1;g3=0;P0=b2;c++;break;
case4:
g1=0;g2=0;g3=1;P0=b3;c++;break;
case5:
g1=1;g2=0;g3=1;P0=0x40;c++;break;
case6:
g1=0;g2=1;g3=1;P0=b4;c++;break;
case7:
g1=1;g2=1;g3=1;P0=b5;c=0;break;
default:
break;
}
if(count==1000)
{
b5=number[++s0];
count=0;
}
if(s0>9)
{
s1++;
s0=0;
b4=number[s1];
}
if(s1>5)
{
s2++;
s1=0;
b4=number[s1];
b3=number[s2];
}
if(s2>9)
{
s3++;
s2=0;
b3=number[s2];
b2=number[s3];
}
if(s3>5)
{
s4++;
s3=0;
b2=number[s3];
b1=number[s4];
}
if(s4>9)
{
s5++;
s4=0;
b1=number[s4];
b0=number[s5];
}
if(s5==2&&s4>4)
{
s0=0;
s1=0;
s2=0;
s3=0;
s4=0;
s5=0;
b0=number[s5];
b1=number[s4];
b2=number[s3];
b3=number[s2];
b4=number[s1];
b5=number[s0];
}
if(s5>2)
{
s0=0;
s1=0;
s2=0;
s3=0;
s4=0;
s5=0;
b0=number[s5];
b1=number[s4];
b2=number[s3];
b3=number[s2];
b4=number[s1];
b5=number[s0];
}
}
/********************************************/
/********************倒计时时钟的借位处理****************************/
/********************************************/
voidtime1_1()interrupt3//中断定时器1
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count++;
TF1=0;
switch(c)
{
case0:
g1=0;g2=0;g3=0;P0=b0;c++;break;
case1:
g1=1;g2=0;g3=0;P0=b1;c++;break;
case2:
g1=0;g2=1;g3=0;P0=0x40;c++;break;
case3:
g1=1;g2=1;g3=0;P0=b2;c++;break;
case4:
g1=0;g2=0;g3=1;P0=b3;c++;break;
case5:
g1=1;g2=0;g3=1;P0=0x40;c++;break;
case6:
g1=0;g2=1;g3=1;P0=b4;c++;break;
case7:
g1=1;g2=1;g3=1;P0=b5;c=0;break;
default:
break;
}
if(count==8000&&s0>0)
{
b5=number[--s0];
count=0;
}
if(s0==0&&count==8000&&(s1>0||s2>0||s3>0||s4>0||s5>0))
{
count=0;
if(s1>0)
{
s0=9;
b4=number[--s1];
b5=number[s0];
}
elseif(s1<=0&&s2>0)
{
s1=5;
s0=9;
b3=number[--s2];
b4=number[s1];
b5=number[s0];
}
elseif(s1<=0&&s2<=0&&s3>0)
{
s2=9;
s1=5;
s0=9;
b2=number[--s3];
b3=number[s2];
b4=number[s1];
b5=number[s0];
}
elseif(s1<=0&&s2<=0&&s3<=0&&s4>0)
{
s3=5;
s2=9;
s1=5;
s0=9;
b1=number[--s4];
b2=number[s3];
b3=number[s2];
b4=number[s1];
b5=number[s0];
}
elseif(s1<=0&&s2<=0&&s3<=0&&s4<=0&&s5>0)
{
s4=9;
s3=5;
s2=9;
s1=5;
s0=9;
b0=number[--s5];
b1=number[s4];
b2=number[s3];
b3=number[s2];
b4=number[s1];
b5=number[s0];
}
}
if(s5<0)
{
s0=0;
s1=0;
s2=0;
s3=0;
s4=0;
s5=0;
b0=number[s5];
b1=number[s4];
b2=number[s3];
b3=number[s2];
b4=number[s1];
b5=number[s0];
}
}
/********************************************/
/****************程序开始点******************/
/********************************************/
voidmain()
{
outside_interrupt();
while
(1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 技术 课程设计 报告