如何改正请指点
发送程序
/************************************************************************************** *
*按下K1按键 开始计时
*按下K2按键 计时结束计算速度
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h> //左右移函数,头文件
#include<absacc.h> //访问绝对地址头文件
sbit k1=P1^0; //按键1开始计时
sbit k2=P1^1; //按键2终止计时开始计算速度
sbit dian=P0^7; //小数点
unsigned char xiao=0,ge=0,shi=0,bai=0; //定义数码管显示的个位和十位
unsigned int num=0,sec=0,m=0,v=0,t=0,t1=0,t2=0,t3=0;//定义ms、s、时间总数和速度
unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段控口
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数
*******************************************************************************/
void delay(unsigned int i)
{
while(i--); // 去抖延时
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init(void) //10微秒@12.000MHz
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TL0 = (65536-10000)%256; //设置定时初值
TH0 = (65536-10000)/256; //设置定时初值
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : display
* 函数功能 : 速度显示函数
*******************************************************************************/
/******速度显示函数******/
void display() //列车一般情况下列车的平均速度为300km/h约等于83m/s
{
ge=v%10; //求个位
bai=v/100; //求百位
shi=(v-100*bai)/10; //求十位
xiao=(v-100*bai-10*shi-ge)/0.1; //求小数位
P2=0xf7; //选择数码管1,输入位选信号
P0=table[xiao]; //数码管段选信号,显示小数位数值
delay(15);
P2=0xfb; //选择数码管2,输入位选信号
P0=table[ge]; //数码管段选信号,显示个位数值
dian=1; //小数点点亮
delay(15);
P2=0xfd; //选择数码管3,输入位选信号
P0=table[shi]; //数码管段选信号,显示十位数值
delay(15);
P2=0xfe; //选择数码管4,输入位选信号
P0=table[bai]; //数码管段选信号,显示百位数值
delay(15);
}
/*******************************************************************************
* 函 数 名 : keypros
* 函数功能 : 按键处理函数,判断按键是否按下并
*******************************************************************************/
void keypros()
{
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约1ms
if(k1==0) //再次判断按键是否按下
{
num++;
TL0 = (65536-1000)%256; //设置定时初值
TH0 = (65536-1000)/256; //设置定时初值
if(num==1000) //时间到达1s
{
num=0; //重新从1ms开始计时
sec++; //累计1S
}
}
}
}
/*****发送*********/
void Send ()
{ unsigned char dat ;
dat=v; //速度中间量
SBUF=dat; //发速度
while(TI==0); //串行通信口中断
TI=0; //手动赋初值
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
*******************************************************************************/
void main()
{
Timer0Init(); //定时器0初始化
TMOD=0x20; //定时器1工作于方式2
SCON=0x40; //定时器串口工作方式1允许接收
PCON=0x00; //波特率9600
TH1=0xfa; //根据规定给定时器T1赋值
TL1=0xfa; //根据规定给定时器T1赋值
TR1=1; //启动定时器T1
while(1)
{
keypros(); //按键处理函数
}
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
*******************************************************************************/
void Timer0() interrupt 1
{
TL0 = (65536-10000)%256; //设置定时初值
TH0 = (65536-10000)/256; //设置定时初值
if(k2==0) //检测按键K2是否按下
{
delay(1000); //消除抖动 一般大约1ms
if(k2==0) //再次判断按键是否按下
{
m=1000*sec+num; //求时间单位为ms
v=(5000/m)*3.6; //速度公式求列车速度单位为km/h
while(1)
{
display(); //显示函数
Send ();
}
}
}
while(!k2); //检测按键是否松开
}
接收程序
/************************************************************************************** *
*按下K1按键 开始计时
*按下K2按键 计时结束计算速度
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h> //左右移函数,头文件
#include<absacc.h> //访问绝对地址头文件
sbit k3=P3^5; //抬杆
sbit dian=P0^7; //小数点
unsigned char xiao=0,ge=0,shi=0,bai=0,count=0; //定义数码管显示的个位和十位
unsigned int v=0,t=0,t1=0,t2=0,t3=0,t4=0;//定义ms、s、时间总数和速度
unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段控口
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数
*******************************************************************************/
/******延时函数******/
void delay(unsigned int i)
{
while(i--); // 延时
}
/*****时间显示函数*********/
void display()
{
ge=v%10; //求个位
bai=v/100; //求百位
shi=(v-100*bai)/10; //求十位
xiao=(v-100*bai-10*shi-ge)/0.1; //求小数位
P2=0xf7; //选择数码管1,输入位选信号
P0=table[xiao]; //数码管段选信号,显示小数位数值
delay(15);
P2=0xfb; //选择数码管2,输入位选信号
P0=table[ge]; //数码管段选信号,显示个位数值
dian=1; //小数点点亮
delay(15);
P2=0xfd; //选择数码管3,输入位选信号
P0=table[shi]; //数码管段选信号,显示十位数值
delay(15);
P2=0xfe; //选择数码管4,输入位选信号
P0=table[bai]; //数码管段选信号,显示百位数值
delay(15);
}
/*******************************************************************************
* 函 数 名 : Receive
* 函数功能 : 接收函数
*******************************************************************************/
unsigned char Receive(void)
{
unsigned char dat;
while(RI==0);
RI=0;
dat=SBUF;
return dat;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
*******************************************************************************/
void main()
{
TMOD=0X20; //定时器1工作于方式2
SCON=0X50; //定时器串口工作方式1允许接收
PCON=0x00; //波特率9600
TH1=0XFD; //根据规定给定时器T1赋值
TL1=0XFD; //根据规定给定时器T1赋值
TR1=1; //启动定时器T1
REN=1; //允许接收
v=Receive();
while(1)
{ k3=0; //抬杆落下
display(); //显示函数
}
}
|