完整代码
#include <STC15F2K60S2.H>
#include <intrins.H>
#include <stdio.H>
#define u8 unsigned char
#define u16 unsigned int
sbit RX=P1^1;
sbit TX=P1^0;
u8 code Nodat[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 L1=0,L2=0,L3=0;
u8 smg_i=0,smgmode=0,tab[8];
u8 keyval=0;
u16 cont2;
u16 distance=0,parm=30;
bit flag10ms,flag100ms,flag200ms;
//======== ==================初始化函数=========================
void initsystem()
{
P0=0; P2=0xa0; P2=0;
P0=0xff; P2=0x80; P2=0;
}
void Delay14us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 39;
while (--i);
}
//======== T0测距
void Timer0Init(void) //微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
}
//======== T1串口
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE6; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
}
//======== T2定时
void Timer2Init(void) //1毫秒@12.000MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0x18; //设置定时初值
T2H = 0xFC; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04;
EA=1;
}
//======== =================数据读取函数=========================
//======== 测距数据T0
u16 read_distance()
{
u8 i;
u16 val;
for(i=0;i<8;i++)
{
TX=1;
Delay14us();
TX=0;
Delay14us();
}
TR0=1;
while((RX==1)&&(TF0==0));
TR0=0;
if(TF0==1)
{
val=999; TF0=0;
TH0=0x00; TL0=0x00;
}
if(RX==0)
{
val=(TH0<<8 |TL0)*0.017;
TH0=0x00; TL0=0x00;
}
return val;
}
//======== 串口打印T1
void sendbyte(u8 udat)
{
SBUF=udat;
while(TI==0);
TI=0;
}
char putchar(char c)
{
sendbyte(c);
return c;
}
//======== 定时函数T2
void t2int() interrupt 12 //中断入口
{
cont2++;
if(cont2==1000)
cont2=0;
if(cont2%2==0)
{
P0=~(L1+2*L2+4*L3); P2=0x80; P2=0;
P0=0; P2=0xc0; P2=0;
P0=tab[smg_i]; P2=0xe0; P2=0;
P0=(1<<smg_i); P2=0xC0; P2=0;
smg_i++; smg_i&=0x07;
if(cont2%10==0)
{ flag10ms=1;
if(cont2%200==0)
{ flag200ms=1;
}
}
}
}
//======== =================数码管显示=========================
void setsmg()
{
switch(smgmode)
{
case 0 :
L1=1; L2=0;
tab[0]=0xc1;
tab[1]=Nodat[1];
tab[2]=0xff;
tab[3]=0xff;
tab[4]=0xff;
tab[5]=Nodat[distance/100];
tab[6]=Nodat[distance/10%10];
tab[7]=Nodat[distance%10];
break;
case 1 :
L2=1; L1=0;
tab[0]=0xc1;
tab[1]=Nodat[2];
tab[2]=0xff;
tab[3]=0xff;
tab[4]=0xff;
tab[5]=Nodat[parm/100];
tab[6]=Nodat[parm/10%10];
tab[7]=Nodat[parm%10];
break;
}
}
//======== =================按键扫描========================
u8 read_key()
{
u8 val=0,x=0,y=0;
P3=0x0f; P42=0; P44=0;
if(!P32) x=1;
else if(!P33) x=0;
P3=0xf0; P42=1; P44=1;
if(!P42) y=2;
else if(!P44) y=1;
val=x+y*4;
return val;
}
void scankey()
{
u8 up,down,temp;
static u8 old;
temp=read_key();
down=temp&(temp^old);
up=~temp&(temp^old);
old=temp;
if(up) keyval=up;
}
//======== =================主函数========================
void main()
{
initsystem();
Timer0Init();
UartInit();
Timer2Init();
while(1)
{
switch(keyval)
{
case 4 : if(smgmode) smgmode=0; else smgmode=1; break;
case 8 : if(!smgmode) parm=distance; break;
case 9 : ES=1; printf("Distance:%dcm\r\n",distance); ES=0; break;
case 12: if(smgmode) parm+=10; break;
case 16: if(smgmode) { if(parm<=0) parm=0; else parm-=10;} break;
}
keyval=0;
if(flag10ms)
{ flag10ms=0;
scankey();
if(flag200ms)
{ flag200ms=0;
if(distance>parm)
L3=!L3;
else L3=0;
setsmg();
distance=read_distance();
}
}
}
}
驱动程序
居然一个都没有使用!!!!