问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用51单片机实现一个简单计算器的功能

发布网友 发布时间:2022-04-29 09:10

我来回答

2个回答

热心网友 时间:2022-06-25 06:38

下面是我以前用来显示9999秒倒计时的原程序,仅供学习,版权所有,侵权不究。 #include <REGX51.H> #include <./stdint.h> #include <ABSACC.H> #include<AT89X51.H> #include <INTRINS.H> //------------------------------ #define TH_10MS (65536-50000)/256 #define TL_10MS (65536-50000)%256 //------------------------------------------ #define led12 XBYTE[0xf7ff] //led1与led2数码管 #define led34 XBYTE[0xefff] //led3与led4数码管 #define led_light P3_7 #define keyst P1_0 #define keyclk P1_1 volatile struct _clock { uint8_t t_s;//秒 uint8_t t_ms;//分秒 uint8_t led_lightf : 1;//中间灯 uint8_t keyf_st : 1; //开停键标志 uint8_t keyf_clk : 1; //清0键标志 uint8_t clockf_st : 1; //开始计时标志 #define STOP 0 #define START 1 uint8_t : 0; }clock; //-----------------delay----------------------------- void delay_10ms() { uint8_t i, j; for(i=0; i<100; i++) for(j=0; j<100; j++); } //-------------------10进制显示----------------------- void display_val(uint8_t data_l, uint8_t data_r) { uint8_t led_tmp12, led_tmp34; //取右边分秒 led_tmp12 = (data_r/10)%10; led_tmp12 <<=4; led_tmp12 |= (uint8_t)(data_r%10); //取左边秒 led_tmp34 = (data_l/10)%10; led_tmp34 <<=4; led_tmp34 |= data_l%10; led12 = led_tmp12;//送显示 led34 = led_tmp34; } //------------------------初始化-------------- void clr_data() { clock.t_s = 99; clock.t_ms = 99; clock.led_lightf = 0; clock.keyf_st = 0; clock.keyf_clk = 0; clock.clockf_st = 0; TR0 = 0; //关定时器 display_val(99,99); led_light = 0; } void init_sys() { clr_data(); //定时器0设置 TMOD = 0x01; //定时器0设为MAOD1 TCON = 0x00; //清标志位 TH0 = TH_10MS; TL0 = TL_10MS; //TR0 = 1; //开定时器 //IE = 0x8a; //开定时中断0,1与总开关 EA = 1; ET0 = 1; } //--------------------键盘扫描----------------- void key_scan() { bit keyf; keyf = keyst & keyclk; if(keyf) goto error; delay_10ms(); keyf = keyst & keyclk; if(keyf) goto error; clock.keyf_st = !keyst; clock.keyf_clk = !keyclk; do { keyf = keyst & keyclk; } while(!keyf); error: return ; } //--------------------键盘处理------------------- void key_deal() { if(clock.keyf_st) { if(clock.clockf_st == STOP) TR0 = 1; else TR0 = 0; clock.clockf_st = ~clock.clockf_st; clock.keyf_st = 0; } if(clock.keyf_clk) { clr_data(); clock.keyf_clk = 0; } } // -------------------main------------------------ void main() { init_sys(); while(1) { key_scan();//键盘扫描 key_deal();//键盘处理 } } //----------------------定时中断0----------------- void t0_interrupt() interrupt 1 { static t0_count = 0 , t_1s = 0; TR0 = 0; t_1s++; if(t_1s==20) { t_1s=0; clock.t_ms--; if(clock.t_ms == -1) clock.t_ms = 99; t0_count++; if(t0_count == 100) { t0_count = 0; clock.t_s--; if(clock.t_s == -1) clock.t_s = 99; } display_val(clock.t_s, clock.t_ms); clock.led_lightf = ~clock.led_lightf; led_light = clock.led_lightf; } TH0 = TH_10MS; TL0 = TL_10MS; TR0 = 1; }

热心网友 时间:2022-06-25 06:39

给你一个参考程序,这个是可行的哦,你看看这个程序
#include <</font>reg51.h>
#include <</font>intrins.h>
#include <</font>ctype.h>
#include <</font>stdlib.h>
#define uchar unsigned char
#define uint unsigned int

uchar operand1[9], operand2[9];
uchar operator;

void delay(uint);
uchar keyscan();
void disp(void);
void buf(uint value);
uint compute(uint va1,uint va2,uchar optor);

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};

uchar dbuf[8] = {10,10,10,10,10,10,10,10};

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

uchar keyscan()
{
uchar skey;

P1 = 0xfe;
while((P1 & 0xf0) != 0xf0)
{
delay(3);

while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xee: skey = '7'; break;
case 0xde: skey = '8'; break;
case 0xbe: skey = '9'; break;
case 0x7e: skey = '/'; break;

default: skey = '#';
}

while((P1 & 0xf0) != 0xf0)
;
}
}

P1 = 0xfd;
while((P1 & 0xf0) != 0xf0)
{
delay(3);

while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xed: skey = '4'; break;
case 0xdd: skey = '5'; break;
case 0xbd: skey = '6'; break;
case 0x7d: skey = '*'; break;

default: skey = '#';
}

while((P1 & 0xf0) != 0xf0)
;
}
}

P1 = 0xfb;
while((P1 & 0xf0) != 0xf0)
{
delay(3);

while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xeb: skey = '1'; break;
case 0xdb: skey = '2'; break;
case 0xbb: skey = '3'; break;
case 0x7b: skey = '-'; break;

default: skey = '#';
}

while((P1 & 0xf0) != 0xf0)
;
}
}

P1 = 0xf7;
while((P1 & 0xf0) != 0xf0)
{
delay(3);

while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xe7: skey = '$'; break;
case 0xd7: skey = '0'; break;
case 0xb7: skey = '='; break;
case 0x77: skey = '+'; break;

default: skey = '#';
}

while((P1 & 0xf0) != 0xf0)
;
}
}

return skey;
}

void main()
{
uint value1, value2, value;
uchar ckey, cut1 = 0, cut2 = 0;
uchar operator;
uchar i, bool = 0;

init:

buf(0);
disp();
value = 0;
cut1 = cut2 = 0;
bool = 0;
for(i = 0;i <</font> 9;i++)
{
operand1[i] = '\0';
operand2[i] = '\0';
}

while(1)
{
ckey = keyscan();
if(ckey != '#')
{
if(isdigit(ckey))
{
switch(bool)
{
case 0:
operand1[cut1] = ckey;
operand1[cut1+1] = '\0';
value1 = atoi(operand1);
cut1++;
buf(value1);
disp();
break;
case 1:
operand2[cut2] = ckey;
operand2[cut2+1] = '\0';
value2 = atoi(operand2);
cut2++;
buf(value2);
disp();
break;

default: break;
}
}
else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
{
bool = 1;
operator = ckey;
buf(0);
dbuf[7] = 10;
disp();
}
else if(ckey == '=')
{
value = compute(value1,value2,operator);
buf(value);
disp();
while(1)
{
ckey = keyscan();
if(ckey == '$')
goto init;
else
{
buf(value);
disp();
}
}
}
else if(ckey == '$')
{ goto init;}
}
disp();
}

}

uint compute(uint va1,uint va2,uchar optor)
{
uint value;

switch(optor)
{
case '+' : value = va1+va2; break;
case '-' : value = va1-va2; break;
case '*' : value = va1*va2; break;
case '/' : value = va1/va2; break;

default : break;
}
return value;
}

void buf(uint val)
{
uchar i;
if(val == 0)
{
dbuf[7] = 0;
i = 6;
}

else
for(i = 7; val > 0; i--)
{
dbuf[i] = val % 10;
val /= 10;
}

for( ; i > 0; i--)
dbuf[i] = 10;
}

void disp(void)
{
uchar bsel, n;

bsel=0x01;
for(n=0;n<</font>8;n++)
{
P2=bsel;
P0=table[dbuf[n]];
bsel=_crol_(bsel,1);
delay(3);
P0=0xff;
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 51单片机 简易计算器 求一单片机(C51)的简易计算器程序,能实现加减乘除。 易语言入门教程和实例编程教学过程 C51单片机简易计算器的设计:有加减乘除,4*4矩阵键盘,要液晶显示,哪位大神能帮弄一下,有报酬。 怎样用51单片机做计算器啊? 初学者学习编程、首先学那个、VB、C语言、还是易语言啊。 编程初学者是易语言还是c语言 易语言等高级语言编程入门 编程初学者,应该学C语言,还是先学易语言? 作为编程初学者用易语言入门可取吗?易语言真的就那么不堪,甚至误人子弟?偏见还是? 急求结婚对联 急求大侠能为我写 结婚对联 想有关夫妻姓名的 贴大门的 谢谢 急求结婚藏头诗对联两句带横批,要求藏头藏尾,新房大小门上面贴的 求结婚对联两对 女儿出嫁 爷爷奶奶门上贴对联 求对联内容一副 谢谢 浪漫婚房布置喜字对联门贴喜字拉花挂件对联 求一幅结婚对联,贴家大门迎宾的,带有新郎(明达)、新娘(海青)名字。最好九个字的, 求 家里娶媳妇时候男方家大门贴的对联词~ 婚庆用品对联门贴结婚喜联大门婚礼门对联新婚喜 结婚怎样书写各门窗对联 求用单片机C51编程一个简单的计算器 怎么用51单片机做简易计算器? 51单片机做科学计算器的c语言程序 怎么用51单片机做液晶显示屏计算器,进行两位简单的计算 51单片机的计算器计算结果会不会有误差? 51单片机计算器 用51单片机实现多个整数的四则运算的计算器 给予51单片机的简单计算器怎么让它在按键按下的时候 51单片机计算器,运算部分和结果显示怎么写? 建筑学初级职称的考试科目有哪些? C51单片机简易计算器(8以内整数)的显示函数display() 基于51单片机的简易计算器制作 应用51单片机语言编写简易计算器程序 一、实验目的 在51实验小系统硬件基础上,在keil开发环境 二级建造师考几门,分别是那些?房建的 ? 如何在51单片机里实现计算器的回删一位功能? 51单片机数码管计算器的C程序 求51单片机计算器程序,外加仿真图 高中生物必修2 您好,请问我办的平安信用卡现在身份证过期了如果短期没能登记新的身份... 平安信用卡身份证有效期填错了怎么办