练习5

五、串口通信

1.在上位机上用串口助手调试发送任意字符串,单片机收到后返回给上位机,波特

率设为4800bps

 

  1 /*
  2 ÒÔ4800bps´Ó¼ÆËã»ú·¢ÈÎÒâÒ»×Ö½ÚÊý¾Ý£¬Í¨¹ýÊýÂë¹ÜÒÔÊ®½øÖÆÏÔʾ
  3 µÄÐÎʽÏÔʾ³öÀ´¡£
  4 */
  5 #include <reg52.h>
  6 
  7 #define uchar unsigned char
  8 #define uint  unsigned int
  9 
 10 sbit we = P2^7;    //ÊýÂë¹Üλѡ
 11 sbit du = P2^6;    //ÊýÂë¹Ü¶ÎÑ¡
 12 
 13 /*ÊýÂë¹Ü¶ÎÂë*/
 14 uchar code leddata[]={ 
 15  
 16                 0x3F,  //"0"
 17                 0x06,  //"1"
 18                 0x5B,  //"2"
 19                 0x4F,  //"3"
 20                 0x66,  //"4"
 21                 0x6D,  //"5"
 22                 0x7D,  //"6"
 23                 0x07,  //"7"
 24                 0x7F,  //"8"
 25                 0x6F,  //"9"
 26                 0x77,  //"A"
 27                 0x7C,  //"B"
 28                 0x39,  //"C"
 29                 0x5E,  //"D"
 30                 0x79,  //"E"
 31                 0x71,  //"F"
 32                 0x76,  //"H"
 33                 0x38,  //"L"
 34                 0x37,  //"n"
 35                 0x3E,  //"u"
 36                 0x73,  //"P"
 37                 0x5C,  //"o"
 38                 0x40,  //"-"
 39                 0x00,  //ϨÃð
 40                 0x00  //×Ô¶¨Òå
 41  
 42                          };
 43 
 44 /*1ºÁÃëÑÓʱº¯Êý*/
 45 void delay(uint z)    
 46 {
 47     uint x,y;
 48     for(x = z; x > 0; x--)
 49         for(y = 114; y > 0 ; y--);
 50 }
 51 
 52 /*
 53 ´®¿Ú³õʼ»¯º¯Êý
 54 ¹¤×÷ģʽ1 10λÒì²½ÊÕ·¢ ·¢ËÍËÙÂÊ4800bps
 55 */
 56 void UART_init()  
 57 {
 58     TMOD = 0x20;      //T1¹¤×÷ģʽ2  8λ×Ô¶¯ÖØ×°
 59     TH1 = 0xfa;
 60     TL1 = 0xfa;     //±ÈÌØÂÊ4800
 61     TR1 = 1;        //Æô¶¯T1¶¨Ê±Æ÷
 62     SM0 = 0;
 63     SM1 = 1;         //´®¿Ú¹¤×÷·½Ê½1 10λÒì²½
 64     REN = 1;        //´®¿ÚÔÊÐí½ÓÊÕ
 65 }
 66 
 67 /*3λÊýÂë¹ÜÏÔʾº¯Êý*/
 68 void display(uchar num)
 69 {
 70     uchar bai,shi,ge;
 71     bai = num / 100; //ÇóÄ£
 72     shi = num % 100 / 10; //ÇóÓà100ºóÇó³öÓжàÉÙ¸ö10 
 73     ge  = num % 10; //ÇóÓà
 74     
 75     P0 = 0xff;    //Çå³ý¶ÏÂë
 76     we = 1;
 77     P0 = 0xfe;     //µãÁÁµÚһλÊýÂë¹Ü
 78     we = 0;
 79 
 80     du = 1;
 81     P0 = leddata[bai];    //ÏÔʾ°Ùλ
 82     du = 0;
 83     delay(1);
 84 
 85     P0 = 0xff;    //Çå³ý¶ÏÂë
 86     we = 1;
 87     P0 = 0xfd;//µãÁÁµÚ¶þλÊýÂë¹Ü
 88     we = 0;
 89 
 90     du = 1;
 91     P0 = leddata[shi];    //ÏÔʾʮλ
 92     du = 0;
 93     delay(1);
 94 
 95     P0 = 0xff;    //Çå³ý¶ÏÂë
 96     we = 1;
 97     P0 = 0xfb;//µãÁÁµÚÈýλÊýÂë¹Ü
 98     we = 0;
 99 
100     du = 1;
101     P0 = leddata[ge];  //ÏÔʾ¸÷λ
102     du = 0;
103     delay(1);    
104 }
105 
106 void main()
107 {
108     UART_init();//´®¿ÚÅäÖóõʼ»¯
109     while(1)
110     {
111         if (RI)    //¼ì²âÊÇ·ñ½ÓÊÕÍê³É
112         {
113             RI = 0;    //Çå³ý½ÓÊÕ±ê־룬ÒÔ±ãÓÚÏ´νÓÊÕ
114         }
115         display(SBUF); //È¡³ö½ÓÊÕSBUFµÄÖµ¸³¸øÊýÂë¹ÜÏÔʾ
116     }
117 }
第一题

 

 

 

2.2.把矩阵键盘的键值以2400bps上传到计算机串口助手。

 

  1 /*
  2 °Ñ¾ØÕó¼üÅ̵ļüÖµÒÔ2400bpsÉÏ´«µ½¼ÆËã»ú´®¿ÚÖúÊÖ
  3 */
  4 #include <reg52.h>
  5 
  6 #define uchar unsigned char
  7 #define uint  unsigned int
  8 
  9 /*1ºÁÃëÑÓʱº¯Êý*/
 10 void delay(uint z)    
 11 {
 12     uint x,y;
 13     for(x = z; x > 0; x--)
 14         for(y = 114; y > 0 ; y--);
 15 }
 16 
 17 /*
 18 ´®¿Ú³õʼ»¯º¯Êý
 19 ¹¤×÷ģʽ1 10λÒì²½ÊÕ·¢ ·¢ËÍËÙÂÊ2400bps
 20 */
 21 void UART_init()  
 22 {
 23     TMOD = 0x20;      //T1¹¤×÷ģʽ2  8λ×Ô¶¯ÖØ×°
 24     TH1 = 0xf4;
 25     TL1 = 0xf4;     //±ÈÌØÂÊ2400,¼ÆË㹫ʽ256-11059200/2400/32/12
 26     TR1 = 1;        //Æô¶¯T1¶¨Ê±Æ÷
 27     SM0 = 0;
 28     SM1 = 1;         //´®¿Ú¹¤×÷·½Ê½1 10λÒì²½
 29 //    REN = 1;        //´®¿ÚÔÊÐí½ÓÊÕ
 30 }
 31 
 32 /*
 33     4*4¾ØÕó¼üÅÌɨÃ躯Êý
 34     ´ø·µ»ØÖµ£¬·µ»Ø¼üÖµÂë
 35 */
 36 uchar KeyScan()
 37 {
 38     uchar cord_l,cord_h;//ÉùÃ÷ÁÐÏߺÍÐÐÏßµÄÖµµÄ´¢´æ±äÁ¿
 39     P3 = 0xf0;//1111 0000
 40     if( (P3 & 0xf0) != 0xf0)//ÅжÏÊÇ·ñÓа´¼ü°´ÏÂ
 41     {
 42         delay(5);//Èí¼þÏû¶¶
 43         if( (P3 & 0xf0) != 0xf0)//ÅжÏÊÇ·ñÓа´¼ü°´ÏÂ
 44         {
 45               cord_l = P3 & 0xf0;// ´¢´æÁÐÏßÖµ
 46               P3 = cord_l | 0x0f;
 47               cord_h = P3 & 0x0f;// ´¢´æÐÐÏßÖµ
 48               while( (P3 & 0x0f) != 0x0f );//ËÉÊÖ¼ì²â
 49               return (cord_l + cord_h);//·µ»Ø¼üÖµÂë
 50         }    
 51     }
 52         
 53 }
 54 
 55 /*
 56     4*4¾ØÕó¼üÅ̼üÖµÂë´¦Àíº¯Êý
 57     ·µ»Ø×ª»»ºóµÄ¼üÖµÂë
 58 */
 59 uchar KeyPro()
 60 {
 61     uchar key_value; //´æ·Åת»»ºóµÄ°´¼üÖµ
 62     switch( KeyScan() )
 63     {
 64          //µÚÒ»ÐмüÖµÂë
 65         case 0xee: key_value = 0x01;        break;
 66         case 0xde: key_value = 0x02;        break;
 67         case 0xbe: key_value = 0x03;        break;
 68         case 0x7e: key_value = 0x04;        break;
 69         
 70         //µÚ¶þÐмüÖµÂë
 71         case 0xed: key_value = 0x05;        break;
 72         case 0xdd: key_value = 0x06;        break;
 73         case 0xbd: key_value = 0x07;        break;
 74         case 0x7d: key_value = 0x08;        break;
 75 
 76         //µÚÈýÐмüÖµÂë
 77         case 0xeb: key_value = 0x09;        break;
 78         case 0xdb: key_value = 0x0a;        break;
 79         case 0xbb: key_value = 0x0b;        break;
 80         case 0x7b: key_value = 0x0c;        break;
 81 
 82         //µÚËÄÐмüÖµÂë
 83         case 0xe7: key_value = 0x0d;        break;
 84         case 0xd7: key_value = 0x0e;        break;
 85         case 0xb7: key_value = 0x0f;        break;
 86     case 0x77: key_value = 0x10;        break;
 87     }
 88     return (key_value);//·µ»Ø×ª»»ºóµÄ¼üÖµÂë    
 89 }
 90 
 91 
 92 void main()
 93 {
 94     UART_init();//´®¿Ú³õʼ»¯
 95     while(1)
 96     {
 97         SBUF = KeyPro();//µ÷Óôø·µ»ØÖµµÄ¼üÖµÂëת»»º¯Êý£¬°Ñת»»ºóµÄ¼üÖµÂëËÍÈë·¢ËÍSBUF
 98         while(!TI);        //¼ì²âÊÇ·ñ·¢ËÍÍê±Ï
 99         TI = 0;            //Çå³þ·¢ËÍÍê±Ï±ê־룬ÒѱãÓÚÏ´η¢ËÍ
100     }
101 }
第二题

 

posted @ 2018-01-16 18:25  Justice-V  阅读(124)  评论(0)    收藏  举报