如果需要设计一个十十六进制减法的减法计算器,试问应该选用何种电路

十六进制计算器 | 在线十六进制计算器
你可以轻松地将十进制数字转换成十六进制的数字!来试试我们的十六进制计算器吧!
将十进制数字转换成十六进制数字
十进制数字
十六进制数字
将十六进制数字转换成十进制数字
十六进制数字
十进制数字
将此计算器放到您的网站上
使用我们的十六进制计算器来进行十进制数字与其之间的转换。
十六进制计算器是怎么样工作的呢?
十六进制数字的转换标准如下:
十六制数字转换的股则不难理解,但实际操作起来却不是很方便,但是利用我们的十六进制计算器可以方便地解决各种转换问题。君,已阅读到文档的结尾了呢~~
加减法器的设计 精心收集的各类精品文档,欢迎下载!
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
加减法器的设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口查看: 1587|回复: 0
用STC52的单片机做的一个简单的4位数的加减,乘除计算器
用STC52的单片机做的一个简单的4位数的加减,乘除计算器,电路设计简单。附件内容包括四位数计算器仿真电路和实现源码。
0.png (14.56 KB, 下载次数: 10)
09:44 上传
0.png (65.06 KB, 下载次数: 11)
09:45 上传
原代码:
#include &REG52.H&& && && & //51单片机标准寄存器声明头文件
#include &bsp_GOG1.h&& &//这个头文件用于映射GOG1学习板载硬件接口
/*计算器的运算状态定义:*/
#define NoKey& && & 0xaa&&//没有按键按下的状态
#define ErrKey& && &0xff&&//错误的按键状态/干扰
#define DpyErr& && && && &0x0e&&//错误显示状态(码表数组第14个元素:'E')
#define DpyCle& && &0x10&&//清屏(码表数组第16个元素:0xff 关闭数码管)
#define InCount& && && &0xf0&&//有运算符输入状态
#define InErrEqu& && && & 0x0f&&//有等号输入状态
#define NoCountFlag 0xa5&&//没有运算符的状态
/*矩阵按键 功能定义: */
#define ADD& && &&&15& && && & //'#':加法&&S15
#define SUB& && &&&12& && && & //'C':减法&&S12
#define MUL& && &&&14& && && & //'*':乘法&&S13
#define DIV& && &&&11& && && & //'B':除法&&S8
#define EQU& && &&&13& && && & //'D':等于&&S16
#define CLE 10& & //'A':清除&&S4
/*相关子函数的声明:*/
void delayms(unsigned int ms);& && && && && && && && &&&//延时函数
void SegDisplay(unsigned char casebit);& && && &//数码管显示函数
unsigned char ReadKeyPad(void);& && && & //读取矩阵键盘函数
void Timer0Init(void);& && && && && && && && && && && && && &&&//定时器0初始化函数
unsigned char CheckInput(void);& && && && && && && && & //计算器检查输入状态函数
void DatUnpack(unsigned int dat);& && && && && &&&//计算器数据拆分函数
bit CheckNum(unsigned int dat);& && && && && && && && & //计算器数据有效性检查函数
void WarmDpy(unsigned char err);& && && && && &&&//计算器错误显示函数
void ComputeState(unsigned char dat);& && && &//计算器计算过程函数
//数码管段码表 共阳&&17个元素: 0~F & 0xff
unsigned char code SegCode[17]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
& && && && && && && && && && && &0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned int A& && && && &&&//运算结果
bit AnsFlag=0;& && && && &//运算结果存在标志
bit InFlag1=0;& && && && && && && & //输入有效数字1标志
bit InFlag2=0;& && && && && && && & //输入有效数字2标志
unsigned char CountF&&//运算符
unsigned int&&temp1=0,temp2=0;//输入的2个运算的数字
unsigned char DisBuff[4]={DpyCle,DpyCle,DpyCle,DpyCle};//数码管显示缓存
/*******************************************************************************
&&* @brief&&mian& && && &&&(简介)
&&* @param&&无& && && && && && & (参数)
&&* @retval 无& && && && && && & (返回值)
&&******************************************************************************/
void main(void)& && && && && && && && && && && && &//程序从这里开始
{
& && && && && && && && && &//保存单个按键值的变量
& &
& & CountFlag=NoCountF& && && && && & //运算符初始状态
& & Timer0Init();& && && && && && && && && && &&&//定时器0初始化
& & while(1)
& & {
& && &&&in=CheckInput();
& && &&&while(in == NoKey) in=CheckInput(); //没有按键按下,在此等待
& && &&&if(in !=ErrKey)& && && && && & //按键有效
& && &&&{
& && && & ComputeState(in);&&
& && &&&}
& && &&&else&&WarmDpy(DpyErr); //按键无效,报错 'E'
& & }
}
/*******************************************************************************
&&* @brief&&ComputeState: 计算过程程序
&&* @param&&unsigned char dat
&&* @retval 无
*******************************************************************************/&&
void ComputeState(unsigned char dat)
{
& && && && &//保存运算操作数的变量
& & if(AnsFlag == 1)& &&&//判断上一次运算结果完成标志
& & {
& && &&&WarmDpy(DpyCle); //清屏
& && &&&AnsFlag=0;& && && && && &&&//清除有效运算完成标志
& & }
& & if((dat !=InCount)&(dat !=InErrEqu)&(dat &10)) //按下的键为数字
& & {
& && &&&if(CountFlag == NoCountFlag) //没有运算符存在,保存第一个数
& && &&&{
& && && && &num = temp1;
& && && && &num *= 10;& && && && && && && && && && && &//输入的数字依次进高位
& && && && &num +=
& && && && &if( CheckNum(num)==1 )& &//判断数据有效性
& && && && &{& && && && && && && && && && && && && && && &//有效在数字范围
& && && && && & temp1 =& && && && && && &//保存第一个数字
& && && && && & InFlag1 = 1;& && && &//输入有效数字1标志
& && && && && & DatUnpack(temp1);& & //拆分数据,更新显示缓存
& && && && &}
& && && && &else WarmDpy(DpyErr);& & //超出范围报错
& && &&&}
& && &&&else& && && && &&&//运算符存在 ,保存第二个数
& && &&&{
& && && && &num = temp2;
& && && && &num *= 10;
& && && && &num +=
& && && && &if(CheckNum(num)==1)
& && && && &{
& && && && && & temp2 =
& && && && && & InFlag2 = 1;& &&&//输入有效数字2标志
& && && && && & WarmDpy(DpyCle); //清除第一个数的显示,消除'余晖'
& && && && && & DatUnpack(temp2);//更新显示缓存
& && && && &}
& && && && &else WarmDpy(DpyErr);
& && &&&}
& & }
& & else& & //按下的键为非数字(4则运算符被保存,这里考虑 清除键和 错误等号)
& & {
& && &&&if(CLE == dat)& && && && && &&&//按下的为清除键
& && &&&{
& && && && &CountFlag = NoCountF //清除运算符
& && && && &InFlag1 =0;& && && && && && && && && && && &//清除输入有效数字1标志
& && && && &InFlag2 =0;& && && && &&&//清除输入有效数字2标志
& && && && &AnsFlag=0;& && && && && && && && && && && &//清除运算结果存在标志
& && && && &temp1=0,temp2=0;& && && &//清除输入的2个运算数
& && && && &WarmDpy(DpyCle);& && && && && &&&//清屏
& && && && &Ans=0;& && && && && && && && && && && && && &&&//清除上一次运算结果& && && &
& && &&&}
& && &&&
& && &&&if(InErrEqu == dat)& && && && && && && && && & //运算表达式不完整时,按下等号的情况
& && && && &WarmDpy(DpyErr);& && && &//报错 'E'
& & }
}
/*******************************************************************************
&&* @brief&&ReadKeyPad& && &&&用于读取矩阵键盘键值
&&* @param&&无
&&* @retval 矩阵键盘键值
&&* @note& &键盘键值设置请修改case分支临时变量b的赋值
& && && && && && && && && && && && && && && && &0xff 作为错误代码,表示读取出错
******************************************************************************/
unsigned char ReadKeyPad(void)
{
& & unsigned char a,c,b=NoK //b 初始值为无按键的状态
& & KeyPad = 0x0f;& & //初始状态,行号(P3^0~P3^3)高电平,列号(P3^4~P3^7)低电平
& & if(KeyPad != 0x0f)
& & {
& && &&&delayms(20);& && && && && &&&//按键消抖动(延时实现)
& && &&&if(KeyPad != 0x0f)& && && &//按键被按下,初始状态改变
& && &&&{
& && && && &a = KeyP& && && && && &&&//读取矩阵键盘的行号
& && &&&}
& && &&&KeyPad = 0xf0;& && && && && &&&//初始状态反转
& && &&&c = KeyP& && && && && && && && & //读取矩阵键盘的列号
& && &&&a |=& && && && && && && && && && && &//按位'或',通过行号,列号唯一确定矩阵按键值
& && &&&switch (a) {
& && &&&case 0xee:
& && && && &b = 1;& && && && && && && && &&&//S1
& && && && &
& && &&&case 0xed:
& && && && &b = 4;& && && && && && && && &&&//S5
& && && && &
& && &&&case 0xeb:
& && && && &b = 7;& && && && && && && && &&&//S9
& && && && &
& && &&&case 0xe7:
& && && && &b = MUL;& && && && && && &//S13'MUL'
& && && && &
& && &&&case 0xde:
& && && && &b = 2;& && && && && && && && &&&//S2
& && && && &
& && &&&case 0xdd:
& && && && &b = 5;& && && && && && && && &&&//S6
& && && && &
& && &&&case 0xdb:
& && && && &b = 8;& && && && && && && && &&&//S10
& && && && &
& && &&&case 0xd7:
& && && && &b = 0;& && && && && && && && &&&//S14
& && && && &
& && &&&case 0xbe:
& && && && &b = 3;& && && && && && && && & //S3
& && && && &
& && &&&case 0xbd:
& && && && &b = 6;& && && && && && && && & //S7
& && && && &
& && &&&case 0xbb:
& && && && &b = 9;& && && && && && && && & //S11
& && && && &
& && &&&case 0xb7:
& && && && &b = ADD;& && && && && &&&//S15 'ADD'
& && && && &
& && &&&case 0x7e:
& && && && &b = CLE;& && && && && &&&//S4 'CLE'
& && && && &
& && &&&case 0x7d:
& && && && &b = DIV;& && && && && &&&//S8 'DIV'
& && && && &
& && &&&case 0x7b:
& && && && &b = SUB;& && && && && &&&//S12 'SUB'
& && && && &
& && &&&case 0x77:
& && && && &b = EQU;& && && && && &&&//S16 '='
& && && && &
& && &&&default :& && && && && && && && & //没有和 a 的匹配项
& && && && &b = ErrK& && && && && &&&//错误的按键值
& && && && &
& && &&&}
& && &&&KeyPad = 0xf0;& && && && && && && && &//松手检测
& && &&&while (KeyPad != 0xf0);& && &&&//当没有松手,将在此一直等待
& & }
& & return (b);& && && && && && && && && && &&&//返回读取的按键值
}
/******************************************************************************
&&* @brief&&delayms& && &&&毫秒级延时函数
&&* @param&&ms& && &&&延时的毫秒数 允许值 unsigned int范围
&&* @retval 无
&&* @attention& &这个函数只是用于12T 8051内核的单片机运行于12Mhz
&&*****************************************************************************/
void delayms(unsigned int ms)& && && &//延时子程序(晶振12Mhz)
{
& &
& & while(ms--)
& & {
& && &&&for(i = 0; i & 120; i++);
& & }
}
/******************************************************************************
&&* @brief&&SegDisplay 数码管显示&定时器中断程序组成动态显示
&&* @param&&casebit& && &&&用于选择数码管的位 允许值 0~4
&&* @retval 无
&&* @attention& &这个函数需配合定时器中断服务程序
&&*****************************************************************************/
void SegDisplay(unsigned char casebit)
{
& & Seg7_Bits = 0& && && && && && && && && &&&//关闭所有数码管
& & Seg7_Data =SegCode[DisBuff[casebit]];//先把段码值赋给P1(段选端口)
& & switch(casebit)
& & {
& & case 0:
& && &&&Seg7_Bit1 = 0;
& && &&&
& & case 1:
& && &&&Seg7_Bit2 = 0;
& && &&&
& & case 2:
& && &&&Seg7_Bit3 = 0;
& && &&&
& & case 3:
& && &&&Seg7_Bit4 = 0;
& && &&&
& & default :
& && &&&Seg7_Bits = 0& && &&&//关闭所有数码管
& && &&&Seg7_Data = 0
& && &&&
& & }
}
/************************************************************************************
&&* @brief&&DatUnpack:数据拆分,同时把数据的千位,百位,十位,个位赋给显示缓存数组DisBuff[]
&&* @param&&unsigned int dat
&&* @retval 无
&&***********************************************************************************/
void DatUnpack(unsigned int dat)
{
& & if((dat&10))& && && && && && && && && && && && & //1位数
& && &&&DisBuff[0]=
& & else if((dat&100)&&(dat&=10))& && && &//2位数
& & {
& && &&&DisBuff[1]=dat/10;
& && &&&DisBuff[0]=dat%10;
& & }
& & else if((dat&1000)&&(dat&=100))& && && &//3位数
& & {
& && &&&DisBuff[2]=dat/100;
& && &&&DisBuff[1]=dat%100/10;
& && &&&DisBuff[0]=dat%100%10;
& & }
& & else if ((dat&10000)&&(dat&=1000))//4位数
& & {
& && &&&DisBuff[3]=dat/1000;
& && &&&DisBuff[2]=dat%;
& && &&&DisBuff[1]=dat%;
& && &&&DisBuff[0]=dat%;
& & }
}
/*******************************************************************************
&&* @brief&&unsigned char CheckInput(): 检查矩阵键盘输入按键的类型(简介)
&&* @param&&无& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && & (参数)
&&* @retval&&数字,功能键(CLE,EQU,+,-,*,/),无按键的状态& && && && && && && && &&&(返回值)
&&******************************************************************************/
unsigned char CheckInput(void)
{
& &
& & x=ReadKeyPad();& && && &//调用读按键子程序
& & if(x != ErrKey)& && && &//是否为错误按键值
& & {
& && &&&if((x&10)|(x == NoKey)| (x == CLE))//按下的为数字,或没有按键按下,或清除键
& && &&&{
& && && && &return (x);
& && &&&}
& && &&&else& && && &&&//按下的为 运算符(四则运算 和 等号)
& && &&&{
& && && && &if(x == EQU) // 按下的为 等号&=&
& && && && &{& && && && && && && && && && && && && && && && && &&&
& && && && && & switch (CountFlag)
& && && && && & {
& && && && && & case ADD:& && && &Ans = temp1+temp2;
& && && && && & case SUB:& && && &Ans = temp1-temp2;
& && && && && & case MUL:& && && &Ans = temp1*temp2;
& && && && && & case DIV:& &if (temp2 == 0) //除法分母为0,报错
& && && && && && &&&{
& && && && && && && && &WarmDpy(DpyErr);
& && && && && && && && &
& && && && && && &&&}
& && && && && && &&&else
& && && && && && &&&{
& && && && && && && && &Ans = temp1/temp2;//只计算除法商的整数,暂没有考虑小数
& && && && && && && && &
& && && && && && &&&}
& && && && && & }
& && && && && & if( CheckNum(Ans)&&(InFlag1 ==1)&&(InFlag2 ==1))//检测运算的有效性
& && && && && && && && && && && & {& && &
& && && && && && &&&DatUnpack(Ans);& && && && && & //运算结果拆分,更新显示缓存
& && && && && && &&&CountFlag = NoCountF& && &&&//清除运算符
& && && && && && &&&temp1=0,temp2=0;& && && && && && && && &//清除运算数字
& && && && && && &&&AnsFlag = 1;& && && && && && && && && && &&&//运算结果存在标志
& && && && && && &&&InFlag1 =0;& && && && && && && && && && &&&//清除有效数字输入标志
& && && && && && &&&InFlag2 =0;
& && && && && && &&&Ans=0;& && && && && && && && && && && && && & //清除运算结果
& && && && && && &&&return (NoKey);& && && && && && && && &//此次运算完成,返回无按键状态
& && && && && && &}
& && && && && & else //WarmDpy(DpyErr) ;//运算表达式不完整或结果超出范围,报错
& && && && && && &&&return (InErrEqu);& && && && && &&&//返回有等号输入的状态
& && && && && && &&&}
& && && && &else&&//按下的为 4则 运算符(+ ,-,*, /)
& && && && &{
& && && && && & CountFlag =& && && && && &&&//保存运算符
& && && && && & return (InCount);& && && && && &&&//返回有运算符输入的状态
& && && && &}
& && &&&}
& & }
& & else&&return (ErrKey);& && && && && & //返回错误按键值状态
}
/*******************************************************************************
&&* @brief&&CheckNum: 检查计算器运算数的有效性
&&* @param&&dat
&&* @retval bit 有效: 1,无效: 0
&&******************************************************************************/
bit CheckNum(unsigned int dat)
{
& & if (dat & 10000)
& && &&&return 1;& && && & //数据有效
& & else
& && &&&return 0;
}
/*******************************************************************************
&&* @brief&&WarmDpy:数码管错误显示
&&* @param&&err& && && && && & 实则:'E'的码段值元素的下标
&&* @retval 无
&&******************************************************************************/
void WarmDpy(unsigned char err)
{
& & DisBuff[0]= // 错误提示显示 'E'
& & DisBuff[1]=
& & DisBuff[2]=
& & DisBuff[3]=
}
/******************************************************************************
&&* @brief&&InitTimer0& && &&&用于初始化51单片机定时器0
&&* @param&&无
&&* @retval 无
&&* @attention& &这个函数只是用于12T 8051内核的单片机运行于12Mhz晶体的情况
&&******************************************************************************/
void Timer0Init(void)& && &&&//250微秒@12.000MHz
{
& & TMOD &= 0xF0;& && && && && & //设置定时器模式
& & TMOD |= 0x02;& && && && && & //设置定时器模式
& & TL0 = 0x06;& && && && && && &&&//设置定时初值
& & TH0 = 0x06;& && && && && && & //设置定时重载值
& & ET0 = 1;& && && && && && & //打开定时器0中断
& & TF0 = 0;& && && && && && & //清除TF0标志
& & TR0 = 1;& && && && && && & //定时器0开始计时
& & EA=1;& && && && && && && && && &//打开总中断
}
/******************************************************************************
&&* @brief&&Timer0Interrupt& && &&&51单片机定时器0中断服务程序
&&* @param&&无
&&* @retval 无
&&* @attention&&这个函数后的修饰符 “interrupt 1” 不可修改
&&******************************************************************************/
void Timer0Interrupt(void) interrupt 1
{
& & static unsigned char SegD
& & if(SegDbit == 4)
& & {
& & SegDbit=0;
& & Led2=~Led2;& && && && && && &&&//D3:1ms闪烁一次,系统正常运行
& & }
& & SegDisplay(SegDbit);//数码管逐位显示
& & SegDbit++;& && && && && && &&&//每进一次中断,自加1,把下一个数据赋给下一个数码管
}
复制代码
/*注意上面头文件&bsp_GOG1.h&包含一个可选宏定义&&
& & 若需使用扩展板请增加全局宏定义 _GOG1Plus
& & 定义方式
& & 菜单 Project-&Options for Target-&C51-&Define
& & 在此处填入& &“_GOG1Plus”
在此代码完全兼容,第三次课的矩阵按键程序,在此感谢魏同学的帮助 */
计算器功能实现:4位数字的加,减,乘法,除法没有做商的小数部分
1.对输入运算数的有效性检查,即超过9999时,显示错误;
2,用LED--》D3来指示系统的正常运行状态
3,运算的结果超过9999时,提示错误显示;
4,当系统运行错误时,或者显示乱码时,按A键清除数码管显示;
5,除法运算时,的二个运算数为0时,提示错误显示
6, 运算表达式不完整时,报错:
& && && && && && && & (1)无数 * 第二个数 = 报错
& && && && &&&(2)第一个数 * 无数 = 报错
& && && && &&&(3)直接按等号,报错
7,D3 LED灯实际是隔1ms 闪烁一次,
/*矩阵按键 功能定义:
#define ADD& & 15& && &//'#':加法&&S15
#define SUB& & 12& && &//'C':减法&&S12
#define MUL& & 14& && &//'*':乘法&&S13
#define DIV& & 11& && &//'B':除法&&S8
#define EQU& & 13& && &//'D':等于&&S16
#define CLE& &&&10& && &&&//'A':清除&&S4
全部资料(压缩包)下载:
仿真文件:
(16.63 KB, 下载次数: 6)
09:47 上传
点击文件名下载附件
下载积分: 黑币 -5
(98.76 KB, 下载次数: 7)
09:47 上传
点击文件名下载附件
下载积分: 黑币 -5
(787 Bytes, 下载次数: 5)
09:47 上传
点击文件名下载附件
下载积分: 黑币 -5
Powered by& & 十进制计数器
十进制计数器
二 基于一般模型的十进制计数器设计。 设计一个基于一般模型的十进制...计数器种类很多。按构成计数器中的各触发器是否使用一个时钟脉冲源来分,有同..这种方法还有一个好处,不管是同步计数器还是异步计数器,不管是二进制计数器..计数器的种类很多。按构成计数器中的各触发器是否使用一个时钟脉冲源来分 ,..本实验所用集成芯片为异步清零同步预置四位8421码10进制加法计数器74LS161,..计数器种类繁多,根据计数体制的不同,计数器可分成二进制(即2n进制)计数器和..如果按照计数数字的增减可分为加法计数器、减法计数器和可逆计数器三种;如果..当然,计数器状态编码并非必须按二进制数的规律编码,可以给M进制计数器任意地..十进制定点加减法计算器单片机设计报告 要求 设计十进制定点加减法计算器。..可保持同步的四位二进制加法计数器74LS161、两个译码集成电路CD4511、两个L..设计一个六进制的计数器,需要(个状态变量。 &答案&4 填空题 0.5 2 1 在同步.. 三、实验内容 1、用D触发器设计异步四位二进制加法计数器。 2、用JK触发器..试用两片CT74163构成一个六十进制计数器。(可选用适当的门电路)(12分) 七、..了解常用中规模计数器的电路结构及应用。 3、二——十进制计数器:掌握常用二..D触发器7474功能测试; J-K触发器7476功能测试; 用7476组成二位二进制计数器..若用INB输入,QB、QC、QD三个端子作输出,可作一个五进制计数器;将QA与INB输入.. 图6 单稳触发器 图7 单稳态触发器输入输出波形 根据精度要求,采用4个十进制.. A.1 B.2 C.4 D.8 11.用二进制异步计数器从0做加法,计到十进制数178,则最....第六章:计数器 一、单选题 1.同步计数器和异步计数器比较,同步计数器的显著..秒信号为负时进行计数。
(6)计数器 计数器的作用是对输入脉冲计数。根据设..
本文十进制计数器的相关文章
1、2、3、4、5、6、7、8、9、10、}

我要回帖

更多关于 十六进制减法计算器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信