DIY单片机学习板
直播中

551992

12年用户 49经验值
私信 关注
[diy心得]

串口通信显示

  1. /***********************************************************************************************************
  2.         实现功能:上位机发送十六进制数据01、02、03、04到单片机,单片机
  3.                           收到数据后再发送对应的table数组到上位机,并且在数码管
  4.                           上面显示上位机发送的数据。如果上位机发送01~04以外的数
  5.                           据,单片机就发送"Please Enter number between 01 and 04"
  6.                           到上位机。

  7.         用到的单片机知识:1、定时器0工作方式1;
  8.                                           2、串口通信
  9.                                           3、数码管显示(数码管显示功能放在定时器0中断中可以避免连续发送同一个数据时数码管闪动)。

  10.         注意事项:将数码管显示功能放在定时器中断中时,应将中断时间尽量缩短,但是最小时间必须大于数码管中所有延时
  11.                           的总和,如果太长会出现前面的数码管会较后面的数码管暗。
  12. **************************************************************************************************************/

  13. #include
  14. #include
  15. #define uchar unsigned char
  16. #define uint unsigned int

  17. uchar code table01[] = {1};
  18. uchar code table02[] = {1,2};
  19. uchar code table03[] = {1,2,3};
  20. uchar code table04[] = {1,2,3,4};

  21. uchar code table[]={
  22. 0x3f,0x06,0x5b,0x4f,
  23. 0x66,0x6d,0x7d,0x07,
  24. 0x7f,0x6f,0x77,0x7c,
  25. 0x39,0x5e,0x79,0x71,
  26. 0x77,0x1F,0x4E,0x2D,
  27. 0x4F,0x47};

  28. ***it dula = P2^6;
  29. ***it wela = P2^7;

  30. uchar flag = 0;
  31. uchar RXD_DATA = 0;
  32. uchar *Pt_table;
  33. uchar cnt_table;
  34. uchar error = 1;

  35. void ConfigUART(uint baud);
  36. void display(uchar);
  37. void delayms(uint);

  38. void main()
  39. {
  40.         TMOD = 0x01;
  41.         TH0 = (65536 - 2752)/256;
  42.         TL0 = (65536 - 2752)%256;
  43.         EA = 1;
  44.         ET0 = 1;
  45.         TR0 = 1;

  46.         ConfigUART(9600);

  47.         while(1)
  48.         {
  49.                 //display(RXD_DATA);

  50.                 if(flag == 1)
  51.                 {
  52.                         flag = 0;

  53.                         switch(RXD_DATA)
  54.                         {
  55.                                 case 1:
  56.                                         Pt_table = table01;
  57.                                         cnt_table = sizeof(table01);
  58.                                         ti = 1;
  59.                                         break;       
  60.                                 case 2:
  61.                                         Pt_table = table02;
  62.                                         cnt_table = sizeof(table02);
  63.                                         TI = 1;
  64.                                         break;
  65.                                 case 3:
  66.                                         Pt_table = table03;
  67.                                         cnt_table = sizeof(table03);
  68.                                         TI = 1;
  69.                                         break;
  70.                                 case 4:
  71.                                         Pt_table = table04;
  72.                                         cnt_table = sizeof(table04);
  73.                                         TI = 1;
  74.                                         break;
  75.                                 default:
  76.                                         error = 0;
  77.                                         TI = 1;
  78.                                         printf("Please Enter number between 01 and 04");
  79.                                         TI = 0;
  80.                                         error = 1;
  81.                                         break;
  82.                         }
  83.                 }       
  84.         }
  85. }

  86. void ConfigUART(uint baud)
  87. {
  88.         SCON = 0x50;
  89.         TMOD = TMOD&0x0F;
  90.         TMOD = TMOD|0x20;
  91.         TH1 = 256 - (11059200/12/2/16)/baud;
  92.         TL1 = TH1;
  93.         //EA = 1;
  94.         ES = 1;
  95.         ET1 = 0;//禁止T1中断
  96.         TR1 = 1;
  97. }

  98. void InterruptUART()interrupt 4
  99. {
  100.         if(RI)
  101.         {
  102.                 RI = 0;
  103.                 RXD_DATA = SBUF;
  104.                 flag = 1;
  105.         }
  106.         if(TI & error)
  107.         {
  108.                 TI = 0;
  109.                 if(cnt_table > 0)
  110.                 {
  111.                         SBUF = *Pt_table;
  112.                         cnt_table--;
  113.                         Pt_table++;
  114.                 }
  115.         }
  116. }

  117. void Interrupt_T0()interrupt 1
  118. {
  119.         TH0 = (65536 - 2752)/256;
  120.         TL0 = (65536 - 2752)%256;
  121.         display(RXD_DATA);       
  122. }

  123. void display(uchar a)
  124. {
  125.         uchar ge = a&0x0f;
  126.         uchar shi = a>>4;
  127.        
  128.         dula = 1;
  129.         P0 = table[shi];
  130.         dula = 0;
  131.         P0 = 0xff;
  132.         wela = 1;
  133.         P0 = 0xfe;
  134.         wela = 0;
  135.         delayms(1);
  136.        
  137.         dula = 1;
  138.         P0 = table[ge];
  139.         dula = 0;
  140.         P0 = 0xff;
  141.         wela = 1;
  142.         P0 = 0xfd;
  143.         wela = 0;
  144.         delayms(1);
  145. }

  146. void delayms(uint ms)
  147. {
  148.         uint i,j;
  149.         for(i=ms;i>0;i--)
  150.                 for(j=110;j>0;j--);
  151. }


更多回帖

发帖
×
20
完善资料,
赚取积分