求一个基于51单片机的利用数码管显示的有小数点的计算器的c程序

作者&投稿:豆卢广 (若有异议请与网页底部的电邮联系)
51单片机数码管计算器的C程序(可以显示小数)~

http://download.csdn.net/detail/likang123321/2973621

这是我当年上大学时候写的垃圾代码,不过能用,你自己愁着改改,后来我替人也写过一个,比这个好多了,系统也靠谱,但是找不到了,你凑合着看吧,很多不好的地方,你自己改改

now that one day we must die, but usuall

程序的话可以给你一个作为参考!  实现了计算结果的小数显示。

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

//扫描显示6位数码管,显示信息为缓冲区的六个“0”

//2017.8.7 添加浮点数显示支持

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

#include<reg52.h> //头文件定义

#include<stdio.h>

#include<intrins.h>

#define uchar unsigned char // 宏定义

#define uint unsigned int

#define KEY P1

uchar code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//

0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};  //00 显示空

uchar disp_buffer[6]={2,0,1,7,0,5} ,buf[10]; //显示缓冲区

uchar flag = 0;

long dat1,dat2;

float temp;

bit keypress = 1,getv = 0;

void p_data(long dat);

void display();

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

//延时子程序,带有输入参数 m

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

void delay(unsigned int m)

{

unsigned int i,j;

for(i=0;i<m;i++)

{

for(j=0;j<123;j++)

{;}

}

}

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

//按键扫描程序 4X4

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

uchar key()

{

uchar keytemp , key_h;

KEY = 0xf0;

if((KEY &0xf0)!= 0xf0)

{

keytemp = KEY&0xf0;

KEY = 0x0f; //翻转

key_h = KEY&0x0f;

keytemp = keytemp | key_h;

switch(keytemp)

{

case 0xee: return(0);break;

case 0xed: return(1);break;

case 0xeb: return(2);break;

case 0xe7: return(3);break;

case 0xde: return(4);break;

case 0xdd: return(5);break;

case 0xdb: return(6);break;

case 0xd7: return(7);break;

case 0xbe: return(8);break;

case 0xbd: return(9);break;

case 0xbb: return(10);break;

case 0xb7: return(11);break;

case 0x7e: return(12);break;

case 0x7d: return(13);break;

case 0x7b: return(14);break;

case 0x77: return(15);break;

}

}

return 0xff;

}

void keyscan()

{

uchar getk;

getk = key();

if(getk != 0xff)

{

delay(10);

getk = key();

if(getk != 0xff)

{

if(keypress)

{

keypress = 0;

switch(getk)

{

case 0x0a:           //根据按键决定是做哪种运算,并置位getv

getv = 1;

flag = 1;

break;

case 0x0b:

getv = 1;

flag = 2;

break;

case 0x0c:

getv = 1;

flag = 3;

break;

case 0x0d://

flag = 4;

getv = 1;

break;

case 0x0e:     

getv = 0;

switch(flag)                 //按等号键 进行运算,并将结果输出给temp  用于显示

case 1:

temp = dat1 + dat2;

break;

case 2:

temp = dat1 - dat2;

break;

case 3:

temp = dat1 * dat2;

break;

case 4:

temp = (float)dat1 / (float)dat2;

break;

}

dat1 = 0;

dat2 = 0;

flag = 0;

break;

case 0x0f:

if(!getv)

{

dat1 = dat1/10;;

temp = dat1;

}

else

{

dat2 = dat2/10;

temp = dat2;

}

break;

default:

if(!getv) //根据getv的值判断是第一个数据还是第二个数据!

{

dat1 = dat1*10 + getk; //将按键值组合成为数据

temp = dat1;

}

else

{

dat2 = dat2*10 + getk;

temp = dat2;

}

break;

}

}

}

}

else

keypress = 1;

}

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

//填充disp_buffer   浮点数数据处理 转换为整数,并标记小数点位置

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

uchar float_int_dot(float numf)

{

uchar ct,ctn,dotps;

for(ct = 7 ; ct != 0 ; ct--)    //初始化打印缓冲区和显示缓冲区

{

buf[ct - 1] = 0;

if(ct - 1 > 0)

disp_buffer[ct - 2] = 16;

}

sprintf(buf,"%f",numf);

for(ct = 7 ,ctn = 5; ct != 0 ; ct--)

{

if(buf[ct-1] == '.')       //如果是小数点则记录位置,并传递给返回值

{

dotps = 6 - ctn;

disp_buffer[ctn] = 0;

}

else if(buf[ct - 1] != '0')//不等于0 则将ascii转换为数值填充入显示缓冲区,

{

disp_buffer[ctn] = buf[ct - 1] - 0x30;

ctn--;

}

}

return dotps;

}

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

//填充disp_buffer ,数据处理

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

void p_data(long dat)

{

uchar pi;

for(pi = 0 ; pi < 6 ; pi++)

if(dat != 0 )

{

disp_buffer[5 - pi] = dat%10;

else

disp_buffer[5 - pi] = 16;

dat = dat/10;

}

}

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

//显示子程序

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

void display(uchar  flash , uchar count, uchar dot) //dot 代表现实小数点的位置

{

uchar i,temp;

temp = 0x01;

for(i=0;i<6;i++)

{

P2 = temp;                               //位选

/*方法一

if( i == flash - 1)

{

if(ct <50)

P0 = Tab[disp_buffer[i]];                //送显示段码

else

P0 = 0;                //送显示段码

}

else

P0 = Tab[disp_buffer[i]];                //送显示段码

*/

/*方法二***************/

if(!(flash&0x01))

{

if(count <50)

P0 = Tab[disp_buffer[i]];                //送显示段码

else

P0 = 0;                //送显示段码

}

else

P0 = Tab[disp_buffer[i]];                //送显示段码

flash = flash >> 1;

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

if(dot - 1 == 5 - i)

P0 = P0|0x80;  

delay(2);

P0 = 0x00;                               //消隐

temp = _crol_(temp,1);

}

}

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

//主函数

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

void main()

{

uchar dot;

while(1)

{

keyscan();

dot = float_int_dot(temp);

display(0xff,100,dot); //11 001101

}  

}

Proteus 仿真图



51单片机的硬件设施决定了软件所以单纯的利用软件是没有意义的。只能增强自己编程理解能力。
你的要求需要利用四位以上的数码管。由于达到了四位每个数码管需要八个引脚。然后利用单片机的另外四个引脚控制四个三极管做扫描市的显示比较省引脚和电能。
按键设计也需要扫描设计。也需要八个引脚这样功能多些。例如设计加减乘除小数点
设计思路可以这样。
利用数码管显示需要构造字符库就是字模然后在取模显示或者取余显示。
这样的程序网上很多。不过是液晶显示器的比较多。可以两个加起来一起用

可以将数放大十倍作为整数处理,显示时再转换回来

好吃的东西代表着你所期待的东西。可能有一种这样的想法,在经历平凡或者挫折后


基于51单片机的自动路灯控制,需要哪几部分组成能实现
基于51单片机的自动路灯控制系统,需要以下几部分组成才能实现:1. 51单片机:51单片机是一种常用的微控制器,具有较强的计算和控制能力,可以实现对路灯的自动控制。2. 光敏传感器:光敏传感器用于感知周围环境的光照强度,根据光照强度的变化来判断是否需要开启或关闭路灯。3. 时钟模块:时钟模块用于提供精确...

求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过...
sbit gewei=P2^2; \/\/个位选通定义 sbit shiwei=P2^3; \/\/十位选通定义 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};\/\/{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};\/\/ 0, 1...

求一个“基于51单片机的信号发生器电路”设计
\/\/\/51单片机P2口接4*4键盘的行线和列线;红灯亮时进行频率输入;绿灯亮时进行占空比输入;频率值暂定在100到60KHZ之间;输入频率和占空比时要输够六位整数,不够的在前面补0;占空比以百比数(0-100)形式存在。\/\/\/ \/\/\/方波发生器资料。空军工程大学导院501明明,2007.10.10初稿\/\/\/ include<re...

基于51单片机的密码锁程序是什么?
无输入时显示日历,温度,可进行调时设定,密码输入功能 51单片机系统版、ds1302时钟模块、4*4矩阵键盘、ds18b20温度传感器、12864液晶显示屏。这个设计构想其实老早就有了,由于快接近期末考试所以一直在构想中,等到考试完准备利用暑假的时候实现它。考试结束就去某宝购买器件,为了锻炼自己的焊接水平买了系...

基于51单片机的简易计算器设计,急
include<reg51.h> \/\/头文件 define uint unsigned int \/\/ define uchar unsigned char sbit lcden=P2^3; \/\/定义引脚 sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char i,j,temp,num,num_1;long a,b,c; \/\/a,第一个数 b,第二个数 c,得数 float a_c,b_c;uchar flag,fu...

求一个正确的基于51单片机的函数信号发生器的C程序
include<reg51.h> include<absacc.h> include<MAX72191.h> defineDAC XBYTE[0x7fff] \/\/P2.7接CS sbitkey0 = P3^2;\/\/ 增减切换键 sbitkey1 = P3^3;\/\/个位,十位,百位,千位的控制切换 sbitkey2 = P3^4;\/\/ 调整位 sbitkey3 = P3^5;\/\/ 波形选择正弦、三角、矩形波,锯齿波 unsigne...

我想制作一个基于51单片机的16x16的LED广告屏,行扫描和列扫描是不是要...
那么,具体实现方法可以这样,只是给个参考,还有更好的方法也可以改下硬件连接;首先,用2片锁存器来作行数据,2片作列数据,这样就刚好32个输出口接行和列的32个输入口,然后将一组(8个I\/O口)分别接到这2个为一组的锁存器上,因为锁存器有附加功能选择端,其中有个就是芯片使能端,就是决定...

想做一个基于51单片机按键计数用LCD1602显示的编程0-99
void 1602_display(uchar temp)\/\/液晶显示一个8 位二进制数 { uchar A1,A2,A3;A1=temp\/100;\/\/分离百位、十位、个位 A2=temp\/10%10;A3=A2t%10;write_com(0x80);\/\/第1行,第1字 write_date(A1+0x30);Delay1ms(1);write_date( A2+0x30);Delay1ms(1);write_date(A3+0x30);Delay...

一个简单的51单片机编程,求程序,谢谢!
void t0isr() interrupt 1 { TH0=(65536-5000)\/256;TL0=(65536-5000)%256;number++;if(number>1)number=0;switch(number){ case 0:P2=0x02;P0=distab[dat\/10];break;case 1:P2=0x01;P0=distab[dat%10];break;default:break;} } main(){ TMOD=0x01;TH0=(65536-5000)\/256;TL0=(...

用51单片机写一个程序,求大神
1、使用定时器0方式二,结合软件计数器来实现秒信号的产生;2、定时器必须使用中断的方式来实现;3、使用单片机开发板上的左边四位来扫描显示时间,显示格式为“MM.SS”;4、开机时显示00.00,最大值显示到59.59(59分59秒);5、第一次按电路板上K1(P3.2)键启动走时,K1必须使用中断方式实现...

临邑县18313228582: 基于51单片机数码管动态显示程序 -
漕福茜草: P2.7-P2.4为选择数码管,P1口接数码管8个笔画#include<xxxxx.H> //你所用单片机的型号 main() { while(1) { P2 = 0x1F; P1 = SEG_TAB[a/1000]; //送A的最高位代码,求段码后送显//示,要求A值不要大于4位数 delay_ms(2); //延时2ms,延时函...

临邑县18313228582: 大家帮帮忙.我想做一个基于51单片机的用数码管显示电压电流和功率. -
漕福茜草: 既然问程序如何写那即是电路部分全都完成!那就光讲软件!程序一般分为程序初始化、循环主程序和中断响应服务程序组成(当然不用中断用查询也能实现,但软件开销要费点),你首先需要确定各功能模块的划分,我按中断方式举例,如:...

临邑县18313228582: 求用51单片机接两个数码管,0 - 99动态显示程序(用C语言) -
漕福茜草: #include #define uchar unsigned char #define uint unsigned int uchar DSY_CODE[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; void delay(uint x) { uchar i; while(x--)for(i=0;i<120;i++); } void main() { uchar i; P0 = 0x00; P2 = 0x00; while(1)...

临邑县18313228582: 基于51单片机的DS18B20程序(数码管显示) -
漕福茜草: 参考下吧! 18B20数字温度显示系统 综合实验:用18B20(数字温度采集)74LS47(数码管译码)74LS138(三八译码) DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125...

临邑县18313228582: 用51单片机程序显示3位7段数码管,求具体程序 -
漕福茜草: 假设为共阴极数码管,驱动输入端接单片机P1口,共阴极接P2口的0.1.2.脚.我的程序如下,当前显示数字123 #include <reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; typedef long int uint32; code uint8 number[]={0x3f,0x06,0...

临邑县18313228582: 用51单片机编写一个可以用数码管显示出速度的程序
漕福茜草: 可以用记时器做啊,再弄两个按钮作为开关,记算程序写在显示程序里就OK

临邑县18313228582: 求由51单片机控制4x4键盘输入,4个数码管(采用动态扫描)显示 C语言编程思路! -
漕福茜草: 可以这样写,先计算按了几下了,按下若小于4次,让四个段选端前几个端导通,按下数超过或等于4次你就可以用扫屏的方式来显示就好了.比如第一下按的是8你就可以设置if和else语句组合啊!先有个数组d[]={0xf7;0xfb;0xfd;0xfe}//段选,按了几下设为变量uint a//无符号字符型,if(a<4){if(a=1)P2=d[a-2];P1=data[8];delay();········if(a-1){··········}if(a-2){··········}};else(············)太多了我就不写了.

临邑县18313228582: 能帮忙编一个利用51单片机内部eeprom,来保存数码管显示的程序吗.请大虾帮忙,会追分的.先谢谢哈. -
漕福茜草: 以下是单片机实践团为您解答:1、从您的描述大概懂您的意思,一般对于某些需要保存某些用户信息数据的场合都是使用EEPROM来实现.比如可以设置报警温度的测温系统,在不同的季节需要不同的报警阈值,所以一般会引入EEPROM用于保存报警温度.2、您描述的采用51单片机内部的EEPROM,不知道您说的是哪一款单片机,请告之具体的型号.就我所知的51内核的带EEPROM的单片机有STC和c8051f系列的.非51内核的很多都带eeprom的,比如stm8.3、如果是使用一般的51芯片的话(比如at89c5x)可以通过外扩EEPROM来实现,推荐AT24C02等根据您的容量来确定型号.4、不明白的hi我,常在线.

临邑县18313228582: 基于AT89C51单片机,利用定时器设计一个两位数码 管显示电路.求详细的设计过程. -
漕福茜草: 硬件很简单,我就不画图了,简单描述一下吧.在单片机最小系统的基础上,P0口接数码管的数据端,P2.6,P2.7接数码管的控制端. 程序如下: #include #define uint unsigned int #define uchar unsigned char sbit s1=P2^6;//十位 ...

临邑县18313228582: 51单片机数码管滚动显示 -
漕福茜草: #include <reg52.h>#define uchar unsigned char #define uint unsigned int uchar code SEG_B_List[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管代码表"0-9","空" #define StuNumLeng 14 //学号长度,加了2...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网