单片机源程序如下:
- /************************************************************************************** *
- *按下K1按键 开始计时
- *按下K2按键 计时结束计算速度
- ***************************************************************************************/
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include<intrins.h> //左右移函数,头文件
- #include<absacc.h> //访问绝对地址头文件
- sbit k1=P1^0; //按键1开始计时
- sbit k2=P1^1; //按键2终止计时开始计算速度
- unsigned char ge=0,shi=0; //定义数码管显示的个位和十位
- unsigned int num=0,sec=0,m=0,v=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 Delay10s()
- { // 闪烁延时
- int i,j,z;
- for (i=1000;i>0;i--)
- for (j=1000;j>0;j--)
- for (z=10;z>0;z--);
- }
- /*******************************************************************************
- * 函 数 名 : 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; //求个位
- shi=v/10; //求十位
- P2=0xfe; //选择数码管1,输入位选信号
- P0=table[ge]; //数码管段选信号,显示个位数值
- Delay10s();
- P2=0xfd; //选择数码管2,输入位选信号
- P0=table[shi]; //数码管段选信号,显示十位数值
- Delay10s();
- }
- /*******************************************************************************
- * 函 数 名 : tt
- * 函数功能 : 速度显示函数
- *******************************************************************************/
- /******时钟显示函数******/
- void tt() // 定时开关函数
- { // 定时100ms
- int a,b;
- for (a=1000;a>0;a--)
- for (b=100;b>0;b--)
- k2=0;
- }
- /*******************************************************************************
- * 函 数 名 : keypros1
- * 函数功能 : 按键处理函数,判断按键是否按下并
- *******************************************************************************/
- 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
- }
- }
- while(!k1); //检测按键是否松开
- }
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- *******************************************************************************/
- void main()
- {
- Timer0Init(); //定时器0初始化
- while(1)
- {
- keypros(); //按键处理函数
- tt();
- if(k2==0) //检测按键K2是否按下
- {
- delay(1000); //消除抖动 一般大约1ms
- if(k2==0) //再次判断按键是否按下
- {
- m=1000*sec+num; //求时间单位为ms
- v=5000/m; //速度公式求列车速度单位为m/s
- }
- }
- display();
- }
- }
- /*******************************************************************************
- * 函 数 名 : void Timer0() interrupt 1
- * 函数功能 : 定时器0中断函数
- *******************************************************************************/
- void Timer0() interrupt 1
- {
- TL0 = (65536-10000)%256; //设置定时初值
- TH0 = (65536-10000)/256; //设置定时初值
- keypros();
- }
复制代码 |