打印

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

[复制链接]
637|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
damoyeren|  楼主 | 2014-12-19 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 damoyeren 于 2014-12-19 13:36 编辑
如何把counter的内容叠加到depth后边?这个程序只能在串口软件上显示depth:
#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long int lint;


sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;

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

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

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


/*串口发送函数*/
void uart_send (uchar *dat)
{
while(*dat!='\0')
{
SBUF =*dat;
while(!TI);
TI = 0;
dat++;
}
}
/*中断初始化函数*/
void interrupt_init()
{
EA = 1;//开启总中断
EX0 = 1;//开启外部中断0允许
IT0 = 1;//设置外部中断0为电平触发方式,下降沿有效
}


/*中断服务函数*/
void int0() interrupt 0
{
counter++;
}

/*深度脉冲数据处理函数*/
void pulse_data_process()
{
lint dat;
dat = counter;
//dat = 123456;
a = dat/100000;
b = dat%100000/10000;
c = dat%10000/1000;
d = dat%1000/100;
e = dat%100/10;
f = dat%10;
}

/*显示扫面函数*/
void display_scan ()
{
static uchar j = 0;
//pulse_data_process();
switch (j)
{
case 0:ADDR0 = 0;ADDR1 = 0; ADDR2 = 0;P0=table[f];j++; break;
case 1:ADDR0 = 1;ADDR1 = 0; ADDR2 = 0;P0=table[e];j++; break;
case 2:ADDR0 = 0;ADDR1 = 1; ADDR2 = 0;P0=table[d];j++; break;
case 3:ADDR0 = 1;ADDR1 = 1; ADDR2 = 0;P0=table[c];j++; break;
case 4:ADDR0 = 0;ADDR1 = 0; ADDR2 = 1;P0=table[b];j++; break;
case 5:ADDR0 = 1;ADDR1 = 0; ADDR2 = 1;P0=table[a];j = 0; break;
default:break;
}
}

void scan_time()
{
if (TF0 == 1) //此程序决定数码管每一位之间显示的时间差
{
TF0 = 0; //如果定时器溢出,不用于中断模式,需要手动清零
TH0 = 0xff;
TL0 = 0xd2;//定时器溢出后TH0和TL0需要重新赋值
display_scan ();//50us时间到进行数码管扫描
}
}
/*主函数*/
void main ()
{
ENLED = 0;
uart_scan_init();
interrupt_init();
while(1)
{
pulse_data_process();
scan_time (); //把扫描函数放在主函数里,扫描时间的快慢while(1)执行的时间决定
uart_send (depth_sample);
uart_send (&counter);//这句感觉怪怪的!
uart_send ("\n");//转义字符串,换行的意思
}
}//把显示扫描函数放在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

粉丝