單片機源程序如下:
- /************************************************************************************** *
- *按下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();
- }
復制代碼 |