生产实习100以内加法计算器.docx
《生产实习100以内加法计算器.docx》由会员分享,可在线阅读,更多相关《生产实习100以内加法计算器.docx(35页珍藏版)》请在冰豆网上搜索。
生产实习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;//清零等号按键的键