运用单片机做课程设计,52的板子,汇编,做个计算器,求大神!只要程序,还有能演示就可以,所以发

没有汇编的,有一个C的,给你参考

单片机计算器课程设计 单片机计算器课程设计ppt单片机计算器课程设计 单片机计算器课程设计ppt


单片机计算器课程设计 单片机计算器课程设计ppt


#include

#define uchar unsigned char

#define uint unsigned int

uchar LED1,LED2,LED3,LED4,LED5,LED6;

uchar keyval,calflag;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

uint number;

unsigned long s_dat1,s_dat2,d_dat;

void delay(unsigned int a)

{unsigned int i,j;

for(i=0;i

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

}void clrdat()

{LED1=0;

LED2=0;

LED3=0;

LED4=0;

LED5=0;

LED6=0;

}void dealdat()

{switch(calflag)

{case 0:

d_dat=s_dat1+s_dat2;

break;

case 1:

d_dat=s_dat1-s_dat2;

break;

case 2:

d_dat=s_dat1s_dat2;

break;

case 3:

d_dat=s_dat1/s_dat2;

break;

default:break;

}LED1=(d_dat/100000)%10;

LED2=(d_dat/10000)%10;

LED3=(d_dat/1000)%10;

LED4=(d_dat/100)%10;

LED5=(d_dat/10)%10;

LED6=d_dat%10;

}uchar kbscan(void)

{unsigned char sccode,recode;

P3=0x0f; //发0扫描,列线输入

if ((P3 & 0x0f) != 0x0f) //有键按下

{delay(20); //延时去抖动

if ((P3&0x0f)!= 0x0f)

{sccode = 0xef; //逐行扫描初值

while((sccode&0x01)!=0)

{P3=sccode;

if((P3&0x0f)!=0x0f)

{recode=(P3&0x0f)|0xf0;

return((~sccode)+(~recode));

}else

sccode=(sccode<<1)|0x01;

}}

}return 0; //无键按下,返回0

}void getkey(void)

{unsigned char key;

key=kbscan();

if(key==0){keyval=0xff;return;}

switch(key)

{case 0x11:keyval=7;break;

case 0x12:keyval=4;break;

case 0x14:keyval=1;break;

case 0x18:keyval=10;break;

case 0x21:keyval=8;break;

case 0x22:keyval=5;break;

case 0x24:keyval=2;break;

case 0x28:keyval=0;break;

case 0x41:keyval=9;break;

case 0x42:keyval=6;break;

case 0x44:keyval=3;break;

case 0x48:keyval=11;break;

case 0x81:keyval=12;break;

case 0x82:keyval=13;break;

case 0x84:keyval=14;break;

case 0x88:keyval=15;break;

default:keyval=0xff;break;

}}

void t0isr() interrupt 1

{TH0=0xf4;

TL0=0x48;

switch(number)

{case 0:P2=0x01;P0=distab[LED1];break;

case 1:P2=0x02;P0=distab[LED2];break;

case 2:P2=0x04;P0=distab[LED3];break;

case 3:P2=0x08;P0=distab[LED4];break;

case 4:P2=0x10;P0=distab[LED5];break;

case 5:P2=0x20;P0=distab[LED6];break;

default:break;

}number++;

if(number>5)number=0;

}main()

{TMOD = 0x01;

number = 0;

TH0=0xf4;

TL0=0x48;

TR0=1;

ET0=1;

EA=1;

LED1=0;

LED2=0;

LED3=0;

LED4=0;

while(1)

{getkey();

switch(keyval)

{case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:

LED1=LED2;

LED2=LED3;

LED3=LED4;

LED4=LED5;

LED5=LED6;

LED6=keyval;

break;

case 10:

clrdat();

break; //"ON"

case 11: //"="

s_dat2=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;

dealdat();

break;

case 12: //"/"

calflag=3;

s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;

clrdat();

break;

case 13: //""

calflag=2;

s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;

clrdat();

break;

case 14: //"-"

calflag=1;

s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;

clrdat();

break;

case 15: //"+"

calflag=0;

s_dat1=LED1100000+LED210000+LED31000+LED4100+LED510+LED6;

clrdat();

break;

default:break;

}}

}

单片机设计计算器

下面是我以前写的一个简单的计算器的程序,你可以参考参考

#include

#define uchar unsigned char

#define uint unsigned int

it E=P2^7; //1602使能引脚

it RW=P2^6; //1602读写引脚

it RS=P2^5; //1602数据/命令选择引脚

uchar temp,num,k,m,flag,flag1,tt,a;

uint table[10];

uint val[8];

uint shu,shu1,shu2;

void init();

void delay(uint z);

void write_com(uchar com);

void write_date(uchar date);

uchar keyscan();

void input();

void output();

void main()

{init();

while(1)

{input();

output();

}}

void delay(uint z)

{int i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}void init()

{write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

write_com(0x01);

}void write_com(uchar com)

{P0=com;

RS=0;

RW=0;

E=0;

delay(5);

E=1;

delay(5);

}void write_date(uchar date)

{P0=date;

RS=1;

RW=0;

E=0;

delay(5);

E=1;

delay(5);

}uchar keyscan()

{P1=0xfe;//对矩阵键盘的行全赋0,扫描行

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)//消抖

{delay(10);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{temp=P1;//将P1的值读入temp中,否则temp的值始终为0xf0

//因为当程序运行到松手检测循环时,要退出松手

//检测循环就必须是temp值为0xf0

switch(temp)

{case 0xee:num=7;break;//break是跳出switch语句,

case 0xde:num=8;break;//而不是跳出while语句

case 0xbe:num=9;break;

case 0x7e:num=13;break;//num=13表示除号

}while(temp!=0xf0) //松手检测

{ //即当手松开时,也即无按键被按下

temp=P1; //则temp值就等于0xf0,

temp=temp&0xf0; //退出此循环

}}

}P1=0xfd;//对矩阵键盘的第二行全赋0,扫描第二行

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{temp=P1;

switch(temp)

{case 0xed:num=4;break;

case 0xdd:num=5;break;

case 0xbd:num=6;break;

case 0x7d:num=12;break;//num=12表示乘号

}while(temp!=0xf0)

{temp=P1;

temp=temp&0xf0;

}}

}P1=0xfb;//对矩阵键盘的第三行全赋0,扫描第三行

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{temp=P1;

switch(temp)

{case 0xeb:num=1;break;

case 0xdb:num=2;break;

case 0xbb:num=3;break;

case 0x7b:num=11;break;//num=11表示减号

}while(temp!=0xf0)

{temp=P1;

temp=temp&0xf0;

}}

}P1=0xf7;//对矩阵键盘的第四行全赋0,扫描第四行

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{temp=P1;

switch(temp)

{case 0xe7:num=15;break;//num=15表示清零

case 0xd7:num=16;break;//num=16表示0

case 0xb7:num=14;break;//num=14表示等号

case 0x77:num=10;break;//num=10表示加号

}while(temp!=0xf0)

{temp=P1;

temp=temp&0xf0;

}}

}return num;

}void digit(uchar number)

{write_com(0x80+a);

write_date(number+'0');

table[a]=tt;

delay(5);

tt=0;

num=0;

a++;

}void input()

{uint i,j;

tt=keyscan();

if(tt==15) //清零

{write_com(0x01);

tt=0;

num=0;

a=0;

m=0;

flag1=0;

flag=0;

}if(tt==1) digit(1);

if(tt==2) digit(2);

if(tt==3) digit(3);

if(tt==4) digit(4);

if(tt==5) digit(5);

if(tt==6) digit(6);

if(tt==7) digit(7);

if(tt==8) digit(8);

if(tt==9) digit(9);

if(tt==16)

{write_com(0x80+a);

write_date(0+'0');

table[a]=0;

delay(5);

tt=0;

num=0;

a++;

}if(tt==10)//检测到加号

{m=1;//表示加法

shu1=0;

j=1;

write_com(0x80+a);

write_date('+');

delay(5);

flag=a;

for(i=flag;i>0;i--)

{shu1+=(table[i-1]j);

j=10;

}tt=0;

num=0;

a++;

}if(tt==11)//检测到减号

{m=2;//表示减法

shu1=0;

j=1;

write_com(0x80+a);

write_date('-');

delay(5);

flag=a;

for(i=flag;i>0;i--)

{shu1+=(table[i-1]j);

j=10;

}tt=0;

num=0;

a++;

}if(tt==12)//检测到乘号

{m=3;//表示乘法

shu1=0;

j=1;

write_com(0x80+a);

write_date('');

delay(5);

flag=a;

for(i=flag;i>0;i--)

{shu1+=(table[i-1]j);

j=10;

}tt=0;

num=0;

a++;

}if(tt==13)//检测到除号

{m=4;//表示除法

shu1=0;

j=1;

write_com(0x80+a);

write_date('/');

delay(5);

flag=a;

for(i=flag;i>0;i--)

{shu1+=(table[i-1]j);

j=10;

}tt=0;

num=0;

a++;

}if(tt==14) //检测到等号

{flag1=1;

write_com(0x80+a);

write_date('=');

shu2=0;

j=1;

for(i=a-1;i>flag;i--)

{shu2+=(table[i]j);

j=10;

}num=0;

tt=0;

}}

void output()

{uint value;

uchar n;

if((m==1)&&(flag1==1))//加的时候

{value=shu1+shu2;

if(value>=0&&value<10)

{val[0]=value;

write_com(0xc0);

for(n=0;n<1;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10&&value<100)

{val[0]=value/10;

val[1]=value%10;

write_com(0xc0);

for(n=0;n<2;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=100&&value<1000)

{val[0]=value/100;

val[1]=value%100/10;

val[2]=value%10;

write_com(0xc0);

for(n=0;n<3;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=1000&&value<10000)

{val[0]=value/1000;

val[1]=value%1000/100;

val[2]=value%1000%100/10;

val[3]=value%10;

write_com(0xc0);

for(n=0;n<4;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10000&&value<100000)

{val[0]=value/10000;

val[1]=value%10000/1000;

val[2]=value%10000%1000/100;

val[3]=value%10000%1000%100/10;

val[4]=value%10;

write_com(0xc0);

for(n=0;n<5;n++)

{write_date(val[n]+'0');

delay(2);

}}

}if((m==2)&&(flag1==1))//减的时候

{value=shu1-shu2;

if(value>=0&&value<10)

{val[0]=value;

write_com(0xc0);

for(n=0;n<1;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10&&value<100)

{val[0]=value/10;

val[1]=value%10;

write_com(0xc0);

for(n=0;n<2;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=100&&value<1000)

{val[0]=value/100;

val[1]=value%100/10;

val[2]=value%10;

write_com(0xc0);

for(n=0;n<3;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=1000&&value<10000)

{val[0]=value/1000;

val[1]=value%1000/100;

val[2]=value%1000%100/10;

val[3]=value%10;

write_com(0xc0);

for(n=0;n<4;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10000&&value<100000)

{val[0]=value/10000;

val[1]=value%10000/1000;

val[2]=value%10000%1000/100;

val[3]=value%10000%1000%100/10;

val[4]=value%10;

write_com(0xc0);

for(n=0;n<5;n++)

{write_date(val[n]+'0');

delay(2);

}}

}if((m==3)&&(flag1==1))//乘的时候

{value=shu1shu2;

if(value>=0&&value<10)

{val[0]=value;

write_com(0xc0);

for(n=0;n<1;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10&&value<100)

{val[0]=value/10;

val[1]=value%10;

write_com(0xc0);

for(n=0;n<2;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=100&&value<1000)

{val[0]=value/100;

val[1]=value%100/10;

val[2]=value%10;

write_com(0xc0);

for(n=0;n<3;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=1000&&value<10000)

{val[0]=value/1000;

val[1]=value%1000/100;

val[2]=value%1000%100/10;

val[3]=value%10;

write_com(0xc0);

for(n=0;n<4;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10000&&value<100000)

{val[0]=value/10000;

val[1]=value%10000/1000;

val[2]=value%10000%1000/100;

val[3]=value%10000%1000%100/10;

val[4]=value%10;

write_com(0xc0);

for(n=0;n<5;n++)

{write_date(val[n]+'0');

delay(2);

}}

}if((m==4)&&(flag1==1))//除的时候

{value=shu1/shu2;

if(value>=0&&value<10)

{val[0]=value;

write_com(0xc0);

for(n=0;n<1;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10&&value<100)

{val[0]=value/10;

val[1]=value%10;

write_com(0xc0);

for(n=0;n<2;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=100&&value<1000)

{val[0]=value/100;

val[1]=value%100/10;

val[2]=value%10;

write_com(0xc0);

for(n=0;n<3;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=1000&&value<10000)

{val[0]=value/1000;

val[1]=value%1000/100;

val[2]=value%1000%100/10;

val[3]=value%10;

write_com(0xc0);

for(n=0;n<4;n++)

{write_date(val[n]+'0');

delay(2);

}}

if(value>=10000&&value<100000)

{val[0]=value/10000;

val[1]=value%10000/1000;

val[2]=value%10000%1000/100;

val[3]=value%10000%1000%100/10;

val[4]=value%10;

write_com(0xc0);

for(n=0;n<5;n++)

{write_date(val[n]+'0');

delay(2);

}}

}}

一、设计题目 基于单片机的简易计算器设计 二、设计任务 1、用单片机设计一简易计算器。 2、采用44键盘,

1. 4X4键盘输入,点阵字符型液晶显示。

2. 由于所采用的浮点程序库的限制(MCU平台只找到这个……),浮点运算采用3字节二进制补码表示,有效数字6位。对于输入输出,采用3字节BCD码浮点数格式,有效数字只有4位,因此终有效数字只有4位。

3. 可进行连续输入,例如:1.23+4.568.23/234.8 ,但是运算结果为从左到右,这也是8位简易计算器的方式。

4. 可进行错误判断,溢出、除零等错误将显示一个字符 E 。

5. 由于键盘只有16个按键,安排如下:

+---------------+

| 7 | 8 | 9 | + |

| 4 | 5 | 6 | - |

| 1 | 2 | 3 | |

| 0 | . | = | / |

+---------------+

6. 按键的缺少导致取消了一些特殊函数,即开根号,三角函数(sin, cos, tan, ctg)的实现,由于这些函数在浮点程序库中均已提供,如果硬件允许,在原来的框架上添加这些附加功能是很容易的(可以看作和+, -, , /等价的按键作,调用不同的子程序进行运算即可)

7. 按两次 = 等于清灵。因为按键实在太少,才采用了这个做法。

8. 相应举例:

按键 结果 说明

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

123+= 123 按下等号而没有第二个作数,保留个作数

并认为此次运算结束(等号的功能)

123+321/111 4.0 等价于(123+321) / 111

2.3+5.4=/0.1+ 77 等号后直接按 / ,则将前面的运算结果作为个

作数

1/0= E 错误显示

要源码去这里:

51单片机课程设计要怎么写

次见有人这样问!!-

-自己学单片机都不知道该做什么啊,看样子复杂的你是没指望了,看看书,写个计算器、万年历、变压器啦什么的还可以

追问:

我不会啊

回答:

真干脆!你们老师也没说题目,就是让你自己想题目然后设计啊?要是那样,也不怪乎你会问这种问题

课程设计

的一般要求:

1、

设计任务书

:说明设计的内容,达到什么程度

2、硬件电路图:设计硬件

电路板

(若不要求做实物的话,可用protues仿真,但无论如何硬件电路一定要有)

3、

软件设计

:根据硬件电路开发,去实现要设计的目的。

4、

流程图

:绘制软件流程图(其实,应该是根据先流程图

再设计

程序的,不过一般具体流程图都是要根据软件细化,所以就放在了编程后便..)

5.

设计说明

书:总结是设计的过程

//-----------------------------

一般

单片机

设计的流程就是这样了,可以根据你们要求具体做哪些....

单片机简易计算器的设计要求用28矩阵键盘,程序如下,求大神把下面44键盘程序改成28的,可追加分数

下面这个 Keyscan(void) 程序,是我以前写的。

uchar Keyscan(void)

{uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};

for(j = 0; j < 4; j++) { //循环四次

P2 = Buffer[j]; //在P1高四位分别输出一个低电平

temp = 0x01; //先判断P1.0位

for(i = 0; i < 4; i++) { //循环四次

if(!(P2 & temp)) //从P1低四位,截取1位

return (i + j 4); //返回取得的按键值

temp <<= 1; //判断的位,左移一位

} }

return 16; //判断结束,没有键按下,返回16

}程序,用了一个 8 位的并口:P1,或 P2,都行。

改成28的,就要使用两个接口了,用什么?楼主应该指定出来。

单片机简易计算器设计的程序

展开全部

首先会按键扫描,再会数码管或液晶屏显示,基本上可以了

程序

流程:

扫描按键(多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=

b110000+b21000+b3100+b410+b5;//5个按键数值合成一个数

dd=d110000+d11000+d3100+d410+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=bbdd;

break;//可能会溢出

case

13:ee=bb/dd;

//除法小数部分会丢失,保留2位

ff=bb%dd;

fd1=ff10/dd;

fd2=ff100/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/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();

}}