生产实习100以内加法计算器.docx

上传人:b****4 文档编号:24362253 上传时间:2023-05-26 格式:DOCX 页数:35 大小:425.51KB
下载 相关 举报
生产实习100以内加法计算器.docx_第1页
第1页 / 共35页
生产实习100以内加法计算器.docx_第2页
第2页 / 共35页
生产实习100以内加法计算器.docx_第3页
第3页 / 共35页
生产实习100以内加法计算器.docx_第4页
第4页 / 共35页
生产实习100以内加法计算器.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

生产实习100以内加法计算器.docx

《生产实习100以内加法计算器.docx》由会员分享,可在线阅读,更多相关《生产实习100以内加法计算器.docx(35页珍藏版)》请在冰豆网上搜索。

生产实习100以内加法计算器.docx

生产实习100以内加法计算器

一.实习目的

增加学生对基本电子器件、单片机的感性认识,锻炼学生电路板布局、布线、电路组装、单片机程序编制、焊接与调试的动手能力,培养学生对电子的兴趣。

二.实习任务

1、硬件焊接

注意:

在进行器件布局和布线之前,请了解好自己的软件设计任务,并尽量根据任务具体描述进行布线连接。

(a)根据所给原理图完成单片机最小系统的焊接:

单片机最小系统(供电,串口程序下载,晶振,复位电路)

(b)将一下电路布线焊接,与单片机最小系统连接

(1)4*4矩阵按键

(2)双位数码管

(3)8个LED灯

(4)蜂鸣器

2、程序软件设计

使用上述电路完成以下简单功能:

2.1:

(1)4LED跑马灯:

4个LED依次点亮,同时数码管显示对应LED灯的号码(动态显示00-01-02-03-04),当第四号灯熄灭第一号灯亮起时,蜂鸣器响;

(2)任意选取2个按键(矩阵按键扫描方式)

按键1号按下跑马灯暂停,再次按下继续

2号按键复位:

按下按键使跑马灯从一号灯开始亮

2.2:

100以内加法计算器

10按键代表数字0-9,1按键加,1按键减,一按键等号,一按键清除

2位数码管显示当前输入数字,初始为00,按下数字按键输入一个0-99的数字

按下加或减按键,继续输入数字,按下等号,数码管显示计算结果。

结果超过100,蜂鸣器响数码管和led显示溢出错误图样

结果为负数,蜂鸣器响数码管和led显示负数错误图样。

 

3.程序流程图:

上图为跑马灯按键流程图

上图为跑马灯流程图

 

上图为计算器加法流程图

上图为计算器减法流程图

 

三.电路原理图和PCB图

电路原理图

四.程序代码:

4.1跑马灯程序:

/******************************************

Main函数:

/******************************************

标题:

四个LED灯跑马灯程序

单片机:

STC90C52

备注:

4LED跑马灯:

4个LED依次点亮,同时数码管显示对应LED灯的号码(动态显示00-01-02-03-04),

当第四号灯熄灭第一号灯亮起时,蜂鸣器响;

按键14按下跑马灯暂停,再次按下继续

按键15按下复位:

按下按键使跑马灯从一号灯开始亮

按键16按下关闭蜂鸣器

******************************************/

#include

#include

#include"../head/smg.h"

#include"../head/key.h"

#include"../head/led_flow.h"

voidmain(void)

{

while

(1)

{

LED_FLOW(200);

}

}

数码管程序

单片机:

STC89C52

备注:

两位数码管动态显示程序

**************************************/

#include

#include

#include"../head/smg.h"

//数码管显示数字码表--------0----1-----2----3----4---5-----6----7---8----9---

unsignedchardispnum[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

/**********************************

函数功能:

延时

备注:

51,晶振为12MHz的延时函数,

数据类型为unsignedint时,参数为1时延时28us

且每加1增加12us

***********************************/

voidSMG_delay(unsignedinttime)

{

while(time--)

_nop_();

}

/**********************************

函数功能:

数码管显示函数

参数:

显示数据dataa为0~99的十进制数

备注:

dataa只能为两位数

***********************************/

voiddisplay(unsignedchardataa)

{

unsignedcharten,unit;//ten为dataa的十位、unit为dataa的个位

ten=dataa/10;//取dataa的十位赋给ten

unit=dataa%10;//取dataa的个位赋给unit

W1=0;W2=1;//选择个位数码管亮

NTUBE=dispnum[unit];//将dataa的个位的数码管显示数字码送给P2口显示

SMG_delay(100);//延时一会儿

NTUBE=0xFF;//让数码管所有段都不显示,消除尾影

W1=1;W2=0;//选择十位数码管亮

NTUBE=dispnum[ten];//将dataa的十位的数码管显示数字码送给P2口显示

SMG_delay(100);//延时一会儿

NTUBE=0xFF;//让数码管所有段都不显示,消除尾影

}

流水灯程序:

/******************************************

标题:

四个LED灯跑马灯程序

单片机:

STC90C52

备注:

4LED跑马灯:

4个LED依次点亮,同时数码管显示对应LED灯的号码(动态显示00-01-02-03-04),

当第四号灯熄灭第一号灯亮起时,蜂鸣器响;

按键14按下跑马灯暂停,再次按下继续

按键15按下复位:

按下按键使跑马灯从一号灯开始亮

按键16按下关闭蜂鸣器

******************************************/

#include

#include

#include"../head/led_flow.h"

#include"../head/smg.h"

#include"../head/key.h"

//变量------------------------------------------------

externunsignedcharkeynum[16];//声明存放按键值的数组

unsignedcharflag=0;//蜂鸣器响的标志位//当第四号灯熄灭第一号灯亮起时,蜂鸣器响;

/**************************************************

函数功能:

4个LED灯的流水灯并且数码管显示相应的序号

按键14按下跑马灯暂停,再次按下继续

按键15按下复位:

按下按键使跑马灯从一号灯开始亮

按键16按下关闭蜂鸣器

参数:

speed:

流水灯的快慢

备注:

**************************************************/

voidLED_FLOW(unsignedintspeed)

{

unsignedchari,state=0;

for(state=0;state<5;state++)

{

switch(state)

{

case1:

{

LED=0xFE;//第一个灯亮

if(flag)BUZZER=0;//如果flag为真打开蜂鸣器

break;

}

case2:

{

LED=0xFD;//第二个灯亮

break;

}

case3:

{

LED=0xFB;//第三个灯亮

break;

}

case4:

{

LED=0xF7;//第四个灯亮

flag=1;

break;

}

}

for(i=speed;i>0;i--)//这里的for循环充当延时功能

{

key_scan();//按键扫描

if(keynum[14]){keynum[14]=0;state=0;}//如果按键15按下复位:

按下按键使跑马灯从一号灯开始亮

while(keynum[13])//按键14按下跑马灯暂停,再次按下继续

{

key_scan();//按键扫描

if(state)display(state);//显示当前的亮灯的序号

if(keynum[15]){keynum[15]=0;BUZZER=1;}//按键16按下关闭蜂鸣器

}

if(!

state)display(state);//初始状态显示00

if(state)display(state);//显示当前的亮灯的序号

if(keynum[15]){keynum[15]=0;BUZZER=1;}//按键16按下关闭蜂鸣器

}

}

}

键盘矩阵函数:

**********************************************

标题:

矩阵键盘扫描程序

描述:

数组keynum[16]里的16个元素对应相应的按键值

每次按键按下对应数组元素的值取反

**********************************************/

#include

#include

#include"../head/key.h"

unsignedcharkeynum[16]={0};//存放16个按键的值

/**********************************

函数功能:

延时

备注:

51,晶振为12MHz的延时函数,

数据类型为unsignedint时,参数为1时延时28us

且每加1增加12us

***********************************/

voidkeydelay(unsignedinttime)

{

while(time--)

_nop_();

}

/**********************************

函数功能:

按键扫描函数

备注:

将扫描按键值放到数组keynum[16]中

***********************************/

voidkey_scan(void)

{

KEY=0xEF;//扫描第一行

if(!

(KEY&0x01))//如果按键1按下

{

keydelay(1500);//延时10ms消抖

if(!

(KEY&0x01))keynum[0]=!

keynum[0];//如果按键1确实按下keynum[0]取反

while(!

(KEY&0x01));//等待按键1松手

}

if(!

(KEY&0x02))//如果按键2按下

{

keydelay(1500);

if(!

(KEY&0x02))keynum[1]=!

keynum[1];

while(!

(KEY&0x02));

}

if(!

(KEY&0x04))//如果按键3按下

{

keydelay(1500);

if(!

(KEY&0x04))keynum[2]=!

keynum[2];

while(!

(KEY&0x04));

}

if(!

(KEY&0x08))//如果按键4按下

{

keydelay(1500);

if(!

(KEY&0x08))keynum[3]=!

keynum[3];

while(!

(KEY&0x08));

}

KEY=0xDF;//扫描第二行

if(!

(KEY&0x01))//如果按键5按下

{

keydelay(1500);//延时10ms消抖

if(!

(KEY&0x01))keynum[4]=!

keynum[4];//如果按键5确实按下keynum[4]取反

while(!

(KEY&0x01));//等待按键5松手

}

if(!

(KEY&0x02))//如果按键6按下

{

keydelay(1500);

if(!

(KEY&0x02))keynum[5]=!

keynum[5];

while(!

(KEY&0x02));

}

if(!

(KEY&0x04))//如果按键7按下

{

keydelay(1500);

if(!

(KEY&0x04))keynum[6]=!

keynum[6];

while(!

(KEY&0x04));

}

if(!

(KEY&0x08))//如果按键8按下

{

keydelay(1500);

if(!

(KEY&0x08))keynum[7]=!

keynum[7];

while(!

(KEY&0x08));

}

KEY=0xBF;//扫描第三行

if(!

(KEY&0x01))//如果按键9按下

{

keydelay(1500);//延时10ms消抖

if(!

(KEY&0x01))keynum[8]=!

keynum[8];//如果按键9确实按下keynum[8]取反

while(!

(KEY&0x01));//等待按键9松手

}

if(!

(KEY&0x02))//如果按键10按下

{

keydelay(1500);

if(!

(KEY&0x02))keynum[9]=!

keynum[9];

while(!

(KEY&0x02));

}

if(!

(KEY&0x04))//如果按键11按下

{

keydelay(1500);

if(!

(KEY&0x04))keynum[10]=!

keynum[10];

while(!

(KEY&0x04));

}

if(!

(KEY&0x08))//如果按键12按下

{

keydelay(1500);

if(!

(KEY&0x08))keynum[11]=!

keynum[11];

while(!

(KEY&0x08));

}

KEY=0x7F;//扫描第四行

if(!

(KEY&0x01))//如果按键13按下

{

keydelay(1500);//延时10ms消抖

if(!

(KEY&0x01))keynum[12]=!

keynum[12];//如果按键13确实按下keynum[12]取反

while(!

(KEY&0x01));//等待按键13松手

}

if(!

(KEY&0x02))//如果按键14按下

{

keydelay(500);

if(!

(KEY&0x02))keynum[13]=!

keynum[13];

while(!

(KEY&0x02));

}

if(!

(KEY&0x04))//如果按键15按下

{

keydelay(1500);

if(!

(KEY&0x04))keynum[14]=!

keynum[14];

}

if(!

(KEY&0x08))//如果按键16按下

{

keydelay(1500);

if(!

(KEY&0x08))keynum[15]=!

keynum[15];

}

}

4.2计算器程序

1.

#defineLEDP0//定义发光二极管的端口为P0

//---------------------------------------------------------

sbitBUZZER=P3^5;//定义蜂鸣器的端口为P3.5

#defineADkeynum[10]//定义加号按键为11按键

#defineDEkeynum[11]//定义减号按键为12按键

#defineEQkeynum[12]//定义等号按键为13按键

#defineCLRkeynum[13]//定义清零重新输入按键为14按键

#definezerokeynum[0]//定义数字0按键为1按键

#defineonekeynum[1]//定义数字1按键为2按键

#definetowkeynum[2]//定义数字2按键为3按键

#definethreekeynum[3]//定义数字3按键为4按键

#definefourkeynum[4]//定义数字4按键为5按键

#definefivekeynum[5]//定义数字5按键为6按键

#definesixkeynum[6]//定义数字6按键为7按键

#definesivenkeynum[7]//定义数字7按键为8按键

#defineeghitkeynum[8]//定义数字8按键为9按键

#defineninekeynum[9]//定义数字9按键为10按键

/**************************************************

函数功能:

2位数码管显示当前输入数字,初始为00,按下数字按键输入一个0-99的数字

按下加或减按键

**************************************************/

2.----------------------------------------------------------------------------

#defineKEYP1//定义按键所接的单片机IO口为P1口

externunsignedcharkeynum[16];//存放16个按键的值

/**********************************

函数功能:

按键扫描函数

备注:

将扫描按键值放到数组keynum[16]中

***********************************/

3.---------------------------------------------------------------------------

#defineNTUBEP2//定义数码管段选所接的单片机IO口为P2

sbitW1=P3^6;//位定义数码管个位位选所接单片机的IO口为P3.6

sbitW2=P3^7;//位定义数码管十位位选所接单片机的IO口为P3.7

/**********************************

函数功能:

数码管显示函数

参数:

显示数据dataa为0~99的十进制数

备注:

dataa只能为两位数

***********************************/

程序:

main函数:

/*****************************************************************************

标题:

C:

100以内加法计算器

按键1~10代表数字0-9,11按键加,12按键减,13按键等号,14按键清除

2位数码管显示当前输入数字,初始为00,按下数字按键输入一个0-99的数字

按下加或减按键

继续输入数字

按下等号,数码管显示计算结果

结果超过100,蜂鸣器响数码管和led显示溢出错误图样

结果为负数,蜂鸣器响数码管和led显示负数错误图样

*****************************************************************************/

#include

#include

#include"../head/smg.h"

#include"../head/key.h"

#include"../head/C_jsq.h"

voidmain(void)

{

while

(1)

{

C_jsq();

}

}

计算器程序

/*****************************************************************************

标题:

C:

100以内加法计算器

按键1~10代表数字0-9,按键11加,按键12减,按键13等号,按键14清除

2位数码管显示当前输入数字,初始为00,按下数字按键输入一个0-99的数字

按下加或减按键

继续输入数字

按下按键13,数码管显示计算结果

结果超过100,蜂鸣器响数码管显示0和4个led全亮

结果为负数,蜂鸣器响数码管显示1和第一个led亮

*****************************************************************************/

#include

#include

#include"../head/smg.h"

#include"../head/key.h"

#include"../head/C_jsq.h"

unsignedcharsum=0;//计算结果

unsignedchartemp,temp1,temp2;

/**************************************************

函数功能:

按键1~10分别代表数字0~9;按键扫描获得输入数字

**************************************************/

voidkey_number(void)

{

key_scan();//按键扫描

if(zero)//如果按键1按下

{

zero=0;//清零按键1的键值

EQ=0;//清零等号按键的键值

BUZZER=1;//蜂鸣器关

LED=0xff;//关闭所有的LED灯

if(temp==0)temp=0;//如果当前输入的值temp为0则给temp赋0

elsetemp=temp*10+0;//如果当前输入的值temp不为0则给temp赋0

}

if(one)//如果按键2按下

{

one=0;//清零按键2的键值

EQ=0;//清零等号按键的键

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1