课程设计课程:Proteus
学生XX:
学生学号:
院系:电气信息工程学院
专业:电子信息科学与技术班级:09电技(2)班
任课教师:
《Proteus》课程设计报告
学生XX:学号:
一、设计任务内容
如下列框图,当按下K1时,显示器显示模拟信号V1的测量值;当按下K2时,显示器显示模拟信号V2的测量值。信号源可以采用传感器或信号发生器产生。结合Proteus完成:
1、设计的硬件电路图;
2、软件操作流程图;
3、运行的结果界面抓图;
4、附设计的程序代码。
二、设计分析
此设计将Proteus软件和Keil软件结合设计仿真线路和程序,将连续的模拟电压信号经过A/D转换器转换成二进制数值,再经由单片机软件编程转换成十进制数值并通过显示屏显示。此设计采用2个开关进行控制,通过按键来选择显示哪一路数据。本实验采用AT89C51单片机,A/D转换用ADC0808,显示部分使用7SEG-MPX4-CA-BLUE。
主程序主要负责初始化工作:设置定时器、寄存器的初值,启动A/D转换,读取转换结果,处理量程转换响应,控制液晶显示等
A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。当系统设置好后,单片机扫描转换结束管脚P1.7的输入电平状态,当输入为高电平则转换完成,将转换的数值转换并显示输出。若输入为低电平,则继续扫描。
三、总体设计
1.A/D转换
ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。
ADC0808芯片有28条引脚,采用双列直插式封装,如下图所示。各引脚功能如下:1~5和26~28(IN0~IN7):8路模拟量输入端。
8、14、15和17~21:8位数字量输出端。
22(ALE):地址锁存允许信号,输入,高电平有效。
6(START):A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
7(EOC):A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
10(CLK):时钟脉冲输入端。要求时钟频率不高于640KHZ。
12(VREF(+))和16(VREF(-)):参考电压输入端
11(Vcc):主电源输入端。
13(GND):地。
23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路
ADC0808 AT89C51
2.AT89C51单片机
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。其外形及引脚排列如上图所示
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电
流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH 地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
3.7SEG-MPX4-CA-BLUE数码管。
LED数码管实际上是由4个七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。
四.详细设计
1.硬件设计
(1).打开PROTEUS软件,在编辑窗口中单击元件列表上的“P”按钮,添加如下图所示的元
(2).放置好元件后就开始布线。
1.绘制总线的步骤如下“
①将光标靠近一个对象引脚末端,单击左键。
②拖动鼠标,在合适位置双击鼠标左键,画出一条直线。
③如果该线为单线,要设置为总线时,先选中该线。右击鼠标,弹出菜单,选择“Edit Wire Style”项,再在弹出的对话框的“Global Style”下拉列表中选择“BUS WIRE”。
2.绘制总线分支线的步骤如下:
①将光标靠近一个对象引脚末端,单击左键。
①拖动鼠标,在靠近总线合适位置双击鼠标左键,画出一条直线。
③将光标靠近该直线末端,单击左键。
④拖动鼠标,同时按住Ctrl键,单击鼠标左键,就画好一条分支线。
2.系统软件设计
(1).系统流程设计
主程序流程图A/D转换流程
(2).打开Keil uVision4软件,执行菜单命令“project”-“new project”创建“陈露”项目,并选择单片机型号“Atmel”->“AT89C51”
2.执行菜单命令“File”-“new”创建文件,输入C语言程序,保存为“陈露.C”。
(3).在project栏的File项目管理窗口右击文件组,选择“Add Files To Source Group1”,将源程序“陈露.c”添加到项目中。
(4).执行菜单命令“project”-“Options For Target target1”,在弹出的对话框中选择“output”选项卡,选中“Create HEX File”。
(5).执行菜单命令“project”-“Build Target”,编译源程序,编译成功,在“Output Window”窗口中显示无误,并创建了hex文件。
3.调试与仿真
(1)在Proteus ISIS 编辑窗口中单击鼠标右键将AT89C51单片机选中并单击鼠标左键,弹出“Edit ponent”对话框,在此对话框的“Clock Frequency”栏中设置单片机晶振频率为12MHZ,在“Program File”栏中选择先前用Keil uVision生成的“陈露.HEX”文件。
(2)在Proteus ISIS编辑窗口的“File”菜单中选择“Save Design”选项,保存设计,生成“陈露.DSN”文件。
(3)在Proteus ISIS编辑窗口中“Debug”菜单中选择运行,可看见运行过程。
按下切换按钮后,接通另一模拟信号,显示器显示数值改变。
五、实验与体会
通过此次的课程设计,我认真的看了很多方面关于Proteus仿真和单片机中断方面的书,深深的体会到实践才是硬道理。这次课程设计我最大的收获是培养了自己独立思考的能力,同时也认识到自己的不足,自己的理论知识还是太少,在以后的学习中我应多看书多学习让自己在学识方面更加的充实。
做出一个设计,首先要想好你所做的设计能完成什么任务,需要哪些模块,构思一个大致的硬件图,不断筛选出合适的元器件,最后进行连线和修改。然后用C语言编写程序,生导入Keil软件生成hex文件,最终将Keil软件与Proteus软件联合调试,不断修正错误直至达到预期效果。
在调试的过程中遇到很多问题,比如接线错误,开关接反等等问题,但经过细心排查最终解决了问题,调试成功。
六、参考文献
《基于Proteus的51系列单片机设计与仿真》电子工业
《C语言程序设计》高等教育第三版
以及网络资料
七、附录
C语言程序:
#include
sbit EOC=P1^0;
sbit START=P1^1;
sbit con=P1^2;
sbit bu=P1^7;
bit CH_flag=1;
sbit we1=P1^3;
sbit we2=P1^4;
sbit we3=P1^5;
sbit we4=P1^6;
int date,ge,f1,f2;
unsigned char code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}; void display(void);//显示函数
void delay(int k);
main()
{
float temp;
bu=1;
P0=0xff;
we1=0;
we2=0;
we3=0;
we3=0;
P3=~tab[0];
P2=0x00;
while(1)
{
if(!bu)
{
CH_flag=~CH_flag;
while(!bu);
if(CH_flag)
P2=0x00;
else
P2=0x01;
}
if(!EOC)//如果EOC为低电屏,则产生一个脉冲,这个脉冲的下降沿用于启动AD转换{
START=1;
START=0;
}
while(!EOC);
START=1;
date=P0;
temp=((float)date)/51;
START=0;
ge=((int)(temp*1))%10;
f1=((int)(temp*10))%10;
f2=((int)(temp*100))%10;
display();
}
}void display(void)
{
we2=1;
P3=~(tab[ge]|0x80);
delay(1);
we2=0;
we3=1;
P3=~tab[f1];
delay(1);
we3=0;
we4=1;
P3=~tab[f2];
delay(1);
we4=0;
}
void delay(int k)
{
int i,j;
for(i=1;i<100;i++)
for(j=1;j }