基于at89s52单片机的简易计算器设计内容摘要:
,0x99, //04 0x92,0x82,0xF8,0x80,0x90, //59 0x86,0xAF,0xFF,0x7F,0xBF,}。 //E,r,空格 ,., /***main 函数 ***/ void main(void) { char i,j,k,c。 char a[8],b[8]。 /***定时 1ms***/ TMOD=0。 TL0=(1000/256)。 TH0=(1000%256)。 EA = 1。 //总中断开关 ET0 = 1。 //开中断 TR0 = 1。 //启用计数器 0 KSC:do { for(i=1。 i9。 i++) //数字录入循环 { dsp[0]=keyscan()。 if(c==2amp。 amp。 dsp[0]10) //此段代码验证是否有旧的计算结果在显示,且不再参与新计算 单片机系统开发与应用工 程实习 计报告 6 { dsp[1]=dsp[0]。 for(j=2。 j9。 j++) dsp[j]=12。 c=0。 } else if(c==2amp。 amp。 dsp[0]9) //旧的计算结果将参与新的计算,作为第一个数 { c=0。 } if(dsp[0]==0amp。 amp。 dsp[1]==0amp。 amp。 dsp[2]==12) //个位为 0 且十位为空时按下 0,按键无效,跳回 KSC 等待正确输入 { /***goto 跳转标志 ***/ goto KSC。 } else if(dsp[0]9) break。 //有操作符按下,跳出数字录入循环 else {for(j=i。 j0。 j) dsp[j]=dsp[j1]。 //移位,以正确显示数字 } } if(i==9) //判断是否输入 8 个有效数字,是则等待操作符,否则直接判断操作符 { do //使用 do while 无论是否第一个数都取一次操作符 { dsp[0]=keyscan()。 //获取操作符号 if(dsp[0]==14||dsp[0]10) //按下 C 或者第 9 位数字清零 { 单片机系统开发与应用工 程实习 计报告 7 dsp[1]=0。 for(i=2。 i9。 i++) dsp[i]=12。 c=0。 } }while((dsp[0]==15)amp。 amp。 (c==0))。 //等号被按下,等待新的操作符(仅对第一个数字有效) } else if(dsp[0]==14) //按下 C 清零 { dsp[1]=0。 for(i=2。 i9。 i++) dsp[i]=12。 c=0。 } while(dsp[0]==15amp。 amp。 c==0) //未输满 8 位且是第一个数字即按下等号,等待非等号操作符 { dsp[0]=keyscan()。 //获取操作符号 if(dsp[0]==14||dsp[0]10) //按下 C 或者数字都进行清零 ,重新输入 a { dsp[0]=14。 //将 dsp[0]置为 14,防止因数字清零未能拦截 dsp[1]=0。 for(i=2。 i9。 i++) dsp[i]=12。 c=0。 } } }while(dsp[0]==14)。 //数字输入未完成即按下 C,重新等待输入 do { 单片机系统开发与应用工 程实习 计报告 8 if(c==0) //没有数字输入 { k=dsp[0]。 //存计算符(循环内已排除 C、=、数字) for(i=0。 i8。 i++) //将第一个数存入 a[8] { a[i]=dsp[i+1]。 } dsp[1]=0。 //清零 for(i=2。 i9。 i++) dsp[i]=12。 c=1。 //已输入 a /***goto 跳转标志 ***/ goto KSC。 } else if(c==1) { for(i=0。 i8。 i++) //将第二个数存入 b[8] { b[i]=dsp[i+1]。 } c=2。 //已输入 b if(dsp[0]!=15) //b 输完后操作符不是等号 { calculate(k,a,b)。 for(i=0。 i8。 i++) //将计算结果存入 a[8], a 值更新 { a[i]=dsp[i+1]。 } 单片机系统开发与应用工 程实习 计报告 9 k=dsp[0]。 //更新计算符 c=1。 /***goto 跳转标志 ***/ goto KSC。 } } }while((dsp[0]==15)amp。 amp。 (c2))。 //直到 ab 输入完成且按下等号 calculate(k,a,b)。 //进行最后计算 /***goto 跳转标志 ***/ goto KSC。 //跳回 KSC,等待新一轮计算 while(1)。 //防止程序跑飞 } char keyscan() { char KeyL。 char KeyR。 char j。 do { do { P3=0xF0。 P3=P3|0xF0。 //行扫描 11110000 if(P3!=0xF0) { KeyL=P3。 P3=0x0F。 单片机系统开发与应用工 程实习 计报告 10 P3=P3|0x0F。 //列扫描 00001111。基于at89s52单片机的简易计算器设计
相关推荐
晶振电路 图22 电子琴系统原理框图 简易电子琴的proteus总体仿真图 电子琴的proteus总体仿真图见图23。 按下MUSICKEY键,系统自动播放预存在内存中的曲子,按下RESKEY键,系统复位,停止播放。 按下矩阵键盘中的任意键,扬声器发出相应的音符。 图23 简易电子琴的proteus总体仿真图 单片机必须在时钟的驱动下才能工作。 在单片机内部有一个时钟振荡电路
计过程较为简单,与我们此次的课程设计要求不符,因此我们选择方案二进行设计。 计算机 控制技术 课程设计 3 微处理器的选择 在整个单片机控制系统中, CPU 既是运算处 理中心,又是控制中心,是控制系统中最关键的器件。 此系统控制方案简单,数据量也不大,因此选用 AT89C51作为控制系统的主机。 AT89C51 有 40 引脚双列直插( DIP)形式。 其与 80C51 引脚结构基本相同
4 14 8D 24L E D+ 12R 331K1133224455K7JDQ78 05 0R 321KD 21I N 4 14 8D 22L E D+ 12R 311K1133224455K6JDQ68 05 0R 301KD 19I N 4 14 8D 20L E D+ 12R 291K1133224455K5JDQ58 05 0R 281KD 17I N 4 14 8D 18L E D+
完成硬件初始化,子程序调用和程序间的切换,由于本设计要求抢答器具有开始、复位、抢答、三种方式切换功能,所以主程序除了要进行硬件部分的初始化以外还要进行各个程序之间的调用和切换。 主程序 流程图如图46 所示。 程序: void main huang 0。 red 0。 EA 1。 TMOD 0x11。 T2CON 0x01。 TH0 6553650000 /256。 TL0 6553650000
;对于具有驱 动电路和单片机接口的LCD 显示模块,一般多采用并行接口,对单片机的接口要求较高,占用资源多;另外, AT89C51 单片机本身没有专门的 LCD 驱动接口。 而 LED 数码管作为一种主动显示器件,具有结构简单、亮度高、响应速度快、价格便宜、易于购买等优点,而且有远距离视觉效果,很适合夜间或者远距离操作。 因此在本设计中,我们采用两个 3 位数码管作为显示介质。
1111 1111 1111 1000 FFF8H 1111 1111 0110 1110 FF5EH 1111 1111 0110 1111 FF6FH 55 1111 1100 1001 0000 FC90H 黄河科技学院毕业论文 第 8 页 3 硬件电路及系统原理分析 系统总体设计 系统总体设计图如图 所示。 图 系统总体设计结构图 本系统是以单片机为核心,由数字温度传感器 DS18B温度