✅ 操作成功!

税率计算器

发布时间:2023-06-04 作者:admin 来源:文学

税率计算器

税率计算器

-

2023年2月12日发(作者:)

个⼈所得税计算器

单⽚机的出现是计算机制造技术⾼速发展的产物,它是嵌⼊式控制系统的核⼼,如今,他已⼴泛的应⽤到我们⽣活中的各个领

域,电⼦、科技、通信、汽车、⼯业等。我们这次设计的个⼈所得税计算器也是利⽤STC89C52单⽚机制作⽽成的。该计算

器设计师采⽤C语⾔编写,实现了个⼈所得税的运算,⽐较实⽤和⽅便。

该设计电路是采⽤STC89C52单⽚机为主要控制电路,然后使⽤8255驱动电路驱动六位LED数码管现实数据,利⽤4×4矩阵键

盘完成电路的实际操作,电路⽐较简单,但是很使⽤⽅便。

关键词:STC89C52;8255;数码管显⽰;矩阵键盘

设计要求(1)

1⽅案论证与对⽐(1)

1.1数码管显⽰⽅案⼀(1)

1.2数码管显⽰⽅案⼆(2)

2单元电路设计与计算(2)

2.1电源部分的设计(2)

2.2复位电路的设计(3)

2.3键盘控制电路设计(4)

2.4数码管显⽰电路设计(4)

3系统程序设计(5)

3.1主程序设计(5)

3.2LED显⽰程序设计(7)

4调试及性能分析(9)

4.1硬件调试(9)

4.2软件调试(9)

4.3性能分析(9)

5详细仪器清单(10)

6总结与思考(11)

7致谢(12)

参考⽂献(13)

附录⼀:个⼈所得税计算器的PCB板(14)

附录⼆:程序(15)

个⼈所得税计算器

设计要求

利⽤单⽚机作为控制核⼼,设计出个⼈所得税计算器,具有以下功能:(1)具有计算个⼈所得税功能;

(2)从键盘输⼊数值并显⽰数值,数值范围在0~99999;(3)当按下等号键时输出并显⽰结果;(4)当按下复位按钮数

码管清零。

1⽅案论证与对⽐

数码管显⽰是本设计主要的部分。根据需要,可采⽤两种⽅案实现,即静态显⽰法和动态显⽰法。

1.1数码管显⽰⽅案⼀

⽅案⼀如图1所⽰:静态显⽰。所谓静态显⽰,就是当显⽰器显⽰某⼀字符时,相应的发光⼆极管恒定的导通或截⽌。该⽅式

每⼀位都需要⼀个8位输出⼝控制。静态显⽰时较⼩的电流能获得较⾼的亮度,且字符不闪烁。但当所显⽰的位数较多时,静

态显⽰所需的I/O⼝太多,造成了资源的浪费。

STC89C52

电源电路

复位电路

键盘控制电路

数码管静态显⽰

电路

图1数码管静态显⽰框图

1.2数码管显⽰⽅案⼆

⽅案⼆如图2所⽰:动态显⽰。所谓动态显⽰就是⼀位⼀位的轮流点亮各个位,对于显⽰器的每⼀位来说,每隔⼀段时间点亮

⼀次。利⽤⼈的视觉暂留功能可以看到整个显⽰,但必须保证扫描速度⾜够快,字符才不闪烁。显⽰器的亮度既与导通电流有

关,也与点亮时间与间隔时间的⽐例有关。调整参数可以实现较⾼稳定度的显⽰。动态显⽰节省了I/O⼝,降低了能耗。

由于静态现实法需要数据锁存器等硬件,接⼝复杂⼀些,⼜考虑到时钟显⽰只有5位,且系统没有其他的处理任务;并且从节

省I/O⼝和降低能耗出发,所以决定采⽤动态扫描法实现LED的显⽰,即采⽤⽅案⼆。

STC89C52

电源电路

复位电路

键盘控制电路

数码管动态显⽰

电路

图2数码管动态显⽰框图

2单元电路设计与计算

2.1电源部分的设计

电源电路包括变压器、桥式整流器、电容和稳压器。通过变压器变压,使得220V电压变为5V,在通过桥式整流,电容的滤

波作⽤,稳压器的稳压作⽤,可输出5V的稳定电压。

如图3所⽰,从外部引⼊5V的直流电,为单⽚机和复位电路提供电源。

GND4D+3D-2VCC1

U5USB

2

3

1

S18SW-SPDT

1K

R4Res2DS1LED2

VCC

图3+5v电源模块电路图

2.2复位电路的设计

为了初始化单⽚机内部的某些特殊功能寄存器,必须采⽤复位的⽅式,复位后可使CPU及系统各部件处于确定的初始状态,

并从初始状态开始正常⼯作。单⽚机的复位是靠外电路来实现的,复位操作有两种情况,即上电复位和⼿动(开关)复位。本系

统采⽤上电复位⽅式。

上电复位:上电复位电路时⼀种简单的复位电路,只要在RST复位引脚接⼀个电容到VCC,接⼀个电阻到地就可以了。上电

复位是指在给系统上电时,复位电路通过电容加到RST复位引脚⼀个短暂的⾼电平信号,这个复位信号随着VCC对电容的充

电⽽回落,所以RST引脚复位的⾼电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的⾼电平

信号必须维持⾜够才的时间。

上电⾃动复位是通过外部复位电路的电容充电来实现的。只要VCC的上升时间不超过1ms,就可以实现⾃动上电复位。如图

4所⽰:

VCC

100pF

C9CapPol2S17SW-SPST

1K

R22

ResSemi

图4复位电路

2.3键盘控制电路设计

该设计需要显⽰按键输⼊和结果输出,当按下数值马上显⽰,按下等号输出计算结果,当按下复位按钮计算器清零。按键的开

关状态通过⼀定的电路转换为⾼、低电平状态。按键闭合过程在相应的I/O端⼝形成⼀个负脉冲。闭合和释放过程都要经过⼀

定的过程才能到达稳定,这⼀过程是出于⾼、低电平的⼀种不稳定状态,称为抖动。抖动的持续时间随键盘材料和操作员⽽

异,不过通常总是不⼤于10ms。很容易想到,抖动的持续时间随键盘材料和操作员⽽异,不过通常总是不⼤于10ms,⽽抖动

问题不解决就会引起对闭合键的识别。⽤软件⽅法可以很容易地解决抖动问题,通过延迟10ms。

单⽚机系统中键盘中按钮数量较多时,为了减少I/O⼝的占⽤,常常将按钮排列成矩阵形式,这样可以更合理的利⽤硬件资

源。矩阵式键盘是指由若⼲个按键组成的开关矩阵。4⾏4列矩阵式键盘连接图如图5所⽰。这种键盘适合采取动态扫描的⽅式

进⾏识别,也就是说,如果采⽤低电平扫描,回送线必须被拉上⾼电平,反之亦然。

图5键盘控制电路

2.4数码管显⽰电路设计

数码管显⽰器成本低,配置灵活,与单⽚机接⼝简单,在单⽚机应⽤系统中⼴泛应⽤。

数码管⼯作原理:数码管是由8个发光⼆极管构成的显⽰器件。在数码管中,若将⼆极管的阳极连在⼀起,称为共阳极数码

管,若将⼆极管的阴极连在⼀起,称为共阴极

数码管。我们单⽚机板上的6个数码管均是共阳极的,当发光⼆极管导通时,它就会发光。每个⼆极管就是⼀个笔划,若⼲个

⼆极管发光时,就构成了⼀个显⽰字符。将单⽚机的I/O⼝控制相应的芯⽚与数码管的a-g相连,⾼电平的位对应的发光⼆极管

亮,这样,由I/O⼝输出不同的代码,就可以控制数码管显⽰不同的字符。本⽂的5个数码管均采⽤动态显⽰⽅式,显⽰当前的

数值。数码管显⽰电路如图6所⽰:

图6数码管显⽰电路

3系统程序设计

3.1主程序设计

主程序⾸先进⾏初始化,设定⼀些变量及其意义,扫描键盘,当输⼊有0~99999数字时,通过键盘的扫描程序,将数值赋给

MONEY并在显⽰器上来,当按下等号时,跳到运算部分,通过判断MONEY的值,进⾏不同的运算,应纳个⼈所得税税额=

(应纳税所得额-扣除标准)*适⽤税率-速算扣除数。

不超过500元的,税率5%,速算扣除数为0;

超过500元⾄2000元的部分,税率10%,速算扣除数为25;

超过2000元⾄5000元的部分,税率15%,速算扣除数为125;

超过5000元⾄20000元的部分,税率20%,速算扣除数为375;

超过20000元⾄40000元的部分,税率25%,速算扣除数为1375;

超过40000元⾄60000元的部分,税率30%,速算扣除数为3375;

超过60000元⾄80000元的部分,税率35%,速算扣除数为6375;

超过80000元⾄99999元的部分,税率40%,速算扣除数为10375。

输出并显⽰结果到数码管上,其主程序流程图如图7所⽰。

有键按下?

读取键值

是否按下确认

键?

保存键值

Y

⼤于500?⼤于2000?Y

⼤于5000?⼤于20000?⼤于40000?Y

⼤于60000?Y

⼤于80000?⼤于99999Y

Y

Y

Y

Y

开始

Y税率5%,速算扣除

数为0

税率10%,速算扣

除数为25

税率15%,速算扣

除数为125

税率20%,速算扣

除数为375

税率25%,速算扣除数为1375

税率30%,速算扣除数为3375

税率35%,速算扣除数为6375

税率40%,速算扣除数为10375

N

N

N

N

N

N

N

N

N

N

结束

图7主程序流程图

3.2LED显⽰程序设计

LED显⽰器由七段发光⼆极管组成,排列成8字形状,因此也成为七段LED显⽰器,器排列形状如图8所⽰:

图8七段LED显⽰器

为了显⽰数字或符号,要为LED显⽰器提供代码,即字形代码。七段发光⼆极管,再加上⼀个⼩数点位,共计8段,因此提供

的字形代码的长度正好是⼀个字节。简易计算器⽤到的数字0~9的共阴极字形代码如下表:

表1⼋段数码管共阴极字形代码

显⽰字型gcdpdebfa段码

010100000a0h

110111011bbh

2h

3001010102ah

4h

5001010112ch

6h

710111010bah

8h

9h

6位LED显⽰的程序流程图如图9所⽰:

开始

初始化显⽰参数

最后⼀位显⽰零,

其它位不显⽰

取显⽰数据

输出段码数据

输出位选通信号

延时

N

位选通信号移位

指⽰下⼀个显⽰数

六位完成

Y

结束

图9LED显⽰流程图

4调试及性能分析

4.1硬件调试

硬件调试时可以检查印制板及焊接的质量情况,在检查⽆误的后可通点检查LED显⽰器的点亮状况。若亮度不理想,可以调

整P0⼝的电阻⼤⼩,⼀般情况下取200Ω电阻即可获得满意的亮度效果。实验室制作时,可结合⽰波器测试晶振及P0、P2端

⼝的波形情况进⾏综合硬件测试分析。

4.2软件调试

根据上述需求分析得出的思路,进⾏C语⾔程序的编写。C语⾔程序⼀共分为三个部分:第⼀部分是STC89C52芯⽚的初始

化;第⼆部分是8255可编程计数芯⽚的初始化;第三部分是模块的编写。个⼈所得税计算器的设计过程中⼀共有三个模块:

1运算模块、2数码管显⽰模块、3键盘扫描模块。

软件调试在KeilC51编译器下进⾏,源程序编译及仿真调试应分段或以⼦程序为单元逐个进⾏,最后可结合硬件实时调试。

4.3性能分析

设计之初的思路是选择个⼈所得税区间分化分放在⼀个内存中,通过查表的⽅法去的各区间的运算⽅式,这样在计算个⼈所得

税计算器的设计上将变得简单。由键盘输⼊可以实现0~99999的个⼈所得税的计算,按等号可以显⽰输出结果,输⼊时符合输

⼊习惯,键盘排布如图10所⽰,没有再发现漏洞。发现的问题如何知道之前键⼊的字符,以便处理当前键⼊字符,加⼊标记

就能通过查看标记值得知之前键⼊字符。长按会连续送数,加⼀条命令while((P3&0xf0)!=0xf0)可等待按键放开后才继续。

789

456

123

0=

图10键盘排布

5详细仪器清单

表2器件清单

仪器名称数量

STC89C521个

LED数码管5个

8255并⼝1个按键SW-SPST16个

三极管90155个

电容1044个

DS1302芯⽚1个

电池1个30PF电容4个

晶振XTAL1个

电源USB接⼝1个

发光⼆极管1个

12M晶振1个

电阻1k50个

6总结与思考

通过此次课程设计不仅加深了对单⽚机的理论知识的理解,更为主要的是加强了动⼿实践能⼒。单⽚机是⼀门理论和实践都⾮

常强的学科,仅仅看书学理论知识并不能真正的理论,更不能提⾼实践能⼒,只要将理论和实践相结合才能真正的掌握知识。

我们在这次个⼈所得税计算器的课程设计中受益匪浅。通过对⾃⼰这⼀学期来所学知识的回顾,并充分发挥对所学知识的理解

和对课程设计的思考及书⾯表达能⼒,最终完成了。这对⾃⼰今后进⼀步深化学习,积累了⼀定宝贵的经验。撰写论⽂的过程

也是专业知识的学习过程,同时强化了⾃⼰的动⼿能⼒,对PCB软件,作图软件,仿真等软件更加熟练。对程序和硬件电路

的调试也有了很⼤的提⾼。它使我运⽤已有的专业基础知识,对其进⾏设计,分析和解决⼀个理论问题或实际问题,把知识转

化为能⼒的实际训练。让我们知道了理论和实际的距离,也知道了理论和实际相结合的重要性。由于接触单⽚机课程的时间尚

短,专业知识还不扎实,在编写程序时难免受阻,要常翻阅课本查阅资料,进度较慢。并且有时程序写错,程序有不完整的现

象,⽆法达到预定结果,需重新调整写过。通过⾃⼰分析,查阅资料,向⽼师与同学请教,与同组的同学们⼀起推敲,再推

敲,共同解决问题。

7致谢

⾸先感谢我的论⽂指导⽼师岳⾈⽼师,岳⽼师严谨细致、⼀丝不苟的作风⼀直是我⼯作⽣活的榜样,他们循循善诱的教导和不

拘⼀格的思路给予我们⽆尽的启迪。

其次同组同学的帮助也是不可或缺的。让我感动不已是,同组同学能够做到互相真正地合作,能够主动是毫不保密奉献出⾃⼰的

劳动成果,同时也教会我们要学会合作,锻炼我们团结向前的精神,这些或许是我们学到的最重要的东西,它是我们以后进⼊社

会的必不可少的品质。

在这次课程设计中遇到了很多编程问题,最后在⽼师的⾟勤指导下,终于迎刃⽽解,在此我表⽰感谢!同时,对给过我帮助的

所有同学和各位指导⽼师再次表⽰忠⼼的感谢!

参考⽂献

[1]李朝青.单⽚机原理及接⼝技术(第3版).北京航空航天⼤学出版社.2006

[2]⽥⽴⽥青代万震.51单⽚机C设计快速⼊门.⼈民邮电出版社.2007

[3]楼然苗李光飞.单⽚机设计指导.北京航空航天⼤学出版社.2007

[4]王守中51单⽚机开发⼊门与典型实例.⼈民邮电出版社.2007

[5]张鑫单⽚机原理及应⽤(第2版).电⼦⼯业出版社.2010

附录⼀:个⼈所得税计算器的PCB板

图9简易计算器PCB原理图

附录⼆:程序

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineSTART0X0F

ucharxdataPA_at_0xD9FF,PB_at_0XDBFF,PC_at_0XDDFF,//定义外部变量,强制分配地址EX_PORT_CON_at_

0XDFFF;

uchardataDISPLAY_BUF[6];

ucharcodeLED_CODE[]={0XA0,0XBB,0X62,0X2A,0X39,0X2C,0X24,0XBA,//LED段码(0~9)

0X20,0X28};

uintcodeKOUCHU_TAB[]={10375,6375,3375,1375,375,125,25,0};

unsignedlongcodeREF_TAB[]={80000,60000,40000,20000,5000,2000,500,0};

unsignedlongintMONEY=0;

ucharPLACE=0,KEY,TEMP;

bitKEY_DIS=0;

ucharKey_Scan();

voidDisplay();

voidDelay(uintA);

voidCalculate();

voidmain()

{

ucharKEY;

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_DIS=0;

MONEY=0;

PLACE=0;

}

}

}

voidDisplay()

{

ucharA;

unsignedlongB=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;

}

}

voidDelay(uintA)

{

while(A--);

}

ucharKey_Scan()

{

ucharA=4,ROW=0x08,T=0XFF;

if(PC!=0XF0)//是否有键按下

{Delay(300);//消抖

if(PC!=0XF0)

while(A--)//查询,逐列

{ROW<<=1;

PC=ROW;

T=(PC&0X0F);

if(T!=0X00)//但前列是否有键被按下

{

T=(T+(ROW&0XF0));//计算键值

do{Display();}//防⽌数码管在按键按下时闪烁

while((PC&0X0F)!=0);//松⼿检测

break;//跳出循环

}

}PC=0xf0;//键盘初始化

switch(T)

{

case0x18:TEMP=7;break;

case0x28:TEMP=8;break;

case0x48:TEMP=9;break;

case0x14:TEMP=4;break;

case0x24:TEMP=5;break;

case0x44:TEMP=6;break;

case0x12:TEMP=1;break;

case0x22:TEMP=2;break;

case0x42:TEMP=3;break;

case0x11:TEMP=0;break;

case0x81:returnSTART;

}

if(!KEY_DIS)

{PLACE++;

if(PLACE==7){PLACE=0;returnSTART;}

else

MONEY=((MONEY*10)+TEMP);

}

}

returnT;

}

voidCalculate()

{

ucharI;

if(MONEY>2000)

{

MONEY-=2000;

for(I=0;;I++)

{

if(MONEY>REF_TAB[I])break;

}

MONEY=(((MONEY)*(8-I)/20))-KOUCHU_TAB[I];

}

else

MONEY=0;

}

👁️ 阅读量:0