智能仪器计算器的设计.docx
- 文档编号:10646655
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:19
- 大小:152.91KB
智能仪器计算器的设计.docx
《智能仪器计算器的设计.docx》由会员分享,可在线阅读,更多相关《智能仪器计算器的设计.docx(19页珍藏版)》请在冰豆网上搜索。
智能仪器计算器的设计
单片机课程设计报告书
课题名称
智能仪器设计(简易计算器)
姓名
***
学号
******
院系
通信与电子工程学院
专业
电子信息工程
指导教师
***
2012年6月18日
设计任务及要求:
设计任务:
(1)熟悉Proteus仿真软件,掌握单片机原理图的绘图方法。
(2)学习汇编语言的编程与调试的方法。
(3)理解Proteus与Keil联合的仿真原理。
(4)掌握8051系统中,扩展输入(键盘)及显示接口的方法。
设计要求:
设计接口电路,将这些外设构成一个简单的单片机应用系统,画出接口的连接图和仿真图,并编写出控制四则运算的程序
指导教师签名:
2012年05月28日
二、指导教师评语:
指导教师签名:
2012年6月26日
三、成绩
验收盖章
2012年6月26日
基于单片机的智能仪器电路设计
刘秉海
(湖南城市学院通信与电子工程学院电子信息工程专业,益阳,413002)
1设计目的
1.熟悉Proteus仿真软件,掌握单片机原理图的绘图方法。
2.学习汇编语言的编程与调试的方法。
3.理解Proteus与Keil联合的仿真原理。
4.掌握8051系统中,扩展输入(键盘)及显示接口的方法。
2设计的主要内容和要求
2.1 设计内容
以单片机为基础,设计并一个简易计算器,它的结构非常简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
2.2 设计要求
设计接口电路,将这些外设构成一个简单的单片机应用系统,画出接口的连接图和仿真图,并编写出实现计算器控制的c语言程序代码。
3整体设计方案
3.1系统总体结构框图设计
图3-1系统主结构框图
.3.2硬件设计电路的元件清单
器件名称
数量
AT89C51
1
按键
17
74LS08
1
10K电阻
9
电容22uF
1
LCD1602
1
晶振12MHz
1
电容30pF
2
5K电位器
1
图3-2元件清单列表
4硬件电路的设计
经分析,计算器电路包括三个部分:
显示电路、4*4键扫描电路、单片
机微控制电路。
具体如下:
.4.1LCD显示电路
LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类
型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。
又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.
图4-1LCD显示电路
.4.24*4键盘扫描电路(中断式,扫描式,反转式)
用户设计行列键盘接口,一般常采用3种方法读取键值。
一种是中断式,外两种是扫描法和反转法。
中断式:
在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地
址读取数据线上的状态,判断哪个案件被按下。
本实验采用中断式实现用户键盘接口。
扫描法:
对键盘上的某一行送低电平,其他行为高电平,然后读取列值。
若列值中有一
位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。
反转法:
先将所有行扫描线输出低电平,读列值。
若列值有一位是低,则表明有键按下,读列值;然后所有列扫描线输出低电平,再读行值。
根据读到的值组合就可以查表1得到的键码。
这个就仁者见仁智者见智了,不过如果熟悉了扫描式,建议果断升级自己的硬件(很简单加个74LS08与门),故采用节省CPU的中断式扫描电路。
图4-24*4键盘扫描电路
4.3复位电路设计
单片机的复位是靠外电路实现的,在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便实现初始化状态复位。
为了保证应用系统可靠地复位,通常是RST引脚保持10ms以上的高电平。
复位电路连接如图3-2所示。
此电路仅用一个电容及一个电阻。
系统上电时,在RC电路充电过程中,由于电容两端电压不能跳变,故使RESET端电平呈高电位,系统复位。
经过一段时间,电容充电,使RESET端呈低电位,复位结束。
图4-3复位电路
4.4时钟电路设计
8XX51系列单片机工作时必须要有个时钟脉冲,有两种方法可以向80C51提供时钟脉冲:
第一:
外部时钟方式。
图4-4晶振电路
第二:
内部时钟方式。
使用晶振利用80C51内部电路产生时钟脉冲如上图。
实验中使用这种方式。
80C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器
外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性。
如果使用石英晶体,我们推荐使用30pF+/-10pF,而如使用陶瓷谐振器建议选择40pF+/-10PF。
4.5中断控制电路
图4-5按键中断实现
工作原理如下:
1.当没有按键按下时,INT0端口保持高电平,中断不触发,当有任何一个按键按下时通过74ls08(双输入与非门),最终实现INT0变成低电平。
从而触发中断,进而执行中断服务程序。
2.进入中断服务程序后,系统执行键盘扫描程序,来识别究竟是哪个按键按下。
然后根据识别的按键来进入相关的处理函数。
5软件设计
本程序组成可分为3个模块:
矩阵键盘模块,LCD显示模块,和运算模块(源程序见底页)
程序设计流程框图如下图5-1所示:
6系统仿真
6.1系统仿真环境
在Proteus的ISIS7.1sp2软件环境下画出电路原理图,接下来就是将设计的程序在KeilC51μVision2开发集成环境上编译成机器语言,进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“useromotedebugermonitor”,便可实现KeilC与Proteus连接调试。
首先在Proteus中双击单片机AT89C51,将KeilC下编程生成的.HEX文件导入到80C51中,可在Proteus中单击全速仿真运行按钮
,进行现象的查看,能清楚地观察到芯片上每一个引脚的电平变化,红色代表高电平,蓝色代表低电平;如果现象不正确,则在KeilC中单步调试程序,并在Proteus观察现象,那一步不正确则对该段的程序进行修改,调试直到仿真完全成功为止。
6.2器件参数选取与仿真
单片机采用80C51,时钟频率为12MHz。
时钟产生电路的晶振为12MHz,接地电容为22pF。
复位电路的电解电容为22pF,接地的电阻为1K。
系统的仿真原理图如图6.1所示,该仿真验证的过程为,首先按开始按
,然后控制开关即可进行简单的加减乘除。
图6-1系统的仿真原理图
按下4*4矩阵按键,通过输入的数据进行简单的四则运算。
仿真结果如下所示:
图6-2简单加法运算
图6-3简单减法运算
图6-4简单乘法运算
图6-5简单除法运算
7设计总结
很明显我的计算器处理数据及显示存在太大的局限性,首先我的计算器只能准确进行得数为0~9的四则运算;其次计算精度为1不能显示小数部分;每次只能做一次运算,运算后要复位才能进行新的运算;总之还有很多令人不满意的地方需要改进。
我觉得主要还是我对程序中的运算模块理解不深,这点仍需大大加强。
课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题的能力。
通过这次单片机课程设计,使我们对单片机的结构、基本工作原理、单片机应用系统开发有了进一步的了解,特别是在硬件设计和软件编程方面有了很大提高。
函数信号发生器的硬件设计电路简单,但对各芯片的性能及工作原理不是很熟悉;软件设计并不太复杂,但需要搞清其工作原理,时序。
在设计的过程中,通过请教老师和同学,上网或上图书馆查资料将这些问题解决。
这样不仅巩固了以前所学过的知识,加深了我对所学知识的理解,而且学到了很多在书本上未涉及的知识,锻炼了搜集有用信息的能力。
软件编程过程中,由于采用C语言编程,以前虽然有过接触,但并不是很熟练,所以参考了别人的设计思路,琢磨研究弄懂后,又试着修改程序。
在不满足要求时反复思考,研究错误出在哪里,经过不懈努力,最终找出错误所在,满足了基本的设计要求。
在编译仿真时对软件KeivuVision4.0和Proteus认识更多,发现了Proteus的很多优点,同时也发现它的不足之处,过于理想化,如果完全依赖,则硬件有可能无法工作。
总的来说,这次课程让我们收获很大。
参考文献
[1]林立,张俊亮,曹旭东,刘得军,基于Proteus和KeilC弹片机的原理和应用,2011,07(4):
48-64。
[2]雷发禹,宾淼林,李永枧,等.基于单片机的信号发生器设计与仿真.邵阳学院学报(自然科学版),2009,6(3):
39-43
[3]谭浩强著.C语言程序设计.清华大学出版社.2005.7
[4]李建忠.单片机原理及应用[M].西安:
西安电子科技大学出版,2002:
63-78.
附录1:
源程序代码
下面是源代码:
#include
#defineCLEARSCREENLCD_write_command(0x01)
#defineuintunsignedint
#defineucharunsignedchar
/**************定义接口************************/
#defineLCDIOP0
#defineKEYBOARDP1//保留
sbitLCD1602_RS=P2^0;
sbitLCD1602_RW=P2^1;
sbitLCD1602_EN=P2^2;
/************************************************/
codeucharmayuan[16]={'0','1','2','3','4','5','6','7','8','9','0','/','*','-','+','='};//不错,这个比较明了
unsignedcharcodekeycode[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,
0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};//键盘编码值()
inti,j,k=1,s;//
intt,t1,t2,a[];//
voiddelay(uchar);//延时
/**************定义函数************************/
voidLCD_init(void);//初始化函数
voiddelay_nms(unsignedintn);//延时函数
voidLCD_write_command(unsignedcharcommand);//写入指令函数
voidLCD_write_dat(unsignedchardat);//写入数据函数
voiddelay_10ms();
initial();
ucharkeyscan();//键盘扫描函数
calc(uchar);//计算函数
ucharnum,temp,key,keynum;
voidmain()//主函数
{
LCD_init();
delay_nms(100);
while
(1)
{
initial();//有中断
KEYBOARD=0xf0;//键盘的列值全置高电平
}
}
/**********************************开中断***************************************/
initial()
{
EA=1;//总开关
EX0=1;//中断方式0开启
IT0=0;
}
/*******************************************************************************/
/*********************************中断函数************************************/
voidinter0()interrupt0
{
unsignedcharn;
delay_10ms();//延时
if(INT0==0)//没键按下
{
EX0=0;//关中断
n=keyscan();
calc(n);
EX0=1;//开中断
KEYBOARD=0xf0;//键盘的列值全置高电平
}
}
/************************************************************************/
calc(ucharn)
{
if(n<10)//键值小于10
{
t1=t1*10+n;
LCD_write_command(0x00);//写命令语句
LCD_write_dat(mayuan[n]);//写数据函数
}
else
{
if(n==10){LCD_init();t1=0;t2=0,t=0;k=1;}
else{
if(n<15){
t2=t1;t1=0;j=n;
LCD_write_command(0x00);
LCD_write_dat(mayuan[n]);}
else{
LCD_write_command(0x00);
LCD_write_dat(mayuan[n]);
switch(j){
case11:
t=t2/t1;
break;
case12:
t=t2*t1;
break;
case13:
t=t2-t1;
break;
case14:
t=t2+t1;
break;
}
if(t<=9){LCD_write_command(0x00);
LCD_write_dat(t+48);}
if(t>9)
{
while(t>9)
{
s=t%10;
t=t/10;
a[k]=s;
k++;
}
if(t<=9){
LCD_write_command(0x00);
LCD_write_dat(t+48);}
for(i=k-1;i>=1;i--)
{
LCD_write_command(0x00);
LCD_write_dat(a[i]+48);
}
}
}
}
}
}
/*****************************************键盘扫描函数************************************/
ucharkeyscan()//键盘扫描
{
KEYBOARD=0xf0;//键盘的列值全置高电平
delay_10ms();//延时
if(KEYBOARD!
=0xf0)//有键按下
{
temp=KEYBOARD;//保存键盘此刻的键植
delay_10ms();//延时
if(KEYBOARD==temp)//再次确认键盘是否被按下
{
uchari;
KEYBOARD=0x0f;//键盘的行值全置高电平
delay_10ms();//10MS时间延时
keynum=temp|KEYBOARD;//保存键盘的行值
while(KEYBOARD!
=0x0f);//松手检测
for(i=0;i<16;i++)
if(keycode[i]==~keynum)
return(i);
}
}
return-1;
}
/******************************************************************************/
/**********延时**********************/
voiddelay_nms(unsignedintn)
{
unsignedinti=0,j=0;
for(i=n;i>0;i--)
for(j=0;j<10;j++);
}
voiddelay_10ms()//10MS延时
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<120;j++);
}
/**************************************/
/**************写指令函数********************************/
voidLCD_write_command(unsignedcharcommand)
{
LCDIO=command;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_EN=0;
LCD1602_EN=1;
delay_nms(10);
}
/***************************************************/
/****************写数据函数************************/
voidLCD_write_dat(unsignedchardat)
{
LCDIO=dat;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_EN=0;
delay_nms
(1);
LCD1602_EN=1;
}
/****************************************************/
/************初始化函数****************/
voidLCD_init(void)
{
CLEARSCREEN;//clearscreen
LCD_write_command(0x38);//set8bitdatatransmissionmode
LCD_write_command(0x0c);//opendisplay(enablelcddisplay)
LCD_write_command(0x80);//setlcdfirstdisplayaddress
CLEARSCREEN;//clearscreen
}
/****************************************************/
附2:
系统原理图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 仪器 计算器 设计