硬件课程设计报告剖析(3)

2019-06-02 16:07

图5.2 计算器总程序框图

11

结果分析:对比运算结果和实际结果可知,进行一般的整形运算计算器能准确无误计算出来,但是当进行浮点运算时候,会产生精度丢失或者是有尾数产生,这是因为8051单片机对的浮点运算功能差,而且在keil开发环境中,float型和double型浮点数的精度都是一样的,其小数点的有效数字位数都是6~7位,这就决定了本设计的计算器的浮点数精度有限,只能通过小数点补偿来减少浮点数运算误差。另外,由连续运算、新一轮运算测试、错误提示测试的结果以及运算过程中的AC清零、声音开关设置可见,本设计的计算器的功能基本能实现。 但是,由实际操作可发现本设计存在以下不足:

(1)某些按键不够灵敏,导致需要按很多次才能输入;

(2)当运算式子超过屏幕范围时,不能通过移动屏幕来完全显示式子;

(3)当连续出现错误操作时,如连续输入减号,程序不能自动复位,会产生连续错误;

(4)没有删除输入功能,当输入出错时,只能通过清零后重新输入; (5)没有数据溢出提示功能。

7.体会与总结:

首先,在硬件电路设计方面自己认识到稳定的重要性,学习到电源稳压滤波降噪的方法。在焊接方面,自己学习到各种元件的焊接方法,小元件先焊,大原件后焊,焊一部分检测一部分。只有这样才能避免最后出错检测不出来。

其次,在对于电路板的设计和单片机功能的实现之前,必须要弄清楚电路图的工作原理以及单片机的相关知识。比如说,电路板的各个部件是如何联系在一起的,各个部件的功能又是怎样等。对于单片机来说,我们更应该弄明白单片机的定时器以及外部中断是如何工作的。

最后,在程序的设计阶段,最好先画出程序流程框图。在程序流图框图的帮助下,才能有的放矢,逐步完善编码,实现需要的功能。而且,如果程序出错的话,可以根据程序框图排查错误,这样的效率更高。

总之,这次的硬件课程设计让我认识到自己在硬件、软件方面还有许多的不足,自己还有许多需要提高和学习的地方。

12

附:核心代码

DS1302时钟: \

#include #include\#include\const uchar dula[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x76,0x79,0x38,0x00};

const uchar wela[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};

static uchar TIME_S=0,TIME_M=0,TIME_H=0; //记录上次显示的数据,秒、分、小时

static uchar i=0,j=0,k=0,l=0,m=0,n=0;//记录上次显示的数据

void show_one_led(uchar i,uchar data_8) //显示一位数码管 {

P2=~wela[i];

P0=~dula[data_8]; delayus(100);

P0=0xff; //消隐 }

void show_led(uchar s,uchar min ,uchar h) //显示动态数码管 {

show_one_led(0,s); show_one_led(1,s/10); show_one_led(2,16); show_one_led(3,min); show_one_led(4,min/10); show_one_led(5,16); show_one_led(6,h); show_one_led(7,h/10); }

void show_date(uchar date,uchar month,uchar year) //显示日期函数 {

show_one_led(0,date); show_one_led(1,date/10); show_one_led(2,month); show_one_led(3,month/10); show_one_led(4,year);

13

show_one_led(5,year/10); show_one_led(6,0); show_one_led(7,2); }

void show_week(uchar week) //显示星期函数 {

show_one_led(7,16); show_one_led(6,16); show_one_led(5,16); show_one_led(4,16); show_one_led(3,16); show_one_led(2,16); show_one_led(1,16); show_one_led(0,week); }

“INT.c”

#include //use _nop_() function #include #include\#include\#include\#include\

uchar display_DS1302_count=0; //定义显示的全局计数值,默认为显示时间

static uchar timer_stop_count=0; //定义秒表计数变量,正常时为0,暂停时为1

extern uchar timer_backcounter_choice; //定义秒表还是倒计时选择标志,0:秒表,1:倒计时

extern uchar press_key_count0; //对外部中断0中按键按下的检测,若按键按下了,其值为1

extern uchar press_key_count1; //对外部中断1中按键按下的检测,若按键按下了,其值为1

extern uchar s,min,h;

extern uchar t_s,t_min,t_h; //定义秒表显示变量 extern uchar date,month,year; //定义显示日期变量 extern uchar week;

extern uchar week_count; extern uchar timing_count; extern uchar timing_count1;

extern uchar date_count; //调日期开始时对显示日期进行初始化

uchar timing_s=0,timing_min=0,timing_h=0; //记录定时数据

14

void INT0_INIT() //外部中断0初始化 {

EA=1; //全局中断开启 EX0=1; //外部中断允许

IT0=0; //外部中断0低电平触发 P3|=BIT(2); //将P3.2输出高电平 }

void INT1_INIT() //外部中断1初始化 {

EA=1; //全局中断开启 EX1=1; //外部中断允许

IT1=0; //外部中断1低电平触发 P3|=BIT(3); //将P3.3输出高电平 }

void INT0_server() interrupt 0 //外部中断0服务函数 {

display_DS1302_count++; //模式改变

if(display_DS1302_count==5) display_DS1302_count=0;//超出计数,归零

P3|=BIT(2); }

void INT1_server() interrupt 2 //外部中断1服务函数 {

if(display_DS1302_count==1) //调时模式 {

DS1302Write(0x8e,0x00); //写保护关

DS1302Write(DS1302_SECOND_WRITE,(s/10*16+s)); //写入秒

DS1302Write(DS1302_MINUTE_WRITE,(min/10*16+min)); //写入分钟

DS1302Write(DS1302_HOUR_WRITE,(h/10*16+h)); //写入小时

DS1302Write(0x8e,0x80); //写保护开

display_DS1302_count=0; //正常显示时间 timing_count=0; //将调

15


硬件课程设计报告剖析(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:微积分的思想和方法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: