如何改正請指點
發送程序
/************************************************************************************** *
*按下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(); //顯示函數
}
}
|