① 单片机简易计算器设计的程序
展开全部
首先会按键扫描,再会数码管或液晶屏显示,基本上可以了
程序
流程:
扫描按键(最多5次,最大65536,简易计算器吗)获得一个数,再扫描按键获得加减乘除符号
扫描按键获得另一个数
扫描按键获得“=”,显示计算结果
由于程序比较长,且与硬件有关,因此只贴出主程序:
void
main()
{
while(1)
{
c=1;
while(c<6)//输入第1个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:b1=keyval;
break;
case
2:b2=keyval;
break;
case
3:b3=keyval;
break;
case
4:b4=keyval;
break;
case
5:b5=keyval;
break;
}
c++;
}
display1(b1,b2,b3,b4,b5);
}
while(c==6)
//输入计算符号
{
keyval=keyscan();
if((keyval>=10)&&(keyval<14))
//10-13代表加减乘除
4种符号
{
d=keyval;
}
c=1;
display3(d);
}
while(c<6)
//输入第2个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:d1=keyval;
break;
case
2:d2=keyval;
break;
case
3:d3=keyval;
break;
case
4:d4=keyval;
break;//
除
case
5:d5=keyval;
break;
}
c++;
}
display2(d1,d2,d3,d4,d5);
}
bb=
b1*10000+b2*1000+b3*100+b4*10+b5;//5个按键数值合成一个数
dd=d1*10000+d1*1000+d3*100+d4*10+d5;
//另外5个按键数值也合成一个数
while(keyval!=14)
//等待按下"="
{
keyval=keyscan();
}
Delay1ms(10);
switch(d)
{
case
10:ee=bb+dd;
break;//+
case
11:
flag1=1;//结果是负数的标志,先假定是负数
if(bb>=dd)
{
ee=bb-dd;
//结果不是负数
flag1=0;
}
else
ee=dd-bb;
//减数和被减数交换
break;
case
12:ee=bb*dd;
break;//*可能会溢出
case
13:ee=bb/dd;
//除法小数部分会丢失,保留2位
ff=bb%dd;
fd1=ff*10/dd;
fd2=ff*100/dd%10;
break;
}
f10=ee/1000000000%10;
f9=ee/100000000%10;
f8=ee/10000000%10;
f7=ee/1000000%10;
f6=ee/100000%10;
f5=ee/10000%10;
f4=ee/1000%10;
f3=ee/100%10;
f2=ee/10%10;
f1=ee%10;
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);
while(keyval!=15)
{
keyval=keyscan();
}
b1=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}
}
② 用51单片机设计一个简易定时/计数器
定时器的运用,我博客上有类似的定时程序,只是显示要改一改,按键可以用外部中断来做。
③ 基于51单片机的简易计算器制作
您好,这样的:
纵观单片机的发展过程,可以预示单片机的发展趋势,;1)低功耗CMOS化;MCS-51系列的8051推出时的功耗达630m;2)微型单片化;现在常规的单片机普遍都是将中央处理器(CPU)、;此外,现在的产品普遍要求体积
照程序设计的各部分实现的功能不同,将整个软件系统分成了三个块,并对每一个功能块所采用的元器件进行了详细介绍。此外还编写了主要功能模块的基本程序,详尽阐述了各模块的工作过程。还有总流程图,源代码,硬器件铺线图。
④ 单片机定时器 计数器的工作原理,及如何实现定时 计数功能
原理: 16位的定时器/计数器实质上就是一个加1计数器,其控制电路受软件控制、切换。 当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。
显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。
两个字节最大数据为65536(十进制),或者0FFFFH(十六进制)
高字节为TH0=(65536-X)/256,就是除以256后的整数部分;
低字节为TL0=(65536-X)%256,减去高字节后余下的部分;
定时/计数器
定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。
以上内容参考:网络-定时器中断
⑤ 请高手指点一下用51单片机编程一个简易计数器
这要看你的硬件电路的设计才能写,如果有了固定的电路,这个编程不会太复杂的。你用定时器来控制闪烁,然后单片机进行计算
⑥ 基于51单片机的简易计数器设计c程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
uchar scanled;
uchar disdat[4];
uint ss,time;
sbit led=P1^0;
void dischg()
{
disdat[3]=ss%10;
disdat[2]=(ss/10)%10;
disdat[1]=(ss/100)%10;
disdat[0]=(ss/1000)%10;
}
void t0isr() interrupt 1
{
ss++;
dischg();
}
void t1isr() interrupt 3//显示
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=1<<scanled;
P0=~ledtab[disdat[scanled]];
scanled++;
scanled%=4;
time++;
if(time>100){time=0;led=~led;}
}
main()
{
TMOD=0x16;
TH0=0xff;
TL0=0xff;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
led=0;
scanled=0;
ss=0;
dischg();
while(1);
}
⑦ 单片机的简易计算器
单片机计算器
基本功能介绍:
简单的加减乘除的运算。
时间显示功能,而且能实现计算器模块和时间模块之间的任意切换。
按键音却换功能。
原理;
多功能单片机计算器是一个实现加减乘除的和时间功能的计算器,主要的硬件组成由,一个AT89s52单片机芯片,一个LED液晶(1602液晶),一个4*4键盘,和4个特殊功能按键。
一个时钟芯片(DS1302),一个蜂鸣器。
单个硬件模块个的介绍
AT89S52:
主要控制芯片,它是由8kflash,256BRAM,6个中断源,详情参考AT89S52的技术文档.
1602液晶
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”,而且可以实现一些复杂的字符操作:1:清显示,光标复位到地址00H位置,2:光标和显示模式设置 光标移动方向,高电平右移,低电平左移,屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 3:显示开关控制,控制整体显示的开与关,高电平表示开显示,低电平表示关显示,控制光标的开与关,高电平表示有光标,低电平表示无光标,控制光标是否闪烁,高电平闪烁,低电平不闪烁4:光标或显示移位,高电平时移动显示的文字,低电平时移动光标5:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(高低电平在相应的指令上实现),详情可参考1602的技术文档。
1602采用标准的16脚接口: 第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15~16脚:空脚。
1602液晶和单片机的接法
4*4键盘,和4个特殊功能按键
K(切换键) No(复位键)
(时间设置键) C(清除键) +
1 2 3 —
4 5 6 *
7 8 9 %(除)
—/+ 0 。 =
前4个为特殊功能键,
后十六个采用键盘扫描接法,
扫描原理:
首先给p3口赋11111110(0xfe),然后再读取p3口的值,如果为11101110(0xee)说明是第一排第一个被按下,如果是11011110(0xde)说明是第一排第二个被按下,如果是10111110(0xbe)说明是第一排第三个被按下,如果是0111110(0x7e)说明是第一排第四个被按下,
判断二三四排的按键,都采用同样的方法,只要分别给P3口赋不同的值即可,在读取p3口的值,在判断。用这样的方法即可实现4*4键盘的扫描,只要有键按下,就可以知道是那个键按下,通过这种方法可大大节省单片机的io口的资源。详情可参考网上的键盘扫描原理
时钟芯片(DS1302)
DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式
实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力(详情可参考DS1302的技术文档
管脚描述
X1 X2 32.768KHz 晶振管脚
GND 地
RST 复位脚
I/O 数据输入/输出引脚
SCLK 串行时钟
Vcc1,Vcc2 电源供电管脚
计算器工作大概流程
⑧ 基于51单片机的简易计数器设计,求c语言程序!
#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,scanled;
unsigned char disdat[2];
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)
{
time=0;
sec++;
if(sec>60)sec=0;
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P2=0x01;
P0=~ledtab[disdat[7]];
break;
case 1:
P2=0x02;
P0=~ledtab[disdat[6]];
break;
default:break;
}
scanled++;
scanled%=2;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
sec=0;
scanled=0;
time=0;
dischg();
while(1)
{
if(key1==0)
{
while(key1==0);
TR0=0;
}
if(key2==0)
{
while(key2==0);
TR0=1;
}
if(key3==0)
{
while(key3==0);
sec=0;
dischg();
}
}
}
⑨ 怎么用51单片机做简易计算器
先制作出数字显示电路,还有相应数字按键电路,需要几位数就用几个数码管,然后根据计算逻辑编写出相应C程序
⑩ 基于51单片机的简易加法计数器
你好!这样的效果可以吗