编辑: 645135144 2013-04-10

4 电路控制C语言程序 根据实验调试后的最终程序如下: #include #define uchar unsigned char #define uint unsigned int #define delay_ime 3/*宏定义*/ uchar k,dat[]={0,0,0,0,0,0,0,0};

uint tcount, t,u;

uchar dat1[]={0,0,0,0,0,0,0,0};

uchar dat2[]={0,0,0,0,0,0,0,0};

uchar dis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

uchar code SEG7[11]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/ 0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0xBF,/*-*/ };

/*数字显示数组*/ sbit tminute=P1^0;

sbit thour=P1^1;

sbit miaobiao1=P1^2;

sbit miaobiao2=P1^3;

sbit miaobiao3=P1^4;

/*端口定义*/ uchar ms=0;

uchar flag=0;

uchar sec=0;

uchar minit=0;

struct time{uchar second;

uchar minute;

uchar hour;

}time1;

uchar n,i;

void init();

void delay(n) { while(n--) { for(i=120;

i>

0;

i--);

} }/*延时子程序*/ void modify(void) { EA=0;

if(thour==0) { if(flag==0) { dat1[6]++;

time1.hour++;

delay(280);

if(dat1[6]>

9) { dat1[6]=0;

dat1[7]++;

} else if((dat1[7]>

1)&

&

(dat1[6]>

3)) { dat1[7]=0;

dat1[6]=0;

} } } // 数码管

3、4位(分钟位输出) if(tminute==0) { if(flag==0) { dat1[3]++;

time1.minute+minute计数存储 delay(280)按键扫描延迟 if(dat[3]>

=9) { dat1[4]++;

dat1[3]=0;

if(dat1[4]>

5) { dat1[4]=0;

} } } } if(miaobiao1==0) 秒表按键设定 TR0=0;

ET0=0;

TR1=0;

ET1=0;

flag=1;

dat[0]=0;

dat[1]=0;

dat[2]=0xbf;

dat[3]=0;

dat[4]=0;

dat[5]=0xbf;

dat[6]=0;

dat[7]=0;

TR0=1;

ET0=1;

TR1=1;

ET1=1;

} if(miaobiao2==0) 暂停按键设定 TR0=0;

ET0=0;

TR1=0;

ET1=0;

} if(miaobiao3==0) //返回按键设定 { TR0=1;

ET0=1;

TR1=0;

ET1=0;

flag=1;

ms=0;

sec=0;

minit=0;

} EA=1;

}/*按键扫描*/ void init(void) { TMOD=0x11;

TH0=0xDB;

TL0=0xFF;

TH1=0xDB;

TL1=0xFF;

ET0=1;

ET1=1;

TR0=1;

tcount=0;

ms=0;

sec=0;

minit=0;

EA=1;

}/*初始化*/ void test (void) { for(k=0;

k23) { dat1[6]=0;

// hour显示存储清零 dat1[7]=0;

time1.hour=0;

// hour计数存储清零 } dat[5]=10;

dat[2]=10;

dat[0]=dat1[0];

dat[1]=dat1[1];

dat[3]=dat1[3];

dat[4]=dat1[4];

dat[6]=dat1[6];

dat[7]=dat1[7];

flag=0;

P0=0x01;

ET0= 1;

} //跑秒 void time_2(void) interrupt

3 { EA=0;

TR0=0;

TH1=0xDB;

TL1=0xFF;

TR1=1;

ms++;

dat2[0]=ms%10;

dat2[1]=ms/10;

// if(ms>

=100) // 跑秒进制100 { ms=0;

sec++;

dat2[3]=sec%10;

dat2[4]=sec/10;

// if(sec>

=60) { sec=0;

minit++;

dat2[6]=minit%10;

dat2[7]=minit/10;

} } dat[5]=10;

dat[2]=10;

dat[0]=dat2[0];

dat[1]=dat2[1];

dat[3]=dat2[3];

dat[4]=dat2[4];

dat[6]=dat2[6];

dat[7]=dat2[7];

EA=1;

}

5 程序调试过程及相关问题 5.1 调试中已解决问题 在调试过程中出现过几个问题. (1)仿真时,元器件选错了:八位共阳极数码管选成了八位共阴极数码管,结果导入程序后出现的数字不是阿拉伯数字,而是反码.后来在调试程序的过程中,很长一段时间内没发现程序的问题反过头来找到了是元器件的选择错误问题. (2)时钟按键调整过后,在秒针没有进位(没走满一分钟)时钟显示是正确的,没有任何延迟问题,数字显示正确.但是一旦秒钟走满60后显示的数字就出现问题,调分、调时按键校正的时间根本没有加上去,时钟按照调节前显示的时间在运行和显示. (3)使用秒表功能时,当键入复位功能键时出现了反码,最后我们的解决方法是将秒表复位键同返回时钟键设置成同一按键,有效地解决了秒表复位问题,也简化了按键数量,节省了开支! (4)开始编写的程序,用的汇编语言编写的,写得很杂乱没有章法,在时钟调试中出现了问题后不能及时,准确的找到问题的所在,不但暴露出汇编语言学习得不扎实,还暴露出自己在书写程序时,缺少一种系统,规范的方法. 5.2 相关分析 出现以上问题后,经过调试、请教同学、查资料等多种途径基本都能解决问题. 在组员的相互配合下,在同学的探讨帮助下,共同解决了以下问题. 解决方案:(1)换用了共阳极7段数码管解决了原件配备问题.(2)这是由于数码管的计数存储和显示存储的问题,在计数存储的数据里已经计算好并把时钟走的时间和按键校正的时间相加,但是显示存储没相加导致了这个问题.解决办法:把寄存器里的数据与按键校正的数据做加法后再放进数码管里显示出来,添加的语句为:time1.minute++.(3)这是由于按键多余造成,经过按键整合2键合1很好的解决了这个问题.(4)由于用汇编有很大的难处,后来程序用C语言编写,规范的按括号与括号相对,多加注解的方法,在调试中减轻了很大困难,为以后的编程找到了有效的书写模板. 5.3 方案存在的问题 虽说解决了上面的一些问题,但是最重要的,最困难的问题不是解决过的,而是还没解决的.以下三个问题是本次设计依然存在的问题,提出来希望能进一步得到解决. (1)在秒表复位的电路中,结果是正确的,但是在你运行秒表程序又返回时钟界面后,再进入秒表,上面显示的数字不是00-00-00而是上次按返回时钟键的秒表时间.但是并不是说没复位,因为在1秒钟后秒表又进入正常的开始运行,时间也是与按秒表后的时间一样,在这个过程当中有个延迟,秒表要1秒钟时间去消化上次的数据.这个问题不知道怎么去解决,程序中延迟,中断部分都没什么问题,复位时要1秒钟的延迟来进入下次秒表运行的原因是? (2)在当初设定单独复位键时出现了一个代码问题,同样的代码0xBF程序中设定为/*-*/出现了不是横线也不是数字........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题