我 想用单片机监控PC接收的数据,并通过RS232发命令,使PC控制3路电机的运动,和灯的通断情况!<br />程序如下:请各位指教(第一次玩单片机,帮忙改改,批评批评才能进步!)<br />#include <reg52.h><br /><br /><br />#define uchar unsigned char<br />#define uint unsigned int<br />unsigned char Axis[3];<br />#define fosc 11.0592 //晶振频率11.0592<br />unsigned char Time_delay;<br /><br />void delay_nms(uint n) //N ms延时函数<br />{<br /> uint i,j;<br /> for(i=n;i>0;i--)<br /> for(j=0;j<124;j++)<br /> {;;}<br />}<br />void delay(unsigned char n)//延时处理<br />{<br /> Time_delay = n;<br /> while(Time_delay != 0)<br /> {}<br />}<br />void time0_init(void) interrupt 1<br />{<br /> /* 延时2ms定时 */<br /> TH0 = -2000/256;<br /> TL0 = -2000%256;<br /> Read_key();<br />}<br />extern unsigned char Axis[3];<br />/*20个按键扫描驱动程序,横向扫描第一行:1.4 第二行:p1.5第三行:p1.6 第四行:p1.7 第五行:p2.1<br /> 纵向扫描:第一列:p1.0 第二列:p1.1 第三列:p1.2 第四列:p1.3*/<br /><br /> Read_key(void)//按键处理,返回按键的值<br />{<br />uchar i , j ;<br />uchar flag = 0 ; //按键标志<br />uchar dat = 0x1EF;<br />uchar Temp;<br />Temp = P0&0x00F; // 读取P03->P00 到Temp<br />if (Temp != 0x00F ) // 假如Temp==0x0f,则表示无键按下,则结束<br /> {<br /> delay_nms(10); // 延时10ms 左右去抖动<br /> Temp=P0&0x00F;<br /> if ( Temp != 0x00F ) // 确认有无键按下<br /> {<br /> for ( i =0 ; i < 5 ; i++ ) // 输出口P2_0,P07->P04 轮流输出<br /> { // 11110,11101,11011,10111,01111<br /> Temp=dat|0x0F;<br /> P0=Temp;<br /> Res_L=Temp&0x1F0;<br /> delay(2);<br /> Res_R = P0 &0x0F; // 取P03->P00 到Res_R<br /> Result=Res_L+Res_R;<br /> for(j=0;j<20;j++) // 查表<br /> {<br /> if ( Matrix[j] == Result)<br /> {<br /> flag=1; // 设置扫描结束标志位<br /><br /> break;<br /> }<br /> }<br /> if (flag ==1 ) // 如果标志位被设置退出此层循环<br /> {<br /> <br /> delay(2);<br /> <br /> break;<br /> }<br /> dat=dat<<1; // dat 左移一位<br /> }<br /> }<br /> }<br /> while ( ( P0&0x0F ) != 0x0F ) ; //等待按键释放<br />}<br />void Key_Process (void )<br />{<br /> while(1)<br /> Read_key();<br /> switch (Key_value)<br /> {<br /> case 0x1EE:<br /> {<br /> delay(2);<br /> //t i;<br /> //for (i = 0; i < 16; i++)<br /> Axis[0] = table1[0];<br /> // Axis[] = Table1;<br /> <br /> }<br /> break;<br /> case 0x1ED:<br /> {<br /> delay(2);<br /> Axis[0] = Table2[0];<br /> }<br /> break;<br /> case 0x1EB:<br /> {<br /> delay(2);<br /> Axis[0] = Table2[0];<br /> <br /> }<br /> break;<br /> case 0x1E7:<br /> {<br /> sd_com(0x11); <br /> }<br /> break;<br /> <br /> case 0x1DE: <br /> Number = shuzi_1;<br /> break;<br /> case 0x1DD: <br /> Number = shuzi_2;<br /> break;<br /> case 0x1DB: <br /> Number = shuzi_3;<br /> break;<br /> case 0x1BE: <br /> Number = shuzi_4;<br /> break;<br /> case 0x1BD: <br /> Number = shuzi_5; <br /> break;<br /> case 0x1BB: <br /> Number = shuzi_6; <br /> break;<br /> case 0x17E: <br /> Number = shuzi_7; <br /> break;<br /> case 0x17D: <br /> Number = shuzi_8; <br /> break;<br /> case 0x17B: <br /> Number = shuzi_9; <br /> break;<br /> case 0x0FE: <br /> Number = shuzi_0;<br /> break;<br /> <br /> case 0x0FD: <br /> Number = zhen ; <br /> break;<br /> case 0x0FB: <br /> Number = fu ; <br /> break;<br /> case 0x1D7:<br /> {<br /> sd_com(0x00);<br /> }; <br /> break;<br /> case 0x1B7:<br /> {<br /> write_com(0x04);<br /> Number[]-- ;<br /> sd_com(0x01);<br /> sd_data(Number);<br /> }; break;<br /> case 0x177:<br /> { <br /> write_com(0x06);<br /> Number[]++;<br /> sd_com(0x02);<br /> sd_data(Number);<br /> }; break;<br /> case 0x0F7: <br /> {<br /> if(enterflag = flag);<br /> sd_com(0x03);<br /> else<br /> {<br /> return;<br /> }<br /> };<br /><br /> ;break;<br /> case (0x1E7 & 0x1DE):<br /> {<br /> Lamp = on;<br /> sd_com(0x04);<br /> } break;<br /> case (0x1E7 & 0x1DD):<br /> {<br /> Lamp = 0ff;<br /> sd_com (0x05);<br /> delay(30);<br /> } break;<br /> case (0x1E7 & 0x0FD):<br /> {<br /> <br /> } break;<br /> case (0x1E7 & 0x0FB):<br /> {<br /> // Number[0] = space;<br /> // Number[1] = space;<br /> // Number[2] = space;<br /> // Number[3] = shuzi_0;<br /> // Number[4] = shuzi_0;<br /> sd_com = 0x06; <br /> }break;<br /> default: break;<br /> }<br /><br />}<br />/*------------------检查忙位-----------------------------*/<br />void lcd_busy()<br />{<br /> RS=0;<br /> RW=1;<br /> E=1;<br /> Lcd_Bus=0xff;<br /> while((Lcd_Bus & 0x80) ==0x80)<br /> E=0;<br />}<br /><br />/*------------------写命令到LCD------------------------------*/<br />void write_com(unsigned char uccmdcode)<br />{<br /> lcd_busy();<br /> RS=0;<br /> RW=0;<br /> E=1;<br /> Lcd_Bus=uccmdcode;<br /> delay(5);////////////////////在数据写入的时候加入适当的延时<br /> E=0;<br /> delay(5);<br />}<br /><br />/*-------------------写数据到LCD----------------------------*/<br />void write_data(unsigned char ucDispdata)<br />{<br /> lcd_busy();<br /><br /> RS=1;<br /> RW=0;<br /> E=1;<br /> Lcd_Bus=ucDispdata;<br /> delay(5);////在数据写入的时候加入适当的延时<br />// E = 0;<br /> delay(5);<br />}<br /><br />/*------------------初始化LCD屏--------------------------*/<br />void lcdreset()<br />{ delay(1000);<br /> write_com(0x30);<br /> delay(10); //选择基本指令集<br /> write_com(0x30); //选择8bit数据流<br /> delay(5);<br /> write_com(0x0c); //开显示(无游标、不反白)<br /> delay(10);<br /> write_com(0x01); //清除显示,并且设定地址指针为00H<br /> delay(500);<br /> write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位<br /> delay(0);<br /> <br />}<br />/*------------------显示字符---------------------<br />void Putchar(unsigned char ucRow,unsigned char ucLine,unsigned char *ucC)<br />{ <br /> write_com(0x30); //选择8bit数据流<br /> <br /> for(ucRow=0; ucRow<8; ucRow++)<br /> for(ucLine = 0;ucLine < 8; ucLine++)<br /> {<br /> write_data(*ucC);<br /> <br /> }<br />}-*/<br />/*------------------显示字符串--------------------------*/<br />void Putstring(unsigned char ucRow,unsigned char ucLine ,unsigned char *s)<br />{ while(*s > 0)<br /> { <br /> //for(ucRow= 0; ucRow < 16; ucRow++)<br /> // for(ucLine = 0; ucLine < 8; ucLine++)<br /> {<br /> write_com(0x36);<br /> // write_com(ucLine+0x80);<br /> // write_com(ucRow+0x80);<br /> write_com(0x30);<br /> write_data(*s);<br /> s++;<br /> }<br /> delay(50);<br /> }<br />}<br />void ShowNumber(unsigned char ucRow,unsigned char ucLine,unsigned char Number)<br />{<br /> unsigned char Number1[5];<br /> unsigned char Count;<br /> unsigned char NumFront;<br /> // unsigned char Single[1];<br /> if(Number <(-300.0 )&& Number > 300.0)<br /> return; <br /> if(Number>=0)<br /> Number = zhen_1;<br /> else<br /> Number = fu_1;<br /> <br /> Number1[1]=Number/100;<br /><br /> Number1[2]=(Number-100*(float)Number1[0])/10;<br /><br /> Number1[3]=(Number-100*(float)Number1[0]-10*(float)Number1[1])/1;<br /><br /> Number1[4]=((Number-100*(float)Number1[0]-10*(float)Number1[1]-1*(float)Number1[2])/10)*10;<br /><br /><br /> for(NumFront = 0; NumFront < 5; NumFront++)<br /> if(Number1[NumFront] != 0)<br /> break;<br /> for(Count =1; Count < 5; Count++)<br /> {<br /> switch(Number1[Count])<br /> {<br /> case 0:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_0);<br /> break;<br /><br /> case 1:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_1);<br /> break;<br /><br /> case 2:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_2);<br /> break;<br /><br /> case 3: <br /> Putchar(ucRow,ucLine+Count*8,shuzi_3);<br /> break;<br /> case 4:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_4);<br /> break;<br /> case 5:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_5);<br /> break;<br /> case 6:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_6);<br /> break;<br /> case 7:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_7);<br /> break;<br /> case 8:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_8);<br /> break;<br /> case 9:<br /> Putchar(ucRow,ucLine+Count*8,shuzi_9);<br /> break;<br /> default:break;<br /> }<br /> }<br />}<br />/*定义轴缓冲区*/<br />void Write_Axis(unsigned char ucRow,unsigned char ucLine, unsigned char *Axis)<br /> {<br /> // unsigned char Axis[2];<br /> unsigned char count[2] = {1, 2};<br /> switch(Axis[count[0]])<br /> {<br /> case 0:<br /> Putstring(1,2,table1);<br /> break;<br /> case 1:<br /> Putstring(1,2,Table2);<br /> break;<br /> case 2:<br /> Putstring(1,2,Table3);<br /> break;<br /> default:break;<br /> }<br />}<br /> <br /> <br />/*------------------清屏命令--------------------------*/<br />void clrscreen(void)<br /> {<br /> write_com(0x01);<br /> delay_nms(10);<br />}<br /><br />/*------------------首屏显示--------------------------*/<br />void display1(unsigned char ucRow,unsigned char ucLine ,unsigned char code *img)<br />{ <br /> int k;<br /> for (k = 0;k<9;k+=8)<br /> for(ucRow = 0; ucRow < 8 ; ucRow++)<br /> <br /> for(ucLine = 0; ucLine < 32; ucLine++)<br /> <br /> { <br /> write_com(0x36);//功能设置---8BIT控制界面,扩充指令集<br /> write_com(ucLine+0x80); //行地址<br /> write_com(ucRow+0x80+k); //列地址<br /> write_com(0x30);<br />// write_data(hz1[2*ucLine++]);<br /> <br /><br />// write_data(hz1[2*ucLine++]);<br /> <br /> <br /> } <br />}<br />void initial(void)<br />{<br /><br /> TMOD = 0X20;<br /> TH1 = 250;<br /> TL1 = 250;<br /> TR1 = 1;<br /> PCON = 0x80; //SMOD =1;<br /> SCON = 0x50; //工作方式1,波特率9600kbps,允许接收<br />}<br />/*******发送数据**********/<br />void send(unsigned char *temp, int j)<br />{<br /> int i = 0;<br /> lamp = 0;<br /> EA = 0;<br /> for(i =0;i<=j;i++)<br /> {<br /> ACC = *(temp +i);<br /> TB8 = P;<br /> SBUF = ACC; //发送数据<br /> while(TI ==0) //发送数据完毕时,TI自动置高<br /> TI = 0; //发送完时,TI清0,准备下次发送<br /> }<br /> EA = 1;<br /> lamp = 1;<br />}<br />/*********接受数据*************/<br />void Rcv_Int(void) interrupt 1<br />{<br /> lamp = 1;<br /> if(RI)<br /> {<br /> ACC = SBUF;<br /> if(P ==RB8)<br /> {<br /> rd_data = ACC; //将寄存器A中的数据存入变量RCVdata <br /> EvRcv = 1; //将已经接收到数据的标志只高?<br /> }<br /> RI = 0;<br /> }<br /> lamp = 1;<br />}<br />main()<br />{<br /> lcdreset();<br /> display1(0,0,0 hz1);<br /> while(1)<br /> {};<br />}<br /><br /> |
|