本帖最后由 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内函数的执行时间决定
|