89c51c语言程序,89C51单片机【计算器】C语言程序.doc

89C51单片机【计算器】C语言程序

89C51单片机【计算器】C语言程序2010-12-15 16:54/*89C51单片机【计算器】C语言程序*/

/*P2位选P0段选时钟12MHZ*/

#include reg52.h/*包含的头文件*/

#define uchar unsigned char/*宏定义*/

#define uint unsigned int uchar Led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};/*数码管段选*/

long float Number={0,0,0,0};/*数码管显示位控制寄存器*/

uchar A={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

long int D={0,0,0,0,0,0,0,0};//数码管显示内容寄存器

uchar code C={0x0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};/*数码管位选*/

/*列扫描控制LED 1位2位3位4位5位6位7位8位*/

uchar k=16;/*按键对外控制*/

uchar b;/*按键【+】【-】【*】【/】对外的控制*/

long float Out_put;/*定义变量【Out_put】作为结果*/

uchar e=0;/*数字的位存储递进的控制*/

uchar g=0;/*运算方式的控制变量*/

uchar L=0;/*运算方式的控制变量*/

uchar g1=0;/*运算方式的控制变量*/

uchar g2=0;/*运算方式的控制变量*/

uchar g3=0;/*运算方式的控制变量*/

uchar g4=0;/*运算方式的控制变量*/

char j=-1;/*与Number数组连用*/

uchar m=0;/*按键【=】的控制变量*/

uchar n=0;/*按键【.】的控制变量*/

uchar x=0;/*小数点个数的记录变量*/

uchar xo=0;/*控制开始计数小数点的变量*/

long int result;

void Delay(uint o)/*延时函数delay()的定义*/

{

uint i,j;

for(i=0;i o;i++)

{

for(j=0;j 121;j++){;}

}

}

void show(long float Out_put)

{uchar r;

uchar k;

long int q,p;

uchar s=0;

uchar i;

long int temp;

temp=Out_put;

if((Out_put-temp)!=0){result=Out_put*10000;r=4;}

else{result=Out_put;r=0;}

p=result;

if(m==1)

{

if(result 0)

{result=-result;p=result;q=result;for(i=1;i=8;i++){q=q/10;if(q==0){k=i;i=9;}}P0=0x40;P2=C[8-k];Delay(1);}//负号的显示

P0=0x80;P2=C[r];Delay(1);P0=0x00;

result=p;

P0=Led[result%10];P2=C[8];result=result/10;Delay(1);

if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)&&(result%100000==0)&&(result%1000000==0)){P0=0x00;}

else{P0=Led[result%10];P2=C[7];result=result/10;Delay(1);}

if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)&&(result%100000==0)){P0=0x00;}

else{P0=Led[result%10];P2=C[6];result=result/10;Delay(1);}

if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)){P0=0x00;}

else{P0=Led[result%10];P2=C[5];result=result/10;Delay(1);}

if((result%10==0)&&(result%100==0)&&(result%1000==0)){P0=0x00;}

else{P0=Led[result%10];P2=C[4];result=result/10;Delay(1);}

if((result%10==0)&&(result%100==0)){P0=0x00;}

else{P0=Led[result%10];P2=C[3];result=result/10;Delay(1);}

if((result%10==0)){P0=0x00;}

else{P0=Led[result%10];P2=C[2];result=result/10;Delay(1);}

if(result==0){P0=0x00;}

else{P0=Led[result%10];P2=C[1];result=result/10;Delay(1);}

}

}

void In_put()//输入函数输入小数加小数点

{

uchar i;

if(k=0&&k=9)

switch(e)

{

case 8:D[7]=D[6];A[7]=A[6];//用来存放数值

case 7:D[6]=D[5];A[6]=A[5];

case 6:D[5]=D[4];A[5]=A[4];

case 5:D[4]=D[3];A[4]=A[3];

case 4:D[3]=D[2];A[3]=A[2];

case 3:D[2]=D[1];A[2]=A[1];

case 2:D[1]=D[0];A[1]=A[0];

case 1:if(n==0){D[0]=k;A[0]=Led[k];if(xo==1)x++;}

if(n==1){A[0]=Led[k]|0x80;xo=1;n=0;}

}

if(k=11&&k=15&&b==1)

{switch(k)

{

case 11:g1++;g++;if(g2==1)L=1;if(g3==1)L=2;if(g4==1)L=3;break;//+

case 12:g2++;g++;if(g1==1)L=4;if(g3==1)L=5;if(g4==1)L=6;break;//-

case 13:g3++;g++;if(g1==1)L=7;if(g2==1)L=8;if(g4==1)L=9;break;//*

case 14:g4++;g++;if(g1==1)L=10;if(g2==1)L=11;if(g3==1)L=12;break;///

}

j++;

Number[j]=10000000*D[7]+1000000*D[6]+100000*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0];

for(i=1;i=x;i++){Number[j]=(float)Number[j]/10;}

x=0;

for(i=0;i=7;i++)//数据存储器清零

D[i]=0;

for(i=0;i=8;i++)//数据显示清零

{A[i]=0x00;}

b=0;e=0;xo=0;

}

}

void Key_scan()//键盘扫描函数Key_scan()

{

unsigned char X,Y,Z;

P3=0xff;

P3=0x0f;//先对P2置数行扫描

if(P3!=0x0f)//判断是否有键按下

{

Delay(20);//延时10ms,软件去干扰

if(P3!=0x0f)//确认按键按下;

{

X=P3;//保存行扫描时有键按下时状态

P3=0xf0;//列扫描

Y=P3;//保存列扫描时有键按下时状态

Z=X|Y;//取出键值

while(P3!=0xf0);//按键防止抖动

switch(Z)//判断键值(那一个键按下)

{

case 0xe7:k=0;e++;In_put();break;//数字【0】

case 0xd7:k=1;e++;In_put();break;//数字【1】

case 0xdb:k=2;e++;In_put();break;//数字【2】

case 0xdd:k=3;e++;In_put();break;//数字【3】

case 0xb7:k=4;e++;In_put();break;//数字【4】

case 0xbb:k=5;e++;In_put();break;//数字【5】

case 0xbd:k=6;e++;In_put();break;//数字【6】

case 0x77:k=7;e++;In_put();break;//数字【7】

case 0x7b:k=8;e++;In_put();break;//数字【8】

case 0x7d:k=9;e++;In_put();break;//数字【9】

case 0xeb:n=1;In_put();break;//小数点【.】

case 0x7e:k=11;b=1;In_put();break;//字符【B+】

case 0xbe:k=12;b=1;In_put();break;//字符【C-】

case 0xde:k=13;b=1;In_put();break;//字符【D*】

case 0xee:k=14;b=1;In_put();break;//字符【E/】

case 0xed:k=15;m=1;b=1;In_put();break;//字符【F=】

}

}

}

}

void Yun_suan()

{

if(g1==1&&g==1)Out_put=Number[0]+Number[1];

if(g2==1&&g==1)Out_put=Number[0]-Number[1];

if(g3==1&&g==1)Out_put=Number[0]*Number[1];

if(g4==1&&g==1)Out_put=Number[0]/Number[1];

if(g1==2&&g==2)Out_put=Number[0]+Number[1]+Number[2];

if(g2==2&&g==2)Out_put=Number[0]-Number[1]-Number[2];

if(g3==2&&g==2)Out_put=Number[0]*Number[1]*Number[2];

if(g4==2&&g==2)Out_put=Number[0]/Number[1]/Number[2];

if(L==1)Out_put=Number[0]-Number[1]+Number[2];

if(L==2)Out_put=Number[0]*Number[1]+Number[2];

if(L==3)Out_put=Number[0]/Number[1]+Number[2];

if(L==4)Out_put=Number[0]+Number[1]-Number[2];

if(L==5)Out_put=Number[0]*Number[1]-Number[2];

if(L==6)Out_put=Number[0]/Number[1]-Number[2];

if(L==7)Out_put=Number[0]+Number[1]*Number[2];

if(L==8)Out_put=Number[0]-Number[1]*Number[2];

if(L==9)Out_put=Number[0]/Number[1]*Number[2];

if(L==10)Out_put=Number[0]+Number[1]/Number[2];

if(L==11)Out_put=Number[0]-Number[1]/Number[2];

if(L==12)Out_put=Number[0]*Number[1]/Number[2];

}

void Xian_shi()

{

if(m!=1)

{

Key_scan();

/*显示函数与A[i]有关*/

P0=A[0];P2=C[8];Delay(1);

P0=A[1];P2=C[7];Delay(1);

P0=A[2];P2=C[6];Delay(1);

P0=A[3];P2=C[5];Delay(1);

P0=A[4];P2=C[4];Delay(1);

P0=A[5];P2=C[3];Delay(1);

P0=A[6];P2=C[2];Delay(1);

P0=A[7];P2=C[1];Delay(1);

}

}

void main()

{

while(1)

{

Xian_shi();

Yun_suan();

show(Out_put);

}

}

展开阅读全文

01-LedTest -- 实现LED按照一定频率闪烁。主要用来测试LED工作是否正常。P10要接通。 02-CrossLed -- 实现花灯显示。主要学习对软件延时的使用。P10要接通。 03-FlowRight -- 实现流水灯,方向是从左向右。主要学习在C语言里如何实现准确的位操作。P10要接通。 04-FlowLeft -- 实现流水灯,方向是从右向左。主要学习在C语言里如何实现准确的位操作。P10要接通。 05-button -- 独立按键测试,实现按哪个按键然后使用对应LED显示。实现按键的检测和LED的控制。拨码开关要打到OFF位置。 06-boma -- 用LED显示拨码状态。不可以按按键。 07-Relay -- 继电器测试程序,并有LED指示同时伴有蜂鸣器的声音。P8纵向连接上面2个。 08-music -- 用C语言演奏生日快乐歌,使用软件定时。使用软件定时演奏生日快乐歌。P8纵向连接上面2个。 09-musicasm -- 用汇编语言演奏一首民歌,使用硬件定时。主要学习51定时器汇编语言编中断功能,和如何编中断服务程序。P8纵向连接上面2个。 10-music2 -- 用C语言中断演奏。主要学习在C语言中定义51内部定时器中断服务程序。P8纵向连接上面2个。 11-disp1234 -- 采用软件延时在数码管上显示1234ABCD。这是比较普遍的数码管显示。P14接通 12-disp1234int -- 采用硬件延时在数码管上显示1234ABCD。利用中断可以节约资源,这个程序比10更好。P14接通 13-adddec -- 使用两个按键S22,S23控制数码管上显示的数加减,具有去抖动功能。主要讲如何进行数码管动态显示并且怎样对键盘去抖动。P14接通。 14-time -- 15-alarm -- 综合实验,实现倒计时结束时使用蜂鸣器报警,编程技巧的组合。P8纵向连接上面2个。 16-uart -- UART发送和接收,实现从PC发送到单片机任何字母和数字,单片机立即向PC发送同样的字母数字可以由超级终端或者串口调试助手调试。 17-uartint -- UART接收采用不占用资源的中断接收,其余同16。推荐使用串口中断方式,使用查询方式太占用资源。 18-18b20 -- 使用温度传感器18B20测温度,并用数码管显示。P14接通。 19-1602 -- 使用LCD1602显示字符。LCD1602接到P4,方向和板子方向相反。 20-24c08 -- 对24c08进行读操作。并把进和读到的数用LED显示。P8纵向连接下面2个。 21-matrix -- 调试矩阵键盘,对应LED亮。注意,本程序执行需要把拨码开关打到OFF状态,程序只有矩阵键盘前两行显示,后两行请自行添加代码。 22-DS1302 -- 使用DS1302时钟芯片对预制的时间进行计时。P9横向连接左边两个。 23-chibang -- 演奏《飞舞翅膀的女孩》等音乐的综合程序。 24-wannianli -- 综合程序,用DS1302,LCD1602,温度传感器等板上设备做一个万年历。LCD1602要正确连接,P9横向连接左边两个。使能DS1302。独立按键从左到右功能为,选择设置/加/减/确定,由于去抖动功能和LCD响应时间问题,所以要按时间稍微长一点。 25-demo -- 使用RS-232实现PC与51之间通信,详细操作方法请见相关教程。 26-remote -- 红外功能测试程序,使用普通遥控器和红外接收头协同工作,用板上LED显示接收状态,LED_EN跳线必须接通,否则观察不到LED状态。 27-1602-scroll -- LCD1602动态字幕显示,方便用户理解1602的用户指令集。有时程序不正常,则为LCD1602的RAM没有清空所致,必须给板子重新上电,并按一次复位键。 28-12864 -- LCD12864显示程序。AT89S5x系列单片机需要摘掉LCD下载程序,下载完毕后插上LCD,并按复位键才可以正常显示,带着LCD下载程序会失败。STC单片机则无此问题。 29-12864-pic -- LCD12864的汉字,图形,半屏,反白及动态显示测试程序。注意事项同28。 30-adc0832 -- 扩展ADC0832调试程序,具体扩展口请见程序内说明。
/*******************说明:************************** 单片机进入掉电模式后,外部时钟停振, CPU/定时器/串口全部停止工作,只有外部中断处于工作状态 使单片机进入掉电模式的方法是:将PCON寄存器的PD位置1 -------------------------------------------------- 实验现象:系统复位后,P0口所有LED灯被点亮,无闪烁.说明 单片机进入了掉电模式,按下中断按键INT0后,所有LED灯 闪烁,说明单片机从掉电模式中被唤醒 -------------------------------------------------- 相关资料请参考STC89C51RC.pdf第78页 -------------------------------------------------- 基于开发板ZS001编 开发板购买地址: http://shop60591679.taobao.com/ QQ:284083167 Email:284083167@qq.com 对此程序有任何疑问可QQ或者邮件联系 **************************************************/ #include <reg52.h> #define uchar unsigned char #define uint unsigned int //功能:延时1毫秒 //入口参数:x //出口参数:无 //说明:当晶振为12M时,j<112;当晶振为11.0592M时,j<122 void Delay_xms(uint x) { uint i; uchar j; for(i=0;i<x;i++) for(j=0;j<112;j++); } //外部中断0函数,中断方式:下降沿中断 void INT0_L(void) interrupt 0 { PCON|=0x02; //进入掉电模式 } void INT1_fall(void) interrupt 3 { //PCON|=0x02; //进入掉电模式 } //主函数 void main(void) { Delay_xms(50);//等待系统稳定 EA=0; //关总中断 IT0=1; //下降沿中断 EX0=1; //开INT0中断 IT1=1; //下降沿中断 EX1=1; //开INT1中断 EA=1; //开总中断 P0=0x00; //点亮所有LED //PCON|=0x02; //进入掉电模式 while(1) { P0=0x00; //点亮P0口所有LED Delay_xms(1000); P0=0xff; //关闭P0口所有LED Delay_xms(1000); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值