找回密码
 注册会员
img_loading
智能检测中
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

基于C51单片机的计算器系统设计 程序有错,希望高手改下,谢谢

[复制链接]
admin 发表于 2012-9-3 02:40:34 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
#include "REGX51.H"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar code disptab[]={0xB7,/*0*/0xA0,/*1*/0xD3,/*2*/0xF1,/*3*/0xE4,/*4*/0x75,/*5*/
0x77,/*6*/0xA1,/*7*/0xF7,/*8*/0xF5/*9*/}; //显示器缓冲区段码

// P10到P13的键驱动码
//uchar code drive_code[4]={0x7f,0xdf,0xbf,0xef};
// P1口的键盘译码
uchar code key_yima[16]={0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,
0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};
// 第一操作数 第二操作数
// 一秒到的标志 运算符标志 负号标志
uint second_flag, op, fuhao=0;
// 时间存储器 //操作数存储区
uint data timebuf[6]={0,0,0,0,9,1},shuju[2][4]={{0,0,0,0}, {0,0,0,0}};
void mdelay(uint delay) //延时1MS子程序
{ uint s;
for(;delay>0;delay--)
{ for(s=0;s<124;s++)
{;}
}
} //显示扫描次数**显示数据***位选口初值//
void timer0_init() //定时器0初始化子程序
{
EA=0;
TR0=0;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
EA=1;
ET0=1;
}
static void timer0_work(void) interrupt TF0_VECTOR using 1 ////定时器0中断子程序
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
second_flag++;

if(second_flag==100)
{
timebuf[0]+=1;
if(timebuf[0]==10) //分个位为十则清0,分十位加1
{ timebuf[0]=0;timebuf[1]+=1;}
if(timebuf[1]==6) //分十位为6则清0,时个位加1
{ timebuf[1]=0;timebuf[2]+=1;}
if(timebuf[2]==10) //十位为4则清0,时十位加1
{timebuf[2]=0;timebuf[3]++;}
if(timebuf[3]==6) //时十位为3则清0
{timebuf[3]=0;timebuf[4]++;}
if(timebuf[4]==4) //时十位为3则清0
{timebuf[3]=0;timebuf[5]++;}
if(timebuf[5]==3) //时十位为3则清0
timebuf[5]=0;
second_flag=0;
}
}
void time_disp(uint time1,uint wei1[],uchar first1) //时间显示子程序
{ uint scan_time1=0;
P2=first1;
if(time1==4)
{
for(;scan_time1<time1;scan_time1++)
{
P0=disptab[wei1[(scan_time1+2)]];
mdelay(2);
P2=_crol_(P2,1);
P0=0x00; //段码置0,消影
}
}
}
void key_disp(uint wei[],uchar first) //键盘显示子程序
{ static uint scan_time;
P2=first;
if(fuhao==0) //fuhao==0表示显示的数据是正数
{
if((wei[0]==0)&&(wei[1]==0)&&(wei[2]==0)&&(wei[3]==0)) //显示0
{P2=0x02;P0=0xb7;}
else if((wei[3]==0)&&(wei[2]==0)&&(wei[1]==0)) //显示*
{P2=0x02;P0=disptab[wei[0]];}
else if((wei[3]==0
for(scan_time=0;scan_time<2;scan_time++)
{
P0=disptab[wei[scan_time]];
mdelay(3);
P2=_crol_(P2,1);
P0=0x00; //段码置0,消影
}
}
else if(wei[3]==0) //显示***
{P2=first;
for(scan_time=0;scan_time<3;scan_time++)
{
P0=disptab[wei[scan_time]];
mdelay(3);
P2=_crol_(P2,1);
P0=0x00; //段码置0,消影
}
}
else
{
P2=first;
for(scan_time=0;scan_time<4;scan_time++) //显示****
{
P0=disptab[wei[scan_time]];
mdelay(3);
P2=_crol_(P2,1);
P0=0x00; //段码置0,消影
}
}
}
else //否则fuhao==1表示显示的数据是正数
if((wei[0]==0)&&(wei[1]==0)&&(wei[2]==0)&&(wei[3]==0)) //显示0
{P2=0x02;P0=0xb7;}
else if((wei[3]==0)&&(wei[2]==0)&&(wei[1]==0)) //显示*

}
else if((wei[3]==0)&&(wei[2]==0)) //显示**
{ P2=first;
for(scan_time=0;scan_time<2;scan_time++)
{
P0=disptab[wei[scan_time]];
mdelay(3);
P2=_crol_(P2,1);
P0=0x00; //段码置0,消影
}
mdelay(3);
P0=0x40;
mdelay(3);
P0=0x00;
}
else if(wei[3]==0) //显示***
{P2=first;
for(scan_time=0;scan_time<3;scan_time++)
{
P0=disptab[wei[scan_time]];
mdelay(3);
P2=_crol_(P2,1);
P0=0x00; //段码置0,消影
}
mdelay(3);
P0=0x40;
mdelay(3);
P0=0x00;
}
else
{
P2=first;
for(scan_time=0;scan_time<4;scan_time++) //显示****
{
P0=disptab[wei[scan_time]];
mdelay(3);
P2=_crol_(P2,1);
P0=0x00; //段码置0,消影
}
mdelay(3);
P2=_crol_(P2,1);
P0=0x40;
// mdelay(3);
// P0=0x00;
}
}
uchar key_search(void) //键盘译码数据获取子程序
calculate(uint m) // 计算器存储子程序
{ uint result,temp0,temp1;
temp0=shuju[0][0]+shuju[0][1]*10+shuju[0][2]*100+shuju[0][3]*1000;
temp1=shuju[1][0]+shuju[1][1]*10+shuju[1][2]*100+shuju[1][3]*1000;
switch(m)
{ case 1: //加法
{
result=temp0+temp1;
fenli(result);
break;
}
case 2: //减法
{ if(temp0<temp1)
{
result=temp1-temp0;
fuhao=1;
}
else
result=temp0-temp1;
fenli(result);

break;
}
case 3: //乘法
{
result=temp1*temp0;
fenli(result);
break;
}
case 4: //除法
{
result=temp0/temp1;
fenli(result);
break;
}
}
}
void main() //主函授
{ uint key_number,i=0,j,k;
//uchar ;
timer0_init();
while(1)
{ key_disp(shuju,0x02);
key_number=gotkey();
if(key_number==15) //模式键第一次按下,进入时钟状态
{ time_disp(4,timebuf,0x02);
while(gotkey()!=15)
{time_disp(4,timebuf,0x02);}
for(j=0;j<2;j++) // //模式键第二次按下,清除数据区,置负号位为0,进入计算器状态
for(k=0;k<4;k++) /// 置操作码为0
shuju[j][k]=0;
op=0;
fuhao=0;
}
else if((key_number>=0)&&(key_number<=9)) //数字键
{
save(key_number,i); //保存第i个输入的数据
key_disp(shuju,0x02); //显示第I行数据
}
else if((key_number>=10)&&(key_number<=13)) //读入的键是操作键
{
switch(key_number)
{
case 10: op=1;break; //加
case 11: op=2;break; //减
case 12: op=3;break; //乘
case 13: op=4;break; //除
}
i++; //操作次数
if(i==2) i=0;
}
else if(key_number==14) //读入的键是等于键
{
calculate(op); //计算
op=0; //操作位置0
shuju[1][0]=shuju[1][1]=shuju[1][2]=shuju[1][3]=0;//第二操作数置0
i=0; //操作次数置0
}
}

下面是总的具体电路系统图:

5_11518_4640d738b6c4703.gif
您需要登录后才可以回帖 登录 | 注册会员

*滑块验证:
img_loading
智能检测中
本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2025-7-7 12:00 , Processed in 0.052617 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表