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