山东大学学士学位论文
部分程序:
//----------------Ds1302-------------------------
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) { unsigned char i; ACC = d; for(i=8; i>0; i--)
{ DS1302_IO = ACC0; DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) { unsigned char i; for(i=8; i>0; i--)
{ ACC = ACC >>1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; }
return(ACC); }
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据 { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); DS1302_CLK = 1;
21
// 写1Byte数据
山东大学学士学位论文
DS1302_RST = 0; }
unsigned char Read1302(unsigned char ucAddr) 据
{ unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); }
//读取DS1302某地址的数
3.4键盘功能设置
在软件的编写上,可以采用软件查询方式对按键进行识别[16]。读键子程序如图3.4所示。
键值功能设计:
系统默认显示的是当前时间和当前角度值,当第一次按下S1时,显示切换到角度上下限的显示,第二次按下调节角度下限的小数位,第三次按下调节角度下限的个位,依次按下,依次调节各位。
S2作为调节角度上下限时的加一及角度正负号的切换用。 S3作为调节角度上下限时的减一及角度正负号的切换用。 S4作为调节完毕后返回当前时间和当前角度值显示之用。 键盘功能程序代码请见附录。 键盘识别程序代码如下。
22
山东大学学士学位论文
开始 定时扫描 有键按下? 延时4ms 有键按下? 延时 4ms 读取键值 图3.4读键子程序
//---------------------获取键值------------------------- void getkey(void)
{
if(P00==0&&key_last0==1)
{ delay_flag=0; //delay_flag在定时器中4ms到置1
while(delay_flag==0); //延时4ms,去抖动 if(P00==0&&key_last0==1)
{ key_num=0;
key_last0=0;
delay_flag=0; //去抖动
while(delay_flag==0); //延时4ms,去抖动 }
else if(P00==1) key_last0=1;
23
山东大学学士学位论文
}
else if(P00==1) key_last0=1; if(P01==0&&key_last1==1) { delay_flag=0;
while(delay_flag==0); //去抖动
if(P01==0&&key_last1==1)
{
key_num=1; key_last1=0;
delay_flag=0;
while(delay_flag==0); //延时4ms,去抖动
else if(P01==1) key_last1=1;
}
else if(P01==1) key_last1=1; if(P02==0&&key_last2==1) { delay_flag=0;
while(delay_flag==0); //延时4ms,去抖动 if(P02==0&&key_last2==1) {
key_num=2; key_last2=0;
delay_flag=0; //去抖动
while(delay_flag==0); //延时4ms,去抖动 }
else if(P02==1) key_last2=1;
}
else if(P02==1) key_last2=1; if(P03==0&&key_last3==1) {
delay_flag=0;
while(delay_flag==0); //延时4ms,去抖动 if(P03==0&&key_last3==1)
24
山东大学学士学位论文
{
key_num=3; key_last3=0;
delay_flag=0;
while(delay_flag==0); //延时4ms,去抖动 } //去抖动
else if(P03==1) key_last3=1;
} }
else if(P03==1) key_last3=1;
3.5 通信部分
上位机与单片机通信按应答方式经行。由上位机给单片机发送一组命令数据,单片机受到命令经过分析后认为正常,则按照命令执行操作。将操作结果返回给上位机。若经过分析认为不正常,则返回给上位机出错信息。
单片机向上位机发送的数据的方式考虑了两种,第一种是等数据存储器容量存满了后在一块发,这种方式实时性不够,为了使角度数据的变化能够及时的传到上位机,采用定时发送,定时时间和上传的次数由上位机来定,这样一来就解决了实时性问题。
由于是定时发送,通过对数据的分析知道上位机收到的数据可能有重复的,或者是有FF字样。这可由时间标签,加以区分,而FF为数据存储器中尚未写进的字节单元,通过上位机软件可以滤除。
上位机用串口调试助手来进行数据发送,为了使数据直观,命令码全部使用BCD码,由单片机传来的数据也使用BCD码存储。 上位机给单片机的指令为:
报文开始 识别字(STX) 内容 字节数 0XEE 1 命令码 报文结束(ETX) (CMD) CC 视命令定 0XFF 1 25