|
#include "W78E354.H"<br />#define COUNT 4 //定义接收缓冲区的大小//<br />#define uchar unsigned char<br />/*数据采集部分管脚定义*/<br />sbit RO=P2^0;//格雷码输入//<br />sbit RED=P2^1;//允许格雷码输入,低电平有效//<br />sbit DE=P2^2;//时钟输出允许,高电平有效//<br />sbit CLOCK=P2^3;//时钟输出//<br />/*串口输出部分管脚定义*/<br />sbit RE_DE=P1^4;//485控制引脚//<br />sbit Key_3=P0^4;<br />sbit Key_4=P0^5;<br />sbit ALARM=P0^3;<br />/*7219管脚定义*/<br />sbit LOAD = P0^2; //MAX7219 Load-Data Input: <br />sbit DIN = P0^0; //MAX7219 Serial-Data Input: <br />sbit CLK = P0^1; //MAX7219 Serial-Clock Input: <br />uchar bstop=0;/*结束泵工作的标志*/<br />uchar fstop=0;/*结束阀工作的标志*/<br />uchar key=0;<br />uchar key1=0;/*7219寄存器的标志设置*/<br />uchar idata displ[COUNT]={3,6,8};/*定义发送缓冲区*/<br />void COM_inter(void);/*声明函数变量*/<br />void manage_key1(void);<br />void manage_key2(void);<br />void Timer_ini(void);<br />void judge_key(void);<br />void collect(void);<br />main()<br />{ <br /> CLOCK=1;<br /> RED=0;/*接收器允许*/<br /> DE=1;/*发送器允许*/<br /> Key_3=0;/*泵,阀初始化*/<br /> Key_4=0;<br /> RE_DE=0;/*485准备接收*/<br /> Timer_ini();<br /> while(1)<br /> { <br /> collect();<br /> judge_key();<br /> }<br />}<br /><br />void Timer_ini(void) //定时器的初始化//<br />{<br /> TMOD=0x20;/*定时器0工作于方式2,定时器1工作于方式2, 0010 0010*/ <br /> TH1=0xb7;//实现数据传输率9600//<br /> TL1=0xb7;<br /> SCON=0x50;//选择串口工作方式1,打开接收允许//<br /> PCON=0x00;//波特率倍增设置//<br /> TR1=1;//启动定时器T1//<br /> ES=1;EA=1;//允许串口中断//<br />}<br /><br />//--------------------------------------------------------<br />//函数名称:COM_send();串口发送函数<br />//函数功能:把数据缓冲区的4位数据发送出去<br />//--------------------------------------------------------<br />void COM_send(void)<br />{<br /> uchar point;<br /> for(point=0;point<COUNT;point++) //连续发送4位数据,将数据发送到缓冲口//<br /> { <br /> SBUF=displ[point];//发送数据//<br /> while(TI!=1);<br /> TI=0;<br /> }<br /> ES=1;<br />}<br />//-----------------------------------------------<br />//函数名称:manage_key3()<br />//函数功能:按键3处理子程序<br />//-----------------------------------------------<br />void manage_key3(void)<br />{<br /> bstop++;<br /> if(bstop<=1)<br /> { <br /> Key_3=1;/*使外部泵开始工作*/<br /> }<br /> else<br /> {<br /> Key_3=0;/*结束泵工作*/<br /> bstop=0;/*标注清零*/<br /> } <br /><br /><br />}<br />//-----------------------------------------------<br />//函数名称:manage_key4()<br />//函数功能:按键4处理子程序<br />//-----------------------------------------------<br />void manage_key4(void)<br />{<br /> fstop++;/**/<br /> if(fstop<=1)<br /> {<br /> Key_4=1;/*使外部阀开始工作*/<br /> }<br /> else<br /> {<br /> Key_4=0;/*结束外部阀开始工作*/<br /> fstop=0;/*标注清零*/<br /> }<br />}<br /><br />//--------------------------------------------------------<br />//函数名称:com_interrup()串口接收中断处理函数<br />//函数功能:接收包括起始位0xFE,地址位和终止位0xEF在内的10bit数据到数据缓冲区<br />// ,地址不匹配,则接收到的是无效数字,不写到接收缓冲区<br />//--------------------------------------------------------<br />void COM_inter(void) interrupt 4 using 1//串口处理函数//<br />{ <br /> uchar a;/*串口标志*/<br /> RI=0;<br /> RE_DE=0;<br /> a=SBUF;<br /> switch(a)<br /> {<br /> case 0x01:ES=0;RI=0;manage_key1();ES=1;break;<br /> case 0x02:ES=0;RI=0;manage_key2();ES=1;break;<br /> case 0x03:ES=0;RI=0;manage_key3();ES=1;break;/*调用函数实现泵的控制*/<br /> case 0x04:ES=0;RI=0;manage_key4();ES=1;break;/*调用函数实现阀的控制*/<br /> default:RE_DE=1;RI=0;TI=0; ES=0;COM_send();break;/*使485处于发送状态,发送数据*/<br /> }<br />}<br />/******************************************<br />发送一个字节的子程序:<br />上升沿发送数据,<br />MSB first<br />******************************************/<br />void Write_Max7219_byte(unsigned char temp)<br />{<br /> unsigned char i;<br /> for (i=0; i<8; i++) <br /> { <br /> CLK = 0;<br /> DIN = (bit)(temp&0x80); <br /> temp <<=1; <br /> CLK = 1;<br /> }<br />}<br />/**********************************************************<br />向寄存器中写入一个数据<br />先写地址,后写数据<br />load 上升沿锁存数据<br />**********************************************************/<br />void Write_Max7219(unsigned char address,unsigned char dat)<br />{ <br /> LOAD = 0;<br /> Write_Max7219_byte(address); <br /> Write_Max7219_byte(dat);<br /> LOAD = 1; <br />}<br />//-----------------------------------------------<br />//函数名称:manage_key1()<br />//函数功能:按键1处理子程序<br />//-----------------------------------------------<br />void manage_key1(void)<br />{ <br /> key1++;/*进行寄存器的标志设置*/<br /> key++;<br /> switch(key1)<br /> {<br /> case 1:Write_Max7219(1, 0x80);break;//选择最低位寄存器,准备进行调节//<br /> case 2:Write_Max7219(2, 0);break;//选择次低位寄存器,进行调节//<br /> case 3:Write_Max7219(3, 0);break;//选择次中间寄存器,进行调节//<br /> case 4:Write_Max7219(4, 0);break;//选择最高位寄存器,进行调节//<br /> default:key1=0;break;<br /> }<br />}<br />//-----------------------------------------------<br />//函数名称:manage_key2()<br />//函数功能:按键2处理子程序,对显示的数据进行增1调节<br />//-----------------------------------------------<br />void manage_key2(void)<br />{<br /> switch(key)<br /> {<br /> case 1:{displ[0]++;Write_Max7219(1,(displ[0]|0x80));if((displ[0]|0x80)==0x8A)displ[0]=(0|0x80);}break;//依次对显示进行增量调节<br /> case 2:{displ[1]++;Write_Max7219(2,displ[1]);if(displ[1]==10)displ[1]=0;}break;<br /> case 3:{displ[2]++;Write_Max7219(3,displ[2]);if(displ[2]==10)displ[2]=0;}break;<br /> case 4:{displ[3]++;Write_Max7219(4,displ[3]);if(displ[3]==10)displ[3]=0;key=0;}break;<br /> default:key=0;break;<br /> }<br />}<br />/*延时子程序,延时时间为(16×N+24微秒)*/<br />void delay(unsigned int N)<br />{<br /> int i;<br /> for(i=0;i<N;i++);<br />}<br />//----键值判断--------------------------<br /><br />//---------------------------------------------------<br />void judge_key(void)<br />{uchar Key_value=0;<br /> Key_value=P1&0x0f;<br /> switch(Key_value)<br /> {<br /> case 0x0E:delay(30000);<br /> if(Key_value==(P1&0x0f))<br /> {<br /> manage_key1();break;<br /> }<br /> else break;<br /> <br /> case 0x0D:delay(30000);<br /> if(Key_value==(P1&0x0f))<br /> {<br /> manage_key2();break;<br /> }<br /> else break;<br /> case 0x0B:delay(30000);<br /> if(Key_value==(P1&0x0f))<br /> {<br /> manage_key3();break;<br /> }<br /> else break;<br /> case 0x07:delay(30000);<br /> if(Key_value==(P1&0x0f))<br /> {<br /> manage_key4();break;<br /> }<br /> else break;<br /> default: break;<br /> }<br />}<br />void collect(void)<br />{<br /> uchar Gdata[25];<br /> uchar Bdata[25];<br /> uchar i,j,k,l=0;<br /> unsigned long Tran=0;<br /> for(i=0;i<25;i++)<br /> {<br /> CLOCK=0;<br /> CLOCK=1;<br /> Gdata=RO;<br /> }<br /> i=0;<br /> Bdata[0]=Gdata[0];/*将首位赋给二进制首位*/<br /> for(j=1;j<=24;j++)<br /> {<br /> if(Gdata[j]==0)/*若格雷码为0,二进制与前一位相同*/<br /> Bdata[j]=Bdata[j-1];<br /> else/*若格雷码为1,二进制与前一位相反*/<br /> {if(l==0)<br /> {l++;<br /> if(Bdata[j-1]==1)<br /> {Bdata[j]=Bdata[j-1]-1;}<br /> else<br /> {Bdata[j]=Bdata[j-1]+1;}<br /> }<br /> else<br /> {<br /> if(Bdata[j-1]==1)<br /> {Bdata[j]=Bdata[j-1]-1;}<br /> else<br /> {Bdata[j]=Bdata[j-1]+1;}<br /> l=0;}<br /> }<br /> }<br /> for(k=0;k<=20;k++);/*延时*/<br /> for(i=0;i<25;i++)/*将转换的二进制存入长整形变量*/<br /> {<br /> Tran^=Bdata;<br /> Tran=Tran<<1;<br /> }<br /> displ[0]=(Tran/62111);//二进制转换成显示的工程算法,Diaply0显示的是最高位,//<br /> displ[1]=(Tran%62111)/6211;//此值赋给次高位//<br /> displ[2]=((Tran%62111)%6211)/621;<br /> displ[3]=(((Tran%62111)%6211)%621)/62;<br /> if((displ[0]==9)&&(displ[1]==9))/*出错控制*/<br /> {ALARM=0;} <br />}<br />程序在单独运行键盘显示时 能用;单独测试串口时 能够给单片机写入数据,上传的数据看不到 我以为是数据格式的问题,但是将两个程序放在一起的时候,就不好用了 请教这是为什么啊 ?多谢大家 |
|