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

请大家帮我看一下这个程序哪里出错了

[复制链接]
admin 发表于 2012-9-2 08:44:07 | 显示全部楼层 |阅读模式

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

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

×
它正常显示几分钟后,显示就停止了,但是时钟还是继续走,你按一下遥控器它又继续走了,几分钟后又停止了,程序如下
#include<reg51.h>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
//#include <stadio.h>
#define uchar unsigned char
#define uint unsigned int
#define DS12887a XBYTE[0x000a]
#define DS12887b XBYTE[0x000b]
#define sec_com XBYTE[0x0000]
#define min_com XBYTE[0x0002]
#define hour_com XBYTE[0x0004]
#define day_com XBYTE[0x0007]
#define month_com XBYTE[0x0008]
#define year_com XBYTE[0x0009]
//#define century_com XBYTE[0x7f32]
sbit ir=P3^2; //红外端口
uchar k=0;
uchar value[6];
sbit DQ = P3^4; //温度传送数据IO口
uchar zhengshu,xiaoshu; //温度值
uchar code DATA[] = {
/* 0 1 2 3 4 5 6 7 8 9 暗 - E R O 暗 */
0x81, 0xF3, 0x49, 0x61, 0x33, 0x25, 0x05, 0xF1, 0x01, 0x21, 0xFF, 0x7F, 0x0D, 0x5F, 0x47, 0xFF,
/*0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 暗 暗 暗 暗 暗 暗 */
0x80, 0xF2, 0x48, 0x60, 0x32, 0x24, 0x04, 0xF0, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
uchar sec,min,hour,day,month,year;
uchar sec1,min1,hour1,day1,month1,year1;
uchar count,keycode;
uchar IR_dat[2],tem;
uchar ir_flag=0,x=0;
uchar flag=0;
uchar ir_flag1=0;
uchar value[]={6,5,4,3,2,1,1,1,8,0,1,1,0,2};
sbit shuru=P1^0;
sbit yiwei=P1^1;
sbit suocun=P1^2;
void out_disp(uchar);
void gettime();
void settime();
void delay(uchar);
void DS12887_init();
void time();
void ReadTemp(void);
void ir_code();
void init(void);
void main(void)
{
init();
DS12887_init();
ReadTemp();
while(1)
{
if(!ir_flag)
{
gettime(); //获取时间
if(value[0]==0x00)
{
ReadTemp(); //开启温度采集程序
}

out_disp(DATA[xiaoshu]);
out_disp(DATA[(zhengshu%10)+16]);
out_disp(DATA[zhengshu/10]);
out_disp(DATA[0]);
out_disp(DATA[0]);
out_disp(DATA[0]);
out_disp(DATA[value[0]]);
out_disp(DATA[value[1]]);
out_disp(DATA[value[2]]);
out_disp(DATA[value[3]]);
out_disp(DATA[value[4]]);
out_disp(DATA[value[5]]);
out_disp(DATA[value[6]]);
out_disp(DATA[value[7]]);
out_disp(DATA[value[8]]);
out_disp(DATA[value[9]]);
out_disp(DATA[10]);
out_disp(DATA[10]);
out_disp(DATA[value[10]]);
out_disp(DATA[value[11]]);
out_disp(DATA[value[12]]);
out_disp(DATA[value[13]]);
out_disp(DATA[10]);
out_disp(DATA[10]);
suocun=0;
delay(1);
suocun=1; //输出锁存
}
else{
gettime();
x=0;
flag=1;
tem=value[x];
while(ir_flag)
{
value[x]=tem;
out_disp(DATA[xiaoshu]);
out_disp(DATA[(zhengshu%10)+16]);
out_disp(DATA[zhengshu/10]);
out_disp(DATA[0]);
out_disp(DATA[0]);
out_disp(DATA[0]);

out_disp(DATA[value[0]]);
out_disp(DATA[value[1]]);
out_disp(DATA[value[2]]);
out_disp(DATA[value[3]]);
out_disp(DATA[value[4]]);
out_disp(DATA[value[5]]);
out_disp(DATA[value[6]]);
out_disp(DATA[value[7]]);
out_disp(DATA[value[8]]);
out_disp(DATA[value[9]]);
out_disp(DATA[10]);
out_disp(DATA[10]);
out_disp(DATA[value[10]]);
out_disp(DATA[value[11]]);
out_disp(DATA[value[12]]);
out_disp(DATA[value[13]]);
out_disp(DATA[10]);
out_disp(DATA[10]);
suocun=0;
delay(1);
suocun=1; //输出锁存
delay(800);

value[x]=0xff;
out_disp(DATA[xiaoshu]);
out_disp(DATA[(zhengshu%10)+16]);
out_disp(DATA[zhengshu/10]);
out_disp(DATA[0]);
out_disp(DATA[0]);
out_disp(DATA[0]);

out_disp(DATA[value[0]]);
out_disp(DATA[value[1]]);
out_disp(DATA[value[2]]);
out_disp(DATA[value[3]]);
out_disp(DATA[value[4]]);
out_disp(DATA[value[5]]);

out_disp(DATA[value[6]]);
out_disp(DATA[value[7]]);
out_disp(DATA[value[8]]);
out_disp(DATA[value[9]]);
out_disp(DATA[10]);
out_disp(DATA[10]);
out_disp(DATA[value[10]]);
out_disp(DATA[value[11]]);
out_disp(DATA[value[12]]);
out_disp(DATA[value[13]]);
out_disp(DATA[10]);
out_disp(DATA[10]);
suocun=0;
delay(1);
suocun=1; //输出锁存
delay(800);
}
}
}
}
/***********ds12887子程序*************************/
void DS12887_init()
{
DS12887a=DS12887a&0x2f; // DV2=DV0=0 00101111 uip=1,即将更新
DS12887a=DS12887a|0x20; // DV1=1 00100000
DS12887b=DS12887b&0x7f; // SET=0,时间数据正常更新;DM=0,二进制数据模式
DS12887b=DS12887b|0x06; // 寄存器B的24/12位置1,24小时时间模式
DS12887b=DS12887b|0x80; // SET=1,芯片DS12C887处于设置状态芯片更新被禁止UIP=0,初始化各个时间
sec_com=(value[1]*10)+value[0]; //秒
min_com=(value[3]*10)+value[2]; // 分
hour_com=(value[5]*10)+value[4]; //时
day_com=(value[7]*10)+value[6];
month_com=(value[9]*10)+value[8];
year_com=(value[11]*10)+value[10];
DS12887b=DS12887b&0x7f; // SET=0,芯片DS12C887恢复正常数据更新状态

}

/*给时间芯片置初值*/
void settime()
{
DS12887b=DS12887b|0x80; // SET=1,芯片DS12C887处于设置状态芯片更新被禁止UIP=0,初始化各个时间
sec_com=sec1; //秒
min_com=min1; // 分
hour_com=hour1; //时
day_com=day1;
month_com=month1;
year_com=year1;
DS12887b=DS12887b&0x7f; // SET=0,芯片DS12C887恢复正常数据更新状态
}
/* 获取日历时钟函数 */
void gettime()
{
if((DS12887a&0x80)==0x00) //UIP=0,在224us后开始更新
{
sec=sec_com;
min=min_com;
hour=hour_com;
day=day_com;
month=month_com;
year=year_com;
}
time();
}
void time()
{
value[0]=sec%10;
value[1]=sec/10;
value[2]=min%10;
value[3]=min/10;
value[4]=hour%10;
value[5]=hour/10;
value[6]=day%10;
value[7]=day/10;
value[8]=month%10;
value[9]=month/10;
value[10]=year%10;
value[11]=year/10;
}
/***********595显示程序*************************/
void out_disp(uchar num)
{
uchar i,k;
for (i=0;i<8;i++)
{
k=num&0x80;
shuru=k;
num=num<<1; //左移
// shuru=CY;
yiwei=1; //移位
delay(1);
yiwei=0;
}
}
void delay(uchar t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<121;j++)
;
}
/***********ds18b20子程序*************************/
/***********ds18b20延迟子函数(晶振12MHz )*******/
void delay_18B20(uint i)
{
while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(6); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
/***********ds18b20读一个字节**************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
void ReadTemp(void)
{
uchar a=0;
uchar b=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_18B20(100);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
zhengshu=b*16+a/16;
xiaoshu=(a%16)*10/16;

}
/**************红外遥控************/
/*定时器初始化*/
void init(void)
{
EA=1; //开总中断
TMOD=0x01; //定时器0,模式2,8位自动装载模式
TH0=0xff; //定时50us
TL0=0xce;
ET0=1; //允许定时器中断
IT0=1;
EX0=1;
PT0=1;
}

/*定时器中断*/
void time0(void) interrupt 1
{
TH0=0xff; //定时50us
TL0=0xce;
count++;
}
/*外部中断*/
void init0(void) interrupt 0 using 1
{
EX0=0; //关闭外部中断
ir_code();
EA=0;
switch(keycode)
{
case 0x00:if(ir_flag){tem=1; }
break;
case 0x10:if(ir_flag){tem=2; }
break;
case 0x08:if(ir_flag){tem=3;}
break;
case 0x18:if(ir_flag){tem=4;}
break;
case 0x04:if(ir_flag){tem=5;}
break;
case 0x14:if(ir_flag){tem=6;}
break;
case 0x0c:if(ir_flag){tem=7;}
break;
case 0x1c:if(ir_flag){tem=8;}
break;
case 0x80:if(ir_flag){tem=9; }
break;
case 0x90:if(ir_flag){tem=0; }
break;
case 0x50: //频道+
if(ir_flag)
{
value[x]=tem;
if(x<13){ x++; }
else { x=0; }
tem=value[x];
}
break;
case 0x48: //频道-
if(ir_flag)
{
value[x]=tem;
if(x>0){ x--; }
else { x=13;}
tem=value[x];
}
break;
case 0x4C: /* 静音 */
if(ir_flag==0)
{
 楼主| admin 发表于 2012-9-2 08:44:10 | 显示全部楼层
ir_flag=1;
}
else
{
value[x]=tem;
if(flag)
{
sec1=(value[1]*10)+value[0];
min1=(value[3]*10)+value[2];
hour1=(value[5]*10)+value[4];
day1=(value[7]*10)+value[6];
month1=(value[9]*10)+value[8];
year1=(value[11]*10)+value[10];
settime();
flag=0;
}
ir_flag=0;
}
break;
}
IE0 = 0; /* 清除外部中断0边沿触发请求标志位 */
EX0 = 1; /* 允许外部中断0 */
EA=1;
}
/*M50462红外解码*/
void ir_code()
{
uchar i,j;
TR0=1;
count=0;
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
while(!ir); //0 0.25ms
while(ir); //1 0.75ms-0/1.75ms-1
if((count>30)&&(count<45))
{
count=0;
IR_dat[i]<<=1;
IR_dat[i]=IR_dat[i]|0x01 ;

} //1 /
else if((count>10)&&(count<20))
{
count=0;
IR_dat[i]<<=1;

}
}
if(IR_dat[0]!=0xe2)
break;
//错误处理,引导码是否正确引导码C0~C7由1110XX10组成
}
keycode=IR_dat[1];
IR_dat[0]=0;
IR_dat[1]=0;
TR0=0;
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2024-11-24 11:01 , Processed in 0.058536 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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