单片机模拟计算器数字输入及显示实验

合集下载

单片机数字量输入输出实验

单片机数字量输入输出实验

一、实验目的1.熟悉教学板电路及其结构。

2.掌握利用μVision C51 软件编辑、调试(包括仿真调试、单步调试)、运行单片机程序的步骤和方法,掌握利用STC-ISP V39软件和下载线将程序写入单片机的方法。

3.通过实验熟悉51单片机的并行I/O口,并掌握它们的应用。

4.掌握矩阵键盘、LED动态显示的工作原理。

二、实验设备PC机一台、实验教学板一块。

三、实验内容1.实验线路如附图所示,51单片机的P0口输出接8个发光二极管的阴极,P2.4经NPN 三极管9011控制发光管的阳极。

P3口支持一个8位行列式键盘,其中P3.4~P3.7供键盘扫描输出,P3.2、P3.3作键盘扫描输入。

实验要求:编程实现键盘对发光二极管的控制,每按一个按键,使对应的二极管点亮。

2.51单片机P0口输出同时接4个数码管的阴极,P2.0~P2.3,经NPN三极管9011接数码管的阳极,该端口用于分别控制相应数码管的导通。

实验要求:编程实现对任意按键动作的次数进行计数(最大99次),同时将计数值实时显示。

四、实验步骤1.将实验板与PC机通过COM口连接。

启动PC机,进入μVision软件环境,选择建立新工程文件,即可开始输入源程序。

2.完成汇编、编译、连接,若有错误,则修改源程序,直至编译、连接通过为止。

3.接上实验板上的电源。

4.运行“STC-ISP V39.EXE”,将程序代码下载到实验板的单片机中。

操作的顺序是:1)选择单片机(MCU TYPE)型号。

如:“STC89C51RC”要与实验板上所装单片机的型号一至。

2)打开文件(Open File)。

即把要下载到单片机的程序文件(已通过编译了的机器码文件——二进制(.Bin)或十六进制(.Hex)的)调到“文件缓冲区”,这时可看到右边的“文件缓冲区”有数字变化。

3)选择串行通信口。

选对时,软件上的小灯会变绿。

否则小灯是灰色。

且在左下窗口提示“出错信息”。

4)下载:按“Download/下载”按键下载。

单片机的简易计算器

单片机的简易计算器

单片机的简易计算器单片机简易计算器的设计与实现一、引言计算器是一种用于计算数学运算的工具,现在已经成为人们日常生活中必不可少的设备之一、在这个数字化的时代,我们经常需要进行简单的数学运算,如加、减、乘、除等。

为了满足人们的需求,我们可以使用单片机来设计和实现一个简易的计算器。

二、设计目标我们的设计目标是实现一个能够进行基本的加减乘除四则运算的简易计算器。

具体来说,我们希望计算器能够实现以下功能:1.输入两个数字进行计算,并显示结果。

2.支持加法、减法、乘法和除法运算。

3.具备简单的误操作处理能力,如输入错误提示等。

三、设计思路我们将使用8051系列单片机来设计和实现计算器。

具体的设计思路如下:1.使用矩阵键盘作为输入设备,通过扫描矩阵键盘来获取输入的数字和运算符。

2.通过数码管来显示计算结果。

3.使用中断处理器来处理键盘输入和计算结果的显示。

4.根据输入的运算符进行相应的运算,然后将结果显示在数码管上。

四、硬件设计1.选择合适的单片机,如STC89C52,AT89S52等,它们都是基于8051核心的单片机。

2.连接矩阵键盘到单片机的IO口,通过矩阵键盘的扫描来获取输入的数字和运算符。

3.连接数码管到单片机的IO口,用于显示计算结果。

五、软件设计1.在主程序中初始化单片机的IO端口和中断向量。

2.编写中断服务程序,用于处理键盘输入和计算结果的显示。

3.设计一个状态机来处理键盘输入和计算结果的显示。

4.根据状态机的状态来进行相应的运算和显示。

六、实现步骤1.编写主程序,包括对IO口和中断向量的初始化。

2.编写中断服务程序,用于处理键盘输入和计算结果的显示。

3.设计一个状态机,并实现状态机的状态转换和运算结果的计算。

4.测试并调试系统,确保计算结果的准确性。

七、总结通过使用单片机,我们成功地设计并实现了一个简易的计算器。

这个计算器不仅能够进行基本的加减乘除四则运算,还具备了简单的误操作处理能力。

在实际使用中,我们可以通过添加更多的功能和改进设计来进一步完善这个简易计算器。

23单片机模拟计算器数字输入和显示实验

23单片机模拟计算器数字输入和显示实验

23.模拟计算器数字输入及显示1.实验任务(1.开机时,显示“0”(2.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。

2.电路原理图图4.23.13.系统板上硬件连线(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;(3.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;(4.把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;4.相关程序设计内容(1.行列式键盘输入及按键功能设定;(2.动态数码显示;(3.数码显示方式处理;5.汇编源程序(略)6.C语言源程序#include <AT89X51.H>unsigned char codedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x 00};unsigned char codedispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char dispbuf[8]={0,16,16,16,16,16,16,16};unsigned char dispbitcount;unsigned char temp;unsigned char i,j;unsigned char key;unsigned char keypos;bit alarmflag;void change(unsigned char *p,unsigned char count){while(count>0){*(p+count)=*(p+count-1); count--;}}void main(void){TMOD=0x01;TH0=(65536-4000) / 256;TL0=(65536-4000) % 256;TR0=1;ET0=1;EA=1;while(1){P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--); temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}}}void t0(void) interrupt 1 using 0{TH0=(65536-4000) / 256;TL0=(65536-4000) % 256;P0=dispcode[dispbuf[dispbitcount]];P2=dispbitcode[dispbitcount];dispbitcount++;if (dispbitcount==8){dispbitcount=0; }if (alarmflag==1) {P1_1=~P1_1;}}。

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告

零基础DIY单片机简易计算器实践
单片机是一种很有趣的微处理器,它广泛应用于电子产品中。

学习单片机可以帮助我们更深入理解计算机原理和底层运作。

本实验将介绍如何使用单片机来制作一个简易计算器。

所需材料:
1. 单片机开发板
2. 4位7段显示器
3. 数字按键开关
4. 杜邦线
5. 电位器
6. 板子外壳
步骤1:连接电路
将数码管和数字按键开关与单片机开发板连接。

使用杜邦线将每个组件的引脚连接到开发板的相应引脚。

电位器可用于调节数码管显示的亮度。

步骤2:编写程序
使用C语言编写程序。

程序需要识别按键输入的数字和运算符,
并根据不同的情况显示计算结果。

程序中需要使用条件语句、循环语
句和函数等基本语言结构。

步骤3:测试程序
将编写好的程序上传到单片机开发板中。

测试程序的过程中要注
意按键输入的顺序和正确性。

如果按键输入错误,程序需要能够正确
地识别并给出错误提示。

步骤4:完成外壳
将单片机开发板和数码管装进铝盒中,并将数字按键开关与外壳
相连。

在外壳上打开一个窗口,以便能看到数码管和按键。

为了美观,可以涂上一些喜欢的颜色或加上小贴纸等装饰。

通过这个实验,我们深入了解了单片机的基本原理和运作方式,
掌握了C语言编程语言基础知识,并制作了一个实用的计算器。

在实
践中,我们不仅锻炼了问题解决能力和动手能力,还增强了对电子产
品的兴趣和信心。

模拟计算器数字输入及显示课程设计

模拟计算器数字输入及显示课程设计

摘要本设计是一个实现加、减、乘、除的计算器,它的硬件主要由四部分组成,一个AT89C51单片机芯片,一个八位共阳极的数码管,一个4*4的键盘,一个排阻(10K)做P0口的上拉电阻(接线图在附录2),它可以实现结果低于65535的加、减、乘、除运算。

显示部分:采用动态显示,由八位共阳极数码管通过P0口,P2口与单片机相连,数码管的A,B,C,D,E,F,G,DP分别依次与单片机的P0.0—P0.7相连,P0口做为单片机的字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的P2.0—P2.7相连,P2口作为数码管的位控制端。

按键部分:采用4*4键盘。

采用软件识别键值并执行相应的操作,键盘的第0行到第3行依次与单片机的P3.4—P3.7管脚相连,键盘的第0列到第3列依次与单片机的P1.0—P1.3管脚相连,程序运行时依次扫描各行,查询是否有键按下,如果有则进入键盘识别处理程序,实现相应的运算,然后通过数码管输出结果,如果没有按键就调用显示程序显示一个0,等待按键按下,在进入按键扫描程序。

执行过程:开机即显示0,等待键入数值,当键入数字,将通过数码管显示出来,在键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当在键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。

注:结果不能超出65535。

(具体操作见后面仿真图)目录1 概述1.1MCS-51单片机在自动化仪表中的作用 (3)1.2掌握单片机仿真软件Proteus的使用方法 (3)1.3设计方法 (3)1.4基本功能 (4)2 系统总体方案及硬件设计2.1计算器总体思想 (5)2.2硬件的选择与连接 (6)3 软件设计3.1显示程序设计 (7)3.2键盘识别程序设计 (8)3.3运算程序设计 (10)3.4风鸣器程序设计 (10)4 Proteus软件仿真 (12)5课程设计体会 (16)参考文献 (18)附1:源程序代码 (19)附2:计算器模拟系统电路图 (31)1 概述1.1MCS-51单片机在自动化仪表中的作用单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。

在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。

实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。

本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。

具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。

程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。

在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。

在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。

同时,计算器还具有清零、退格等功能,方便用户进行操作。

总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。

同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。

模拟计算器数字输入及显示

模拟计算器数字输入及显示

该段注释: 1)temp1 因为我的单片机位选为0000 0000 八位哪一位为1时则对应的 LED 被选中,temp1=0x80,即0100 0000.此时恰好没有 LED 被选中,但进入循环后向右每移动 一位则对应一位的 LED 被选中。
2)循环的设计,因为在矩阵键盘检测函数中我们把对应的按键数字存入到数组中了, 用循环读出数组中的数字。读出一个 temp1移动一位,形成了动态扫描。因此可以实现设计 要求
for(i=k;i>0;i--) { delay(1); dula=1; P0=table[dul[i]]; dula=0;
temp1=_cror_(temp1,1);
wela=1; P0=temp1; wela=0;
delay(1); //一下为消影 wela=1; P0=0x00; wela=0; } }
uchar aa,num,Key_Value,temp,temp1,k;
void delay(uint z) // 延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} void init()
//初始化函数
{
TMOD=0x01;
EA=1;
ET0=1;
while(temp!=0xf0) { temp=P3;
switch(temp) {
case 0xe7:num=12; break; case 0xd7:num=13; break; case 0xb7:num=14; break; case 0x77:num=15; break;
} while(temp!=0xf0) { temp=P3; temp=temp&0xf0; }

单片机课程设计——计算器

单片机课程设计——计算器

单片机综合课程设计——计算器一、实验目的1、学习使用单片机内部的I/O功能。

2、熟悉I/O与键盘矩阵和数码管的连接。

3、熟练掌握单片机I/O的编程。

二、实验分工三、功能实现1、采用键盘按键输入,数码管显示的模式。

2、实现计算器两位数以内的基本“+,-,*,/”运算功能。

3、扩展实现了计算器的乘方、阶乘、开平方根功能。

4、实现了计算器的退格功能,可以在运算过程中更改操作数,不影响运算继续进行。

5、数码管操作数显示两位以内,结果显示在四位数以内。

6、键盘各功能键分布如下:1 2 3 + or x a4 5 6 - or n!7 8 9 * orbackspace reset = /由于时间紧张,未来得及实现功能键的复用,只能将扩展功能与基本功能分开,用两个程序实现。

7、具体操作:开始运行程序后,数码管无显示,等待键盘输入。

通过定时中断,定时扫描按键。

有按键按下时,判断为1~9数字键,则显示在数码管上。

按下运算功能键屏幕清零,等待下一个操作数输入。

按下“=”号后,得出计算结果,结果显示于数码管上。

在操作数输入过程中,按下backspace,则数码管显示去掉最后一位数字,继续输入,不影响运算的进行。

按下“reset”,则回到初始状态,数码管显示和运算结果被清除,等待输入新的表达式。

四、实验原理1、通过MSP430 端口控制TM1638 芯片实现读取键盘状态(输入)和控制LED 数码管显示(输出)的功能。

2、键盘:键盘中A-F 分别对应KS1-KS6。

一旦有按键按下,TM1638 中相关的寄存器的值就会改变。

*注意:键盘用坐标形式表示,空白位表示本开发板暂未用到TM1638 最多可以读4个字节,不允许多读。

读数据字节只能按顺序从BYTE1-BYTE4 读取,不可跨字节读。

组合键只能是同一个KS,不同的K 引脚才能做组合键;同一个K 与不同的KS 引脚不可以做成组合键使用。

3、数码管:上图给出一个共阴数码管的连接示意图,如果让该数码管显示“0”,那你需要在GRID1 为低电平的时候让SEG1,SEG2,SEG3,SEG4,SEG5,SEG6 为高电平,SEG7 为低电平,即在00H 地址单元里面写数据3FH 就可以让数码管显示“0”。

单片机实验-计算器

单片机实验-计算器

键盘功能示意:
四、实验代码 ORG 0000H SJMP START ORG 0030H START: CLR 00H CLR 01H CLR P3.0 MOV R7, #00H ; 按键次数计数器 LOOP: ACALL KEY CJNE R7, #01H, NEXT1 MOV R0, #30H ;存放第一个数的个位 MOV 31H, @R0 NEXT1: JB 00H,NEXT2 CJNE R7, #02H, NEXT2 MOV R0, #30H ;存放第一个数的十位 MOV A, #09H SUBB A, @R0 MOV32H,#00H ;异常处理 INC R7 JC NEXT2 DEC R7 MOV R2,31H MOV 31H, @R0 MOV 32H,R2 SETB 00H ;重来时要记得清 0 NEXT2: CJNE R7, #03H, NEXT3 MOV R0, #30H ; 存放操作数 有 “加减乘除”四 种情况 MOV 33H, @R0 NEXT3: CJNE R7, #04H, NEXT4 MOV R0, #30H ;存放第二个数的个位 MOV 34H, @R0 NEXT4: JB 01H,NEXT5 CJNE R7, #05H, NEXT5 MOV R0, #30H ;存放第二个数的十位 MOV A, #09H SUBB A, @R0 MOV 35H,#00H ;异常处理 INC R7 JC NEXT5 DEC R7 MOV R2,34H MOV 34H, @R0 MOV 35H,R2 SETB 01H ;重来时要记得清 0 NEXT5: CJNE R7, #06H, NEXT6 MOV R0, #30H ;存放操作数 等于号 0EH MOV 36H, @R0 NEXT6: LCALL DISPLAY CJNE R7, #06H, LOOP MOV R0, #36H CJNE @R0, #0EH, FU;存放开始计算的操作数 等待 等号 的键值 SJMP CK FU: DEC R7 LJMP LOOP ;开始计算 CK: MOV R7, #00H CLR 00H

基于51单片机的计算器

基于51单片机的计算器

二、 实验环境 Keil 软件和 protus 软件 三、 实验内容 计算器中存在很多数据,数据的输入需要很多按键,那么这就 要涉及到按键的检测问题,同时产生的数据要送到单片机中进行处 理,处理完的数据要送到数码管上显示出来。 实验仿真图如下:
图 1 实验仿真图 (由于我的开发板上面 P2^3 脚接Байду номын сангаас蜂鸣器,仿真图中就没有用到
} else return 20; } else return 20; } void main() { uchar k,i,hand,h2; bit xsd=0; char data e; double data temp,h1=0,h3=0,h4=0; displaypro(0); while(1) { k=keyscan(); if(k==20) hand=0; for(i=0;i<8;i++) { wela=1; P0=led[i]; wela=0; P0=0xff; dula=1; P0=xx[i]; dula=0; delay(20); P0=0xff; } switch(k) { case 20:break; case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: if(hand==0) { h4=0;
} if(h2==0) { h1=sqrt(h1); displaypro(h1); } else if(h3==0) { h1=sqrt(h1); displaypro(h1); h2=0; } else { h3=sqrt(h3); displaypro(h3); } xsd=0;e=0; } hand++; break; case 16:if(hand==0)//小数点 { xsd=1; } hand++; break; case 17:if(hand==0)// 1/x { if(h4!=0) { h1=h4; h4=0; } if(h2==0) { h1=1/h1; displaypro(h1); } else if(h3==0) { h1=1/h1;

单片机的简易计算器的设计与实现

单片机的简易计算器的设计与实现

单片机的简易计算器的设计与实现单片机是一种集成电路芯片,具有微处理器、存储器和输入输出接口等功能,适合用于嵌入式系统中。

设计和实现单片机的简易计算器是一种常见的练习项目,可以帮助我们理解单片机的基本原理和编程技巧。

在实现过程中,我们需要考虑的关键方面包括:输入输出接口设计、数值输入方式、算法选择和显示输出等。

首先,我们需要设计单片机的输入输出接口。

对于简易计算器来说,输入接口通常包括数字按键和运算符按键,输出接口则需要显示器来显示计算结果。

为了简化设计,我们可以使用4x4矩阵键盘作为输入接口,并使用数码管或液晶显示屏作为输出接口。

接下来,我们需要决定数值的输入方式。

一种常见的方式是使用连续输入的方式,即输入一个数字按键后,直接将数字显示在输出接口上;而另一种方式是使用逆波兰表示法,即输入完所有数字和运算符后,再根据运算符的优先级进行计算。

前者相对简单,但后者更贴近计算器的实际使用方式,可以提高用户体验。

在算法选择方面,我们可以使用堆栈和循环结构来实现一个逆波兰计算器。

具体来说,我们可以使用一个堆栈来存储数字和运算符,然后根据优先级和计算规则对堆栈进行操作,最后得到计算结果。

这样的实现方式简单高效,并且易于扩展其他功能。

最后,我们需要确定显示和输出的方式。

对于数值的显示,我们可以使用7段数码管或液晶显示屏来显示结果。

数码管的显示方式是通过控制不同段的亮灭来显示不同数字和符号,而液晶显示屏则通过控制像素的亮灭来显示相应的信息。

对于运算符和其他提示信息的输出,我们可以使用LED灯、蜂鸣器或液晶显示屏上的额外控制位来实现。

在实际实现单片机的简易计算器时,我们需要进行以下几个步骤:1.设计硬件电路,包括输入输出接口和显示方式。

2.根据输入接口的设计,编写程序读取按键输入,并根据按键对计算器进行相应的操作。

3.设计堆栈结构,并编写程序实现逆波兰计算器的算法逻辑。

4.将计算结果存储在适合的变量中,并编写程序将结果显示在输出接口上。

23。模拟计算器数字输入及显示精品文档9页

23。模拟计算器数字输入及显示精品文档9页

23.模拟计算器数字输入及显示1.实验任务(1.开机时,显示“0”(2.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。

2.电路原理图图4.23.13.系统板上硬件连线(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;(3.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;(4.把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;4.相关程序设计内容(1.行列式键盘输入及按键功能设定;(2.动态数码显示;(3.数码显示方式处理;5.汇编源程序(略)6.C语言源程序#include <AT89X51.H>unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char dispbuf[8]={0,16,16,16,16,16,16,16};unsigned char dispbitcount;unsigned char temp;unsigned char i,j;unsigned char key;unsigned char keypos;bit alarmflag;void change(unsigned char *p,unsigned char count)while(count>0)*(p+count)=*(p+count-1);count--;void main(void)TMOD=0x01;TH0=(65536-4000) / 256;TL0=(65536-4000) % 256;TR0=1;ET0=1;EA=1;while(1)P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f; switch(temp)case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;if ((key>=0) && (key<10))keypos++;if(keypos<8)change(dispbuf,keypos); dispbuf[0]=key;elsekeypos=8;alarmflag=1;temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f; alarmflag=0;P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;if ((key>=0) && (key<10))keypos++;if(keypos<8)change(dispbuf,keypos);dispbuf[0]=key;elsekeypos=8;alarmflag=1;temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f; alarmflag=0;P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f; switch(temp)case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;if ((key>=0) && (key<10))keypos++;if(keypos<8)change(dispbuf,keypos); dispbuf[0]=key;elsekeypos=8;alarmflag=1;temp=P3;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f; alarmflag=0;P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;case 0x07:key=15;break;if ((key>=0) && (key<10))keypos++;if(keypos<8)change(dispbuf,keypos);dispbuf[0]=key;elsekeypos=8;alarmflag=1;temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f; alarmflag=0;void t0(void) interrupt 1 using 0TH0=(65536-4000) / 256;TL0=(65536-4000) % 256;P0=dispcode[dispbuf[dispbitcount]];P2=dispbitcode[dispbitcount];dispbitcount++;if (dispbitcount==8)dispbitcount=0;if (alarmflag==1) P1_1=~P1_1;。

单片机键盘显示实验报告

单片机键盘显示实验报告

单片机的键盘和显示实验报告㈠实验目的1.掌握单片机I/O的工作方式;2.掌握单片机以串行口方式0工作的LED显示;3.掌握键盘和LED显示的编程方法。

㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.电源一台㈢实验内容及要求实验硬件线路图见附图从线路图可见,8051单片机的P1口作为8个按键的输入端,构成独立式键盘。

四个LED显示器通过四个串/并移位寄存器74LS164接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。

编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。

注:①通过按键来选择加、减、乘、除四种运算方式。

②输入两个数字均为一位十进制数,可预先放在内存中。

㈣实验框图(见下页)㈤思考题1.当键盘采用中断方式时,硬件电路应怎样连接~是键输出线,~是扫描输入线。

输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。

移位寄存器的移位速率是多少实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。

其实这个问题确实不知道怎么回答。

LED实验代码:ORG 0000HAJMP MAINORG 0030HMAIN:MOV 41H,#0BBH ;对几个存放地址进行初始化MOV 42H,#0BBHMOV 43H,#0BBHMOV 44H,#0BBHMOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示KEY:MOV R3,#08H ;用来存放两个数据MOV R4,#02HMOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取按键状态CPL A ;取正逻辑,高电平表示有键按下JZ KEY ;A=0时无键按下,重新扫描键盘LCALL DELAY1 ;消抖MOV A,P1 ;再次读取按键状态CPL AJZ KEY ;再次判别是否有键按下PUSH AKEY1:MOV A,P1CPL AANL A,#0FH ;判别按键释放JNZ KEY1 ;按键未释放,等待LCALL DELAY1 ;释放,延时去抖动POP AJB ,ADD1 ;K1按下转去ADD1JB ,SUB1 ;K1按下转去SUB1JB ,MUL1 ;K1按下转去MUL1JB ,DIV1 ;K1按下转去DIV1LJMP KEYADD1:LCALL BUFFER ;显示加数和被加数MOV 43H,#049HLCALL DISPLAY ;显示加号MOV A,R3ADD A,R4DA AMOV R3,A ;相加结果放入R6ANL A,#0FHMOV R4,A ;结果个位放入R7MOV A,R3SWAP A ;半字节交换,高四位放入低四位ANL A,#0FHMOV R3,A ;结果的高位放入R6LCALL L ;显示缓存区设置LCALL DELAY2 ;延时一秒后显示LCALL DISPLAYLJMP KEYSUB1:LCALL BUFFER ;显示减数和被减数MOV 43H,#40HLCALL DISPLAY ;显示减号MOV A,R3CLR CY ;CY清零SUBB A,R4 ;做减法PUSH ARLC A ;带进位循环左移,最高位放入CYJC F ;判断最高位,若为1则跳转到负数ZHENG: POP AMOV R4,AMOV R3,#00H ;高位清零SJMP OUTFU:POP ACPL A ;取绝对值INC AMOV R4,AMOV R3,#11H ;显示负号OUT: LCALL L ;显示缓存区设置LCALL DELAY2 ;延时1s后显示LCALL DISPLAYLJMP KEYMUL1:LCALL BUFFER ;显示两位乘数MOV 43H,#99HLCALL DISPLAY ;显示乘号MOV A,R3MOV B,R4MUL AB ;结果放入AB,A中是低8位,B中是高8位MOV B,#0AHDIV AB ;十进制转换MOV R4,B ;结果个位放入R7MOV R3,A ;结果的十位放入R6LCALL LLCALL DELAY2LCALL DISPLAY ;延时1s后显示LJMP KEYDIV1:LCALL BUFFER ;显示除数和被除数MOV 43H,#62HLCALL DISPLAY ;显示除号MOV A,R3MOV B,R4DIV AB ;A除以BMOV R4,B ;余数放在R4中MOV R3,A ;商放在R3中MOV A,R4MOVC A,@A+DPTR ;调用段选号MOV 41H,A ;显示余数MOV A,R3MOVC A,@A+DPTRMOV 43H,A ;显示商MOV 42H,#00HMOV 44H,#00HLCALL DELAY2 ;延时1S后显示LCALL DISPLAYLJMP KEYBUFFER: MOV 41H,#22H ;显示初始化,在做计算之前显示两个操作数,显示等号MOV DPTR,#TABLMOV A,R4MOVC A,@A+DPTRMOV 42H,AMOV A,R3MOVC A,@A+DPTRMOV 44H,ARETDISPLAY:MOV R5,#04H ;共四位需要显示MOV R0,#41HDISPLAY1:MOV A,@R0MOV SBUF,ADISPLAY2:JNB TI,DISPLAY2 ;是否传完了CLR TIINC R0DJNZ R5,DISPLAY1RETL:MOV A,R4MOVC A,@A+DPTRMOV 41H,A ;R4对应的段码MOV A,R3MOVC A,@A+DPTRMOV 42H,A ;R3对应的段码MOV 43H,#00HMOV 44H,#00HRETDELAY1: ;普通延时MOV R1,#20HDS1: MOV R2,#0FFHDS2: DJNZ R2,DS2DJNZ R1,DS1RETDELAY2: MOV R6,#14H ;定时1SMOV TMOD,#01HDS3:MOV TH0,#3CHMOV TL0,#0B0H ;50msSETB TR0LOOP:JNB TF0,LOOPCLR TF0CLR TR0DJNZ R6,DS3 ;1s到,中断返回RETTABL:DB 0BBH 09H 0EAH 6BH ;段码表DB 59H 73H 0F3H 0BHDB 0FBH 7BH 00H 0DBHDB 0F1H 0B2H 0E9H 0F2HDB 0D2H 40H实验结果及分析按键1:8+2= 结果:10按键2:8-2= 结果: 6按键3:8*2= 结果:16按键4:8/2= 结果:4从上面的结果可以看出,本次实验基本完成了实验要求。

单片机输入实验实习报告

单片机输入实验实习报告

一、实习目的本次单片机输入实验实习旨在使学生了解单片机的输入原理和接口技术,掌握单片机与外部设备进行数据交换的方法,提高学生的动手实践能力和系统设计能力。

二、实习内容1. 实验环境(1)单片机开发板:选用STC89C52单片机作为实验平台。

(2)输入设备:键盘、光敏传感器、红外传感器等。

(3)实验仪器:示波器、万用表、电源等。

2. 实验步骤(1)键盘输入实验1)了解键盘的工作原理,包括扫描矩阵、去抖动等。

2)设计键盘扫描程序,实现键盘输入功能。

3)编写程序,将键盘输入的数据显示在LCD显示屏上。

(2)光敏传感器输入实验1)了解光敏传感器的工作原理,包括光敏电阻、光敏二极管等。

2)设计光敏传感器信号处理程序,实现光强检测。

3)编写程序,将光强检测结果显示在LCD显示屏上。

(3)红外传感器输入实验1)了解红外传感器的工作原理,包括红外发射管、红外接收管等。

2)设计红外传感器信号处理程序,实现距离检测。

3)编写程序,将距离检测结果显示在LCD显示屏上。

三、实验结果与分析1. 键盘输入实验通过设计键盘扫描程序,成功实现了键盘输入功能。

在程序运行过程中,通过示波器观察键盘扫描信号,验证了程序的正确性。

将键盘输入的数据显示在LCD显示屏上,实现了人机交互。

2. 光敏传感器输入实验通过设计光敏传感器信号处理程序,成功实现了光强检测。

在程序运行过程中,通过示波器观察光敏传感器信号,验证了程序的正确性。

将光强检测结果显示在LCD 显示屏上,实现了实时监控。

3. 红外传感器输入实验通过设计红外传感器信号处理程序,成功实现了距离检测。

在程序运行过程中,通过示波器观察红外传感器信号,验证了程序的正确性。

将距离检测结果显示在LCD 显示屏上,实现了实时监控。

四、实习总结1. 通过本次单片机输入实验,掌握了单片机与外部设备进行数据交换的方法,提高了动手实践能力和系统设计能力。

2. 学会了如何设计键盘、光敏传感器、红外传感器等输入设备的信号处理程序,实现了数据采集和显示。

单片机数字显示实训报告

单片机数字显示实训报告

一、实训目的本次实训旨在通过学习单片机的基本原理和编程方法,掌握单片机数字显示系统的设计、调试和测试。

通过实训,使学生能够:1. 理解单片机数字显示系统的基本原理和组成;2. 掌握单片机与数码管之间的接口电路设计;3. 熟悉C语言编程,实现单片机控制数码管显示;4. 学会使用Proteus软件进行仿真实验,验证设计效果。

二、实训内容1. 数码管简介数码管是一种常用的数字显示器件,具有体积小、功耗低、显示清晰等优点。

数码管通常由多个发光二极管(LED)组成,每个LED代表一位数字的某一位。

根据LED的连接方式,数码管可分为共阴极和共阳极两种类型。

2. 单片机与数码管接口电路设计本实训采用AT89C51单片机作为控制核心,共阴极数码管作为显示器件。

单片机与数码管之间的接口电路主要由以下部分组成:(1)数码管驱动电路:用于将单片机输出的数字信号转换为数码管所需的驱动信号。

常用的驱动电路有共阳极驱动电路和共阴极驱动电路。

(2)位选电路:用于控制数码管显示的位数。

通过位选信号的不同组合,可以实现多位数码管的显示。

(3)译码电路:将单片机输出的数字信号转换为数码管所需的显示信号。

常用的译码电路有BCD-7段译码电路和二进制-7段译码电路。

3. C语言编程本实训采用C语言编写单片机程序,实现数码管的显示功能。

主要步骤如下:(1)初始化单片机:设置单片机的工作模式、定时器等。

(2)编写数码管显示函数:将数字信号转换为数码管所需的显示信号,并控制数码管显示。

(3)编写主程序:实现数码管的动态显示、按键控制等功能。

4. Proteus仿真实验使用Proteus软件进行仿真实验,验证单片机数字显示系统的设计效果。

主要步骤如下:(1)搭建仿真电路:根据设计图纸,在Proteus软件中搭建单片机、数码管、驱动电路等元件的仿真电路。

(2)编写仿真程序:将单片机程序导入Proteus软件,进行仿真实验。

(3)观察仿真结果:通过Proteus软件的波形图、仿真波形等,观察数码管的显示效果。

单片机仿真实验报告

单片机仿真实验报告

单片机仿真实验报告1.作业要求:通过T1和T0定时器中断实现对外部按键输入做出反应。

实现10以内的循环递增和递减,并且显示在数码管中。

P3.4/T0:按下键,数码管显示数字加一,从0到9。

当到达9时再加1,变为0。

P3.5/T1:按下键,数码管显示数字减一,从9到0。

当到达0时再减一,变为9。

2.设计思路:用定时器的内触发方式来实现中断,用以实现对外部按键的反应。

其思路是:定时器经过一定时间的时延后,溢出,内部中断被触发。

在中断服务程序中查看P3.4和P3.5的状态,对应的状态实现对应的功能。

注意:(中断使用电平触发,其中时延时间应小于等于外部按键按下产生电平变化的时间,才能保证按键每次按下有效。

在实验过程中可以不断调节实验时间,已达到要求的效果。

)程序思路步骤:(1)把数码管要显示的0-9,做成一个数组,方便调用。

(2)设置定时器T0和T1为中断方式1,选择合适的初值赋给定时器,开中断开关。

(3)中断被触发后,查看外部按键按下的是什么,在中断执行程序里,写入每个按键对应的程序。

(T0对应数码管显示的数递增,T1对应数码管显示的数递减。

)3.特殊功能寄存器的设置:中断允许寄存器IEEA全局中断允许位,此次取EA=1ET0定时器/计数器0中断允许位,此次取ET0=1ET1定时器/计数器1中断允许位,此次取ET1=1中断优先级寄存器IP本实验不用设置,可使用默认值。

定时器/计数器工作方式寄存器TMODM1 M0 工作方式C/T 功能选择。

为0时定时器方式,为1时计算器方式。

GATE 门控位。

为0时,只要控制TR0或TR1置1即可开始相应定时器,为1时则还需考虑INT0/INT1本次试验令TMOD=01010101定时器选工作方式1,为16位定时器。

定时器/计数器控制寄存器TCON本实验不用设置,可使用默认值。

ORG 0000HLJMP MAINORG 000BHLJMP TSRV0ORG 001BHLJMP TSRV1ORG 0030HMAIN:SETB EA //开总中断SETB T0 //开定时器0SETB T1 //开定时器1SETB ET0 // 启动T0中断SETB ET1 //启动T1中断SETB TR0 //开TL0SETB TR1 //开TH0SETB P1.0SETB P1.1SETB P1.2MOV DPTR,#TABLE //将表格中数据存放MOV R1,#0MOV A ,R1MOVC A,@A+DPTR //间接访问MOV R2,AMOV TMOD, #55H // 选择工作方式1MOV TL1, #(65536-1) MOD 256 //赋TL1初值MOV TH1, #(65536-1)/256 //赋TH1初值,延时一个机器周期(1us)MOV TL0, # (65536-1) MOD 256 //赋TL0初值MOV TH0, # (65536-1)/256 //赋TH0初值,延时一个机器周期(1us)LOOP:MOV P0,R2 //把R2数据放到P0中NOP //空运行NOPNOPSJMP LOOP //跳转到LOOPTSRV0:INC R1 //R1 加一CJNE R1,#10,RETURN //判断R1是否到10 若为10执行下面,否则跳转到RETURN。

单片机设计实验报告简单计算器的设计

单片机设计实验报告简单计算器的设计

目录1.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (2)2.1主控模块 (2)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (4)2.1.4 STC89C52单片机的定时/计数器 (4)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (5)2.3 LCD液晶显示器简介 (6)2.3.1液晶模块简介 (6)2.3.2液晶显示部分与89S52的接口 (7)3系统软件设计 (9)3.1系统软件流程图 (9)3.2系统整体原理图 (10)4.系统调试 (11)4.1硬件调试 (11)4.2软件调试 (11)4.3调试结果 (12)5. 心得体会 (13)1.总体方案选择1.1 实验要求:1)通过小键盘实现数据的输入,并在LED数码管上显示2)实现+、-、*、/3)在LED数码管上显示结果4)并有清零,退出功能1.2方案设计本系统以STC89C52单片机为控制核心,对系统进行初始化,主要完成对键盘的响应、液晶显示灯功能的控制,起到总控和协调各模块之间工作的作用。

单片机通过检测键盘读取使用者按下对用功能的按键,然后通过单片机内部运放把运算的结果显示在液晶屏幕上。

图1-1系统结构框图本系统结构如图1-1所示,本设计可分为以下模块:单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。

下面对各个模块的设计方案逐一进行论证分析。

2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。

STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。

STC89C52单片机的基本组成框图见图2-1。

单片机设计实验报告简单计算器的设计

单片机设计实验报告简单计算器的设计

目录1.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (2)2.1主控模块 (2)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (4)2.1.4 STC89C52单片机的定时/计数器 (4)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (5)2.3 LCD液晶显示器简介 (6)2.3.1液晶模块简介 (6)2.3.2液晶显示部分与89S52的接口 (7)3系统软件设计 (9)3.1系统软件流程图 (9)3.2系统整体原理图 (10)4.系统调试 (11)4.1硬件调试 (11)4.2软件调试 (11)4.3调试结果 (12)5. 心得体会 (13)1.总体方案选择1.1 实验要求:1)通过小键盘实现数据的输入,并在LED数码管上显示2)实现+、-、*、/3)在LED数码管上显示结果4)并有清零,退出功能1.2方案设计本系统以STC89C52单片机为控制核心,对系统进行初始化,主要完成对键盘的响应、液晶显示灯功能的控制,起到总控和协调各模块之间工作的作用。

单片机通过检测键盘读取使用者按下对用功能的按键,然后通过单片机内部运放把运算的结果显示在液晶屏幕上。

图1-1系统结构框图本系统结构如图1-1所示,本设计可分为以下模块:单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。

下面对各个模块的设计方案逐一进行论证分析。

2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。

STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。

STC89C52单片机的基本组成框图见图2-1。

单片机计数器输入输出原理实验

单片机计数器输入输出原理实验

单片机原理实验报告实验三:计数器输入输出实验学院: 物理与机电工程学院专业: 电子科学与技术班级: 2013 级 2 班学号:姓名:指导老师:实验三计数器输入输出实验目的:学习单片机用定时器/计数器来输入输出。

内容:编程计数,计满溢出将二极管点亮或熄灭。

设备:EL-EMCU-I试验箱、EXP-89S51/52/53 CPU板。

编程:首先要把相关的引脚设置在输入状态,然后写一个计数程序,选用计数器T0、工作方式2、计数4次,溢出将P0口接的发光二极管取反点亮,观察二极管状态和计数次数是否一致。

步骤:1、将CPU板正确安放在CPU接口插座上,跳线帽JP2短接在上侧。

2、连线:用导线将试验箱上的的IO1连接到L1输出端上,T0连接到计数器的P+上面,连接好仿真器。

3、实验箱上电,在PC机上打开Keil C环境,打开实验程序文件夹IO_INPUT下的工程文件IO_INPUT.Uv2编译程序,上电,在程序注释处设置断点,进入调试状态,打开窗口Peripherals-->IO-Port-->P0,改变P+状态记录次数,运行程序到断点处,观察窗口的数值与开关的对应关系。

4、整理器材,离开实验室。

ORG 0000HAJMP MAINORG 000BH //开T0中断SJMP L1ORG 0030HMAIN:MOV P0,#00HMOV A,P0MOV TMOD,#06H //T0计数,方式2 MOV TH0,#0FDHMOV TL0,#0FDH //计数3次SETB EA //开中断SETB ET0 //允许T0溢出SETB TR0 //SJMP $L1:CLR ET0CPL AMOV P0,ASETB ET0RETI程序分析:从上面的程序可以看出我们需要用导线将试验箱上的IO1连接到L1发光二极管上,连接好仿真器。

再通过T0计数的值来对P0口所接的对应的发光二极管的状态。

结论:通过上面这段程序,我们实现了用外部中断T0来计数,以此控制P0口所接的发光二极管的亮灭。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

23.模拟计算器数字输入及显示
1.实验任务
(1.开机时,显示“0”
(2.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”
提示音。

2.电路原理图
图4.23.1
3.系统板上硬件连线
(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”
区域中的SPK IN端口上;
(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
(3.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(4.把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
4.相关程序设计内容
(1.行列式键盘输入及按键功能设定;
(2.动态数码显示;
(3.数码显示方式处理;
5.汇编源程序
(略)
6.C语言源程序
#include <AT89X51.H>
unsigned char code
dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x 00};
unsigned char code
dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,16,16,16,16,16,16,16};
unsigned char dispbitcount;
unsigned char temp;
unsigned char i,j;
unsigned char key;
unsigned char keypos;
bit alarmflag;
void change(unsigned char *p,unsigned char count)
{
while(count>0)
{
*(p+count)=*(p+count-1); count--;
}
}
void main(void)
{
TMOD=0x01;
TH0=(65536-4000) / 256;
TL0=(65536-4000) % 256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=10;
break;
}
if ((key>=0) && (key<10))
{
keypos++;
if(keypos<8)
{
change(dispbuf,keypos); dispbuf[0]=key;
}
else
{
keypos=8;
alarmflag=1;
}
}
temp=P3;
P1_0=~P1_0;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; }
alarmflag=0;
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=11;
break;
}
if ((key>=0) && (key<10))
{
keypos++;
if(keypos<8)
{
change(dispbuf,keypos); dispbuf[0]=key;
}
else
{
keypos=8;
alarmflag=1;
}
}
temp=P3;
P1_0=~P1_0;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; }
alarmflag=0;
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e:
key=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=12;
break;
}
if ((key>=0) && (key<10))
{
keypos++;
if(keypos<8)
{
change(dispbuf,keypos); dispbuf[0]=key;
}
else
{
keypos=8;
alarmflag=1;
}
}
temp=P3;
P1_0=~P1_0;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; }
alarmflag=0;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
if ((key>=0) && (key<10))
{
keypos++;
if(keypos<8)
{
change(dispbuf,keypos); dispbuf[0]=key;
}
else
{
keypos=8;
alarmflag=1;
}
}
temp=P3;
P1_0=~P1_0;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; }
alarmflag=0;
}
}
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000) / 256;
TL0=(65536-4000) % 256;
P0=dispcode[dispbuf[dispbitcount]];
P2=dispbitcode[dispbitcount];
dispbitcount++;
if (dispbitcount==8)
{
dispbitcount=0; }
if (alarmflag==1) {
P1_1=~P1_1;
}
}。

相关文档
最新文档