深度数据通过串口发送叠加问题

[复制链接]
844|1
 楼主| damoyeren 发表于 2014-12-19 13:34 | 显示全部楼层 |阅读模式
本帖最后由 damoyeren 于 2014-12-19 13:36 编辑
  1. 如何把counter的内容叠加到depth后边?这个程序只能在串口软件上显示depth:
  2. #include <reg52.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. typedef unsigned long int lint;


  6. sbit ENLED = P1^4;
  7. sbit ADDR0 = P1^0;
  8. sbit ADDR1 = P1^1;
  9. sbit ADDR2 = P1^2;
  10. sbit ADDR3 = P1^3;

  11. lint counter; //脉冲计数器
  12. uchar a,b,c,d,e,f;//定义数码管的位
  13. code uchar table[]={
  14. 0xc0,0xf9,0xa4,0xb0,
  15. 0x99,0x92,0x82,0xf8,
  16. 0x80,0x90,0x88,0x83,
  17. 0xa7,0xa1,0x86,0x8e
  18. };

  19. code uchar depth_sample[20]="depth:";
  20. //code uchar depth_[]="深度:"; //查资料,如何把汉字“深度”显示出来

  21. /*串口(定时器T1)初始化函数,数码管扫描频率(定时器T0)初始化函数*/
  22. void uart_scan_init()
  23. {
  24. TMOD = 0X21;//定时器T1工作在方式2,用于产生波特率 ;定时器T0工作在方式1,用于产生数码管扫描时间
  25. SCON = 0X50;//串口工作在方式1,允许接收
  26. TH1 = 0XFD;
  27. TL1 = 0XFD;//9600波特率置初值
  28. TH0 = 0xff;
  29. TL0 = 0xd2;//设定定时器初值,50us定时
  30. TR1 = 1;//启动定时器T1
  31. TR0 = 1;//启动定时器T0
  32. }


  33. /*串口发送函数*/
  34. void uart_send (uchar *dat)
  35. {
  36. while(*dat!='\0')
  37. {
  38. SBUF =*dat;
  39. while(!TI);
  40. TI = 0;
  41. dat++;
  42. }
  43. }
  44. /*中断初始化函数*/
  45. void interrupt_init()
  46. {
  47. EA = 1;//开启总中断
  48. EX0 = 1;//开启外部中断0允许
  49. IT0 = 1;//设置外部中断0为电平触发方式,下降沿有效
  50. }


  51. /*中断服务函数*/
  52. void int0() interrupt 0
  53. {
  54. counter++;
  55. }

  56. /*深度脉冲数据处理函数*/
  57. void pulse_data_process()
  58. {
  59. lint dat;
  60. dat = counter;
  61. //dat = 123456;
  62. a = dat/100000;
  63. b = dat%100000/10000;
  64. c = dat%10000/1000;
  65. d = dat%1000/100;
  66. e = dat%100/10;
  67. f = dat%10;
  68. }

  69. /*显示扫面函数*/
  70. void display_scan ()
  71. {
  72. static uchar j = 0;
  73. //pulse_data_process();
  74. switch (j)
  75. {
  76. case 0:ADDR0 = 0;ADDR1 = 0; ADDR2 = 0;P0=table[f];j++; break;
  77. case 1:ADDR0 = 1;ADDR1 = 0; ADDR2 = 0;P0=table[e];j++; break;
  78. case 2:ADDR0 = 0;ADDR1 = 1; ADDR2 = 0;P0=table[d];j++; break;
  79. case 3:ADDR0 = 1;ADDR1 = 1; ADDR2 = 0;P0=table[c];j++; break;
  80. case 4:ADDR0 = 0;ADDR1 = 0; ADDR2 = 1;P0=table[b];j++; break;
  81. case 5:ADDR0 = 1;ADDR1 = 0; ADDR2 = 1;P0=table[a];j = 0; break;
  82. default:break;
  83. }
  84. }

  85. void scan_time()
  86. {
  87. if (TF0 == 1) //此程序决定数码管每一位之间显示的时间差
  88. {
  89. TF0 = 0; //如果定时器溢出,不用于中断模式,需要手动清零
  90. TH0 = 0xff;
  91. TL0 = 0xd2;//定时器溢出后TH0和TL0需要重新赋值
  92. display_scan ();//50us时间到进行数码管扫描
  93. }
  94. }
  95. /*主函数*/
  96. void main ()
  97. {
  98. ENLED = 0;
  99. uart_scan_init();
  100. interrupt_init();
  101. while(1)
  102. {
  103. pulse_data_process();
  104. scan_time (); //把扫描函数放在主函数里,扫描时间的快慢while(1)执行的时间决定
  105. uart_send (depth_sample);
  106. uart_send (&counter);//这句感觉怪怪的!
  107. uart_send ("\n");//转义字符串,换行的意思
  108. }
  109. }//把显示扫描函数放在while(1)里,无法确定扫描时间,它的时间由while内函数的执行时间决定

ayb_ice 发表于 2014-12-19 15:20 | 显示全部楼层
typedef unsigned int U16;
typedef unsigned char U8;
typedef char C8;
void uart_send_depth_sample(U16 counter)
{
        uchar string[] = "depth:12345.\n";

        string[sizeof("depth:12345.\n")-1-1-0] = counter % 10 + '0';
        counter /= 10;
        string[sizeof("depth:12345.\n")-1-1-1] = counter % 10 + '0';
        counter /= 10;
        string[sizeof("depth:12345.\n")-1-1-2] = counter % 10 + '0';
        counter /= 10;
        string[sizeof("depth:12345.\n")-1-1-3] = counter % 10 + '0';
        counter /= 10;
        string[sizeof("depth:12345.\n")-1-1-4] = counter % 10 + '0';
//        counter /= 10;

        {
                U8 i = 0;
                while(1)
                {
                        U8 c = string[i++];
                        if(c == '\0'){
                                break;
                        }
                        SBUF = c;
                        while(!TI){
//                                __nop();
                        }
                        TI = 0;
                }
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

126

主题

393

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部