1、摘 要单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,他已广泛的应用到我们生活中的各个领域,电子、科技、通信、汽车、工业等。我们这次设计的个人所得税计算器也是利用AT89C52单片机制作而成的。该计算器设计师采用C语言编写,实现了个人所得税的运算,比较实用和方便。该设计电路是采用AT89C52单片机为主要控制电路,然后使用8255驱动电路驱动六位LED数码管现实数据,利用44矩阵键盘完成电路的实际操作,电路比较简单,但是很使用方便。关键词:单片机;个人所得税计算器;STC89C52;中断;8255;Display数码管显示;键盘扫描目 录设计要求11 方案论证与对比
2、11.1 数码管显示方案一11.2 数码管显示方案二12 单元电路设计与计算22.1 电源部分的设计22.2 复位电路的设计22.3 数码管显示电路32.4 键盘控制电路设计33 系统程序设计43.1 主程序设计43.2 LED显示程序设计54 调试及性能分析74.1硬件调试74.2软件调试74.3性能分析75详细仪器清单86总结与思考97 致谢10参考文献11附录一:简易计数器的PCB板12附录二:程序13个人所得税计算器设计要求利用单片机作为控制核心,设计出个人所得税计算器,具有以下功能: (1)具有计算个人所得税功能;(2)从键盘输入数值并显示数值,数值范围在099999;(3)当按下等
3、号键时输出并显示结果;(4)当按下复位按钮数码管清零。1 方案论证与对比数码管显示是本设计主要的部分。根据需要,可采用两种方案实现,即静态显示法和动态显示法。1.1 数码管显示方案一方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。1.2 数码管显示方案二方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显
4、示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也与点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。由于静态现实法需要数据锁存器等硬件,接口复杂一些,又考虑到时钟显示只有5位,且系统没有其他的处理任务;并且从节省I/O口和降低能耗出发,所以决定采用动态扫描法实现LED的显示,即采用方案二。12 单元电路设计与计算2.1 电源部分的设计电源电路包括变压器、桥式整流器、电容和稳压器。通过变压器变压,使得220V电压变为5V,在通过桥式整流,电容的滤波作用,稳压器的稳压作用,可输出5V的稳定电压。如图1所示,从外部引入5V
5、的直流电,位单片机、复位电路提供电源。 图 1 +5v电源模块电路图2.2 复位电路的设计为了初始化单片机内部的某些特殊功能寄存器,必须采用复位的方式,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。单片机的复位是靠外电路来实现的,复位操作有两种情况,即上电复位和手动(开关)复位。本系统采用上电复位方式。上电复位:上电复位电路时一种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电而回落,所以RST引脚复位的高电平维持时间
6、取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够才的时间。上电自动复位是通过外部复位电路的电容充电来实现的。只要VCC的上升时间不超过1ms,就可以实现自动上电复位。如下图2: 图2 复位电路2.3 数码管显示电路数码管显示器成本低,配置灵活,与单片机接口简单,在单片机应用系统中广泛应用。数码管工作原理:数码管是由8个发光二极管构成的显示器件。在数码管中,若将二极管的阳极连在一起,称为共阳极数码管:若将二极管的阴极连在一起,称为共阴极数码管。我们单片机板上的5个数码管均是共阳极的。当发光二极管导通时,它就会发光。每个二极管就是一个笔划,若干个二极管发光时,就
7、构成了一个显示字符。将单片机的I/O口控制相应的芯片与数码管的a-g相连,高电平的位对应的发光二极管亮,这样,由I/O口输出不同的代码,就可以控制数码管显示不同的字符。本文的4个数码管均采用动态显示方式,显示当前的时间1。数码管显示电路如下图3所示: 图 2 数码管显示电路2.4 键盘控制电路设计该设计需要显示按键输入和结果输出,当按下数值马上显示,按下等号输出计算结果,当按下复位按钮计算器清零。按键的开关状态通过一定的电路转换为高、低电平状态。按键闭合过程在相应的I/O端口形成一个负脉冲。闭合和释放过程都要经过一定的过程才能到达稳定,这一过程是出于高、低电平的一种不稳定状态,称为抖动。抖动的
8、持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。很容易想到,抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms,而抖动问题不解决就会引起对闭合键的识别。用软件方法可以很容易地解决抖动问题,通过延迟10ms。 图4是键盘控制电路,利用MCS-51单片机接口构成4*4的键盘。图4 键盘控制电路图3 系统程序设计3.1 主程序设计主程序首先进行初始化, 设定一些变量及其意义,扫描键盘,当输入有099999数字时,通过键盘的扫描程序, 将数值赋给MONEY并在显示器上来,当按下等号时,跳到运算部分,通过判断MONEY的值,进行不同的运算,应纳个人所得税税额=(应纳税所得额-扣
9、除标准)*适用税率-速算扣除数。不超过1500元的,税率3%,速算扣除数为0; 超过1500元至4500元的部分,税率10%,速算扣除数为105; 超过4500元至9000元的部分,税率20%,速算扣除数为555;超过9000元至35000元的部分,税率25%,速算扣除数为1005; 超过35000元至55000元的部分,税率30%,速算扣除数为2755;超过55000元至80000元的部分,税率35%,速算扣除数为5505;超过80000元至99999元的部分,税率45%,速算扣除数为13505。输出并显示结果到数码管上。 3.2 LED显示程序设计LED显示器由七段发光二极管组成,排列成8
10、字形状,因此也成为七段LED显示器,器排列形状如下图所示:图5 七段LED显示器为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阴极字形代码如下表:表格1 09八段数码管共阴级字形代码显示字型gcdpdebfa段码010100000a0h110111011bbh20110001062h3001010102ah40011100139h5001010112ch60010010024h710111010bah80010000020h90010100028h6位LED显示的程序流
11、程图如下: 图6 LED显示流程图4 调试及性能分析4.1 硬件调试硬件调试时可以检查印制板及焊接的质量情况,在检查无误的后可通点检查LED显示器的点亮状况。若亮度不理想,可以调整P0口的电阻大小,一般情况下取200电阻即可获得满意的亮度效果。实验室制作时,可结合示波器测试晶振及P0、P2端口的波形情况进行综合硬件测试分析。4.2 软件调试根据上述需求分析得出的思路,进行C语言程序的编写。C语言程序一共分为三个部分:第一部分是STC89C52 芯片的初始化;第二部分是8255 可编程计数芯片的初始化;第三部分是,模块的编写。在该电子跑表的设计过程中一共有两个模块:1运算模块、2数码管显示模块、
12、3键盘扫描模块。软件调试在Wave或Keil C51编译器下进行,源程序编译及仿真调试应分段或以子程序为单元逐个进行,最后可结合硬件实时调试。4.3 性能分析设计之初的思路是选择个人所得税区间分化分放在一个内存中,通过查表的方法去的各区间的运算方式,这样在计算个人所得税计算器的设计上将变得简单。由键盘输入可以实现099999的个人所得税的计算,按等号可以显示输出结果,输入时符合输入习惯,键盘排布如图6所示,没有再发现漏洞。发现的问题如何知道之前键入的字符,以便处理当前键入字符,加入标记就能通过查看标记值得知之前键入字符。长按会连续送数 ,加一条命令while(P3&0xf0)!=0xf0);可
13、等待按键放开后才继续。左移命令的问题,查书后明白左移后末位补的是0,而要补的是1。所以要加一条或命令。+-+ | 7 | 8 | 9 | | | 4 | 5 | 6 | | | 1 | 2 | 3 | | | 0 | | | =| +-+ 图 7 键盘排布 5 详细仪器清单表格 1器件清单仪器名称数量STC89C521个LED数码管5个8255并口1个按键SW-SPST16个三极管90155个电容1044个 DS1302芯片1个电池1个30PF电容4个晶振XTAL1个 电源USB接口1个发光二极管1个12M晶振1个电阻2k2个电阻1k20个6 总结与思考我们在这次个人所得税计算器的课程设计中受
14、益匪浅。通过对自己这一学期来所学知识的回顾,并充分发挥对所学知识的理解和对课程设计的思考及书面表达能力,最终完成了。这对自己今后进一步深化学习,积累了一定宝贵的经验。撰写论文的过程也是专业知识的学习过程,同时强化了自己的动手能力,对PCB软件,作图软件,仿真等软件更加熟练。对程序和硬件电路的调试也有了很大的提高。它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。让我们知道了理论和实际的距离,也知道了理论和实际相结合的重要性。由于接触单片机课程的时间尚短,专业知识还不扎实,在编写程序时难免受阻,要常翻阅课本查阅资料,进度较慢。并且有时程序写
15、错,程序有不完整的现象,无法达到预定结果,需重新调整写过。通过自己分析,查阅资料,向老师与同学请教,与同组的同学们一起推敲,再推敲,共同解决问题。7 致谢首先感谢我的论文指导老师方老师和姚老师,我们的论文是在他们的悉心指导下完成的,方老师严谨细致、一丝不苟的作风一直是我工作生活的榜样,他们循循善诱的教导和不拘一格的思路给予我们无尽的启迪。在这次课程设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解,在此我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! 参考文献1 李朝青.单片机原理及接口技术(第3版). 北京航空航天大学出版社.2006 2 田立 田青 代
16、万震.51单片机C设计快速入门 .人民邮电出版社.20073 楼然苗 李光飞.51单片机设计实例.北京航空航天大学出版社.20044 王守中51单片机开发入门与典型实例. 人民邮电出版社.2007 附录一:简易计数器的PCB板 图9 简易计算器PCB原理图附录二:程序 #include #define uchar unsigned char#define uint unsigned int#define udouble unsigned double#define START 0X0F uchar xdata PA _at_ 0xD9FF, PB _at_ 0XDBFF, PC _at_ 0X
17、DDFF,/定义外部变量,强制分配地址EX_PORT_CON _at_ 0XDFFF;uchar data DISPLAY_BUF6;uchar code LED_CODE=0XA0,0XBB,0X62,0X2A,0X39,0X2C,0X24,0XBA,/LED段码(09) 0X20,0X28; uint code KOUCHU_TAB=13505,5505,2755,1005,555,105,0;unsigned long code REF_TAB=80000,55000,35000,9000,4500,1500,0;double sui_TAB=0.45,0.35,0.30,0.25,0.
18、20,0.10,0.03;unsigned long int MONEY=0;uchar PLACE=0,KEY,TEMP;bit KEY_DIS=0;uchar Key_Scan(); void Display();void Delay(uint A);void Calculate();void main() uchar KEY;EX_PORT_CON=0X81;PA=PB=0XFF;while(1)KEY=Key_Scan();Display();if(KEY=START)Calculate();KEY_DIS=1;while(Key_Scan()!=START)Display();KEY
19、_DIS=0;MONEY=0;PLACE=0;void Display()uchar A;unsigned long B=10000;for(A=0x02;A=0X20;A=1) if(MONEY/B)|(A=0X20) /当前位(从高到低)第一次不为零则开始显示Delay(150); PA=PB=0XFF; /消影PB=LED_CODE(MONEY%(B*10)/(B);PA=A;B/=10; void Delay(uint A)while(A-);uchar Key_Scan()uchar A=4,ROW=0x08,T=0XFF;if(PC!=0XF0) /是否有键按下Delay(300); /消抖 if(PC!=0XF0)while(A-) /查询,逐列ROW3500)MONEY-=3500; for(I=0;I+) if(MONEYREF_TABI)break; MONEY=(MONEY)*sui_TABI)-KOUCHU_TABI; elseMONEY=0;16