单片机课程设计.docx
- 文档编号:29912534
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:33
- 大小:376.84KB
单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(33页珍藏版)》请在冰豆网上搜索。
单片机课程设计
课程设计任务书
学院___________专业____________班级________姓名_________
一、课程设计题目:
______________________________________
二、课程设计主要参考资料:
(1)_____________________________________________________
(2)_____________________________________________________
(3)_____________________________________________________
(4)_____________________________________________________
________________________________________________________
三、课程设计应解决的主要问题:
(1)_____________________________________________________
(2)_____________________________________________________
(3)_____________________________________________________
(4)_____________________________________________________
________________________________________________________
四、课程设计相关附件(如:
图纸、软件等):
(1)_____________________________________________________
(2)_____________________________________________________
(3)_____________________________________________________
(4)_____________________________________________________
________________________________________________________
五、课程设计开始日期:
_____________________
课程设计完成日期:
_____________________
指导老师签字:
_______________指导老师对课程设计的评语
指导老师签字:
__________
___年____月___日
一、主要器件与软件介绍:
1.单片机介绍:
单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。
单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器;
单片机有40个引脚,功能大致可以分为4个种类:
电源、时钟、控制和I/O引脚。
⑴电源:
1VCC-芯片电源,接+5V;
2VSS-接地端;
⑵时钟:
XTAL1、XTAL2—晶体
振荡电路反相输入端和输出端;
⑶控制:
控制线一共有4根:
1ALE/PROG:
地址所存允许
/片内EPROM编程脉冲
2PSEN:
外ROM读选通信号
3RST/VPD:
复位/备用电源
4EA/Vpp:
内外ROM选择/
片内EPROM编程电源
⑷I/O引脚:
80C51共有4个8位并行I/O端口:
P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊
信号输入输出和控制信号(属控制总线)
P3口第二功能:
1P30RXD串行输入口
2P31TXD串行输出口
3P32INT0外部中断0(低电平有效)
4P33INT1外部中断1(低电平有效)
5P34T0定时计数器0
6P35T1定时计数器1
7P36WR外部数据存储器写选通(低电平有效)
8P37RD外部数据存储器读选通(低电平有效)
2.
74HC164介绍:
8位串入、并出移位寄存器
74HC164、74HCT164是高
速硅门CMOS器件,与低
功耗肖特基型TTL(LSTTL
)器件的引脚兼容。
74HC
164、74HCT164是8位边
沿触发式移位寄存器,串
行输入数据,然后并行输
出。
数据通过两个输入端
(DSA或DSB)之一串行
输入;任一输入端可以用
作高电平使能端,控制另
一输入端的数据输入。
两
个输入端或者连接在一起
,或者把不用的输入端接
高电平,一定不要悬空。
符号
引脚
说明
A
1
数据输入
B
2
数据输入
Q0~Q3
3~6
输出
GND
7
接地
CP
8
时钟输入
/M/R
9
中央复位输入
Q4~Q7
10~13
输出
VCC
14
正电源
3.
数码管介绍:
按发光二极管单元连接方
式分为共阳极数码管和共
阴极数码管。
共阳数码管
是指将所有发光二极管的
阳极接到一起形成公共阳
极(COM)的数码管。
共阳
数码管在应用时应将公共
极COM接到+5V,当某
一字段发光二极管的阴极
为低电平时,相应字段就
点亮。
当某一字段的阴极
为高电平时,相应字段就
不亮。
。
共阴数码管是指
将所有发光二极管的阴极
接到一起形成公共阴极(C
OM)的数码管。
共阴数码
管在应用时应将公共极C
OM接到地线GND上,
当某一字段发光二极管
的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
4.KeiluVision2软件介绍:
KeiluVision2是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统C语言的语法来开发,与汇编相比,C语言在功能上、结构上、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使爱好者在很短的时间内就能学会使用keilc51来开发您的单片机应用程序;
5.Proteus7软件介绍:
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具,从原理图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
6.Protel99SE介绍:
Protel99SE是应用于Windows9X/2000/NT操作系统下的EDA设计软件,采用设计库管理模式,可以进行联网设计,具有很强的数据交换能力和开放性及3D模拟功能,是一个32位的设计软件,可以完成电路原理图设计,印制电路板设计和可编程逻辑器件设计等工作,可以设计32个信号层,16个电源--地层和16个机加工层。
⑴电路工程设计部分:
①电路原理设计部分:
电路原理设计部分包括电路图编辑器(简称SCH)、电路图零件库编辑器(简称Schlib编辑器)和各种文本编辑器。
②印刷电路板设计系统:
印刷电路板设计系统包括电路板编辑器(简称PCB编辑器)、零件封装编辑器(简称PCBLib编辑器)和电路板组件管理器。
③自动布线系统:
自动布线系统包含一个基于形状的无栅格自动布线器,用于印刷电路板的自动布线,以实现PCB设计的自动化。
⑵电路仿真与PLD部分:
①电路模拟仿真系统:
电路模拟仿真系统包含一个数字/模拟信号仿真器,可提供连续的数字信号和模拟信号,以便对电路原理图进行信号模拟仿真从而验证其正确性与可行性。
2可编程逻辑设计系统:
可编程逻辑系统包含一个有语法功能的文本编辑器和一个波形编辑器。
主要功能是对逻辑电路进行分析、综合;观察信号的波形。
利用PLD系统可以最大限度的精简逻辑部件,使数字电路设计达到最简化。
3高级信号完整性分析系统:
高级信号完整性分析系统提供了一个精确的信号完整性模拟器,可用来分析PCB设计、检查电路设计参数、实验超调量、阻抗和信号谐波要求等。
二、设计步骤:
1.protel使用:
⑴画原理图:
①选组件:
选出单片机、74HC164、去耦电容、瓷片电容、数码管、稳压管、电解电容、按键。
②电路构造:
三个按键,一个模式键、一个加键、一个减键,分别接入单片机的p1.2、p1.1、p1.0,设置串口发送波特率,RXD送到A、B,TXD送到CP,当做时钟用,其中
74HC164与数码管相连得准确,否则会乱码。
注意,因为购买器件
时,按键是4腿的,所以
画原理图时尽量与实物图
一致,更改按键如右图:
4电路连线:
如图
⑵画版图:
先编号(TOOLS->Annotate…),再生成网标文件(Design->CreateNetlist…),再打开.PCB文件,导入刚生成的网表文件(Design->LoadNets…),再手工布局布线,同时注意规则,如电源线加粗之类的地方,另外在正确连线的基础上,尽量美观。
另外其三维俯视图如下图:
然后送至生产PCB板的厂家生产板子,购买器件,焊接,烧写程序,调试程序,直至完成设计要求。
2.KeiluVision2使用:
⑴新建工程,保存之后并选择相关单片机类型,如下图:
下图选择ATMEL公司的AT89从C51系列单片机类型:
⑵添加文件:
选择Target1->SourceGroup1,右击选择AddFilestoGroup‘SourceGroup1’如图:
⑶程序调试:
程序对
p1.0、
p1.1、p1.2口在reg51.h中定义,否则会出错。
编译结果:
3.Proteus使用:
⑴画原理图:
选器件,51单片机、74HC164、LED、气段数码管、稳压管、电容(因为由于Proteus仿真功能强大,仿真时复位电路不需加,电阻都不用加,但在Proutel中画原理图和PCB都加上用于实际电路焊接,复位时显示11年1月1日,这是编程决定的,在后续程序中提到,这里不赘述。
),先显示下图:
⑵仿真:
添加hww.hex文件到单片机中,并设置成6MHZ,开始运行:
接下来立即就显示11年1号1日:
大概过0.5秒的接下来显示12点整:
下来显示的时分秒就不截图了,截年月日这关键图:
多截图,以提供动态显示的效果:
(当对日先加到3号)
再按减,慢慢减到1号:
但是减到1号后,就不再减,只是闪烁(原因在特别注意中有解释):
再按加,因为当前是1月,加到31号后就为2月1号:
因为11年(不是闰年)的2月份只有28天,故之后就为3月1号:
再调年数,看看闰年的2月份是否是29天:
如上图所示,完全正确;
再调,看看4月份,是否为30天:
如图完全正确;
看看时分秒、年月日进位情况,为了把所有的数码管都用上,故设置成99年12月31号23点59分59秒:
再过一秒就是00年1月1号00点00分00秒:
以上图都说明这些时分秒年月日显示及进位都没问题,证明程序没问题,满足设计要求。
二、程序说明:
⒈定义变量(简要变量):
⑴显示缓冲区unsignedcharDispBuf[6];
⑵结构体变量Time、Calendar,其中成员分别为Hour、Min、Sec和Yea、Mon、Day,用于显示;
⑶标志位
1Flag2、Flag1、Flag0,分别对应p1.0、p1.1、p1.2口的标志位;
2Flag_Time、Flag_Calendar对应用于显示时分秒还是年月日;
3Flash_flag、DisPlay_Back对应闪烁显示和缓冲区备份
4LEDCode[]、ErrorLEDCode[]分别对应正确和错误版图的要显示的十个数0到9;
⒉定义函数(简单函数):
⑴初始化函数:
voidIni(void)
{Calendar.Yea=11;
Calendar.Mon=01;
Calendar.Day=01;
Time.Hour=12;
Time.Min=0;
Time.Sec=0;
TMOD=0x01;
TH0=(65536-25000)/256;
TL0=(65536-25000)%256;
TR0=1;
ET0=1;
EA=1;}
⑵显示函数()
voidDisPlayBuf(void)
{unsignedchari;
for(i=0;i<6;i++)
{
SBUF=DispBuf[i];
while(TI==0);//等待发送完毕
TI=0;//把发送完标志清掉以备下次再用
};
}
⑶时分秒转换显示函数
voidChangeToDispCode_Time(void)
{DispBuf[0]=LEDCode[Time.Hour/10];DispBuf[1]=LEDCode[Time.Hour%10];DispBuf[2]=LEDCode[Time.Min/10];DispBuf[3]=LEDCode[Time.Min%10];DispBuf[4]=ErrorLEDCode[Time.Sec/10];DispBuf[5]=LEDCode[Time.Sec%10];
}
⑷年月日转换显示函数
void
ChangeToDispCode_Calendar(void)
{DispBuf[0]=LEDCode[Calendar.Yea/10];DispBuf[1]=LEDCode[Calendar.Yea%10];DispBuf[2]=LEDCode[Calendar.Mon/10];DispBuf[3]=LEDCode[Calendar.Mon%10];DispBuf[4]=ErrorLEDCode[Calendar.Day/10];DispBuf[5]=LEDCode[Calendar.Day%10];}
⑸年月日显示函数:
说明:
不管闰年还是不闰年也好,1、3、5、7、8、10、12月份都是31天,而4、6、9、11都是30天,用switch语句多路分支,只有2月份当闰年时是29天,否则为28天,这时候要进行判断;
voidtest_calendar(void)
{switch(Calendar.Mon)
{case1:
case3:
case5:
case7:
case8:
case10:
case12:
{if(Calendar.Day>=31)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=30)
{Calendar.Day++;}
}break;
case2:
{
if(((Calendar.Yea+2000)%4)==0)
{if(Calendar.Day>=29)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=28)
{Calendar.Day++;}
}
else
{if(Calendar.Day>=28)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=27)
{Calendar.Day++;}
}
}break;
case4:
case6:
case9:
case11:
{if(Calendar.Day>=30)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=29)
{Calendar.Day++;}
}break;
}
if(Calendar.Mon>=13)
{Calendar.Mon=1;
Calendar.Yea++;};
}
⒊特别说明:
⑴调表时只有机械地加减,并不考虑进位和借位;
⑵在显示年月日时,四个LED灯均不亮,以便和时分秒区分;
⑶按加减时,只需要按一下即可实现调多下的功能(因为按键毕竟灵活有限,这样每秒增或减即人性化又科学化,又方便简单)
⑷每个数码管发生变化时(肉眼看到的表面现象)只在每半秒跳动,这样肉眼很容易分别,看起来也美观大方,不别扭;
⑸跳表时,对时分秒调时,加减情况只与对应的管有关联,故需对其他位管调时,再按一下增或减;
⑹没有按键按下时,故显示时分秒,当模式键按一下对秒(同时可以按下其它两键进行调表)操作,再按一下是分,下一次是时,再按一下就显示年月日,再按模式键就对日(同时可以按下其它两键进行调表)操作,再按一下是月,下一次是年,最后一次就回到显示时分秒;各位都正常进位,完全正确;
⑺本程序年只能显示两位,故最多只能显示0到99,默认为2000年到2099年,根据闰年规则,能被100或400整除的,或者是不能被100整除,但能被4整除的也是闰年,其2月份是28天,不是闰年就是29天,这些由(Proteus)上图来示意演示;
⑻调年月日时,减操作(对日)能减,但当减到1号时,号就不再减,只是闪烁(这由内部函数test_calendar()加加,而到调表函数case5中是减减,故不能实现减,只能闪烁)而加操作可以使号数增加,还可以使月增加,甚至年增加;
三、程序清单:
#include
#include
unsignedcharDispBuf[6];//显示缓冲区
struct//设定时间结构体
{unsignedcharHour;
unsignedcharMin;
unsignedcharSec;
}Time;
struct//设定时间结构体
{unsignedcharYea;
unsignedcharMon;
unsignedcharDay;
}Calendar;
unsignedcharpoint=0;
unsignedcharFlag0=0;
unsignedcharFlag_Time=0;
unsignedcharFlag_Calendar=0;
unsignedcharFlag1=0;
unsignedcharFlag2=0;
unsignedcharT0_Int_Times=0;//中断次数计数变量
unsignedcharFlash_flag=0;//闪烁标志,每半秒闪烁
unsignedcharDisPlay_Back=0;//显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致
codeunsignedcharLEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,
0xc1,0x00,0x80,0xff};//数码管显示代码
codeunsignedcharErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,
0x88,0x08,0xc1,0x00,0x80};//绘制错误图纸的数码管显示代码
//******************************************
//年月日显示函数
//*******************************************
voidtest_calendar(void)
{
switch(Calendar.Mon)
{case1:
case3:
case5:
case7:
case8:
case10:
case12:
{if(Calendar.Day>=31)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=30)
{Calendar.Day++;}
}break;
case2:
{
if(((Calendar.Yea+2000)%4)==0)
{if(Calendar.Day>=29)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=28)
{Calendar.Day++;}
}
else
{if(Calendar.Day>=28)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=27)
{Calendar.Day++;}
}
}break;
case4:
case6:
case9:
case11:
{if(Calendar.Day>=30)
{Calendar.Day=1;
Calendar.Mon++;}
elseif(Calendar.Day<=29)
{Calendar.Day++;}
}break;
}
if(Calendar.Mon>=13)
{Calendar.Mon=1;
Calendar.Yea++;};}
//*******************************************//***************************************************
//Ini初始化代码
//设定50ms中断一次,注:
在Fosc=6MHZ情况下
//****************************************************
voidIni(void)
{
T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)