|
這是一個秒表系統設計
功能:可以選擇正計時/倒計時。可以自己通過按鍵設置倒計時的時間,當自己設定的倒計時使蜂鳴器響。
倒計時我已經完成了,但現在當倒計時時間到后使用蜂鳴器響我不知道如何添。蜂鳴IO口為P1^0,使用的是有緣蜂鳴器。我的程序是有問題嗎,beep函數用的正確嗎,一直仿真不成功,蜂鳴器就是不響,求指導
- #include<reg52.h> // 包含 52 單片機寄存器定義的頭文件
- unsigned char Tab1[ ]={0x3f,0x06,0x5b,0x4f ,0x66,0x6d,0x7d,0x07,0x7f ,0x6f }; // 段碼表
- unsigned char Tab2[ ]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 個位段碼表
- unsigned int x;
- unsigned char k;
- sbit int0=P3^2; //開始/暫停//
- sbit int1=P3^3;
- sbit SUB60=P1^1; //正計時/倒計時//
- sbit S60=P1^2; //控制60s//
- sbit K5=P1^3;//加1s//
- sbit K6=P1^4;//減1s//
- sbit K7=P1^5; //賦值60s//
- sbit K8=P1^6; //清零//
- sbit baojing=P1^0;// 蜂鳴器//
- /*************************** 延時 1ms 基準 ******************************************/
- void delay1ms(unsigned int i)
- {
- unsigned char j;
- while(i--)
- {
- for(j=0;j<125;j++) //1ms 基準延時程序 12MHZ 晶振
- {
- }
- }
- }
- /********************************************************************************
- ****************** 數碼管顯示程序 ***********************************************/
- void Display(unsigned int x)
- {
- P2=0xfe; //P2.0 引腳輸出低電平, DS6 點亮
- P0=Tab1[x/1000]; // 顯示百位
- delay1ms(6);
- P2=0xfd; //P2.1 引腳輸出低電平, DS6 點亮
- P0=Tab1[x%1000/100]; // 顯示十位
- delay1ms(6);
- P2=0xfb; //P2.2 引腳輸出低電平, DS6 點亮
- P0=Tab2[x%100/10]; // 顯示個位
- delay1ms(6);
- P2=0xf7; //P2.3 引腳輸出低電平, DS7 點亮
- P0=Tab1[x%10]; // 顯示 0.1 位
- delay1ms(6);
- P2=0xff;
- }
- bit BeepEn=0;
- void Beep()
- {
- static unsigned char delay25ms=0;
- static unsigned char BeepLong=0;
- if(BeepEn)
- {
- if(delay25ms++>=20)
- {
- delay25ms=0;
- baojing=!baojing;
- if(BeepLong++>=20)
- {
- BeepEn=0;
- }
- }
- }
- else{
- baojing=1;
- BeepLong=0;
- delay25ms=0;
- }
- }
- /*******************************************
- 函數功能:主函數
- ******************************************/
- void main(void)
- {
- x=0;
- TMOD=0x01; // TMOD=0000 0001B, 使用計數器 T0 的工作方式 1
- EA=1; // 開起總中斷
- ET0=1; // 允許定時器 T0 的中斷
- EX0=1; // 允許外中斷 INT0
- IT0=1; //INT0 為下負脈沖觸發方式
- TH0=(65536-50000)/256; // 計數器 T0 高 8 位賦初值
- TL0=(65536-50000)%256; // 計數器 T0 低 8 位賦初值
- TF0=0; // 溢出標志位清零
- while(1)
- {
- Beep();
- /************************************************************
- ****************K5 P1.3 按一次加 1 開關 S1***************************/
- if(K5==0)
- {
- delay1ms(20);
- if(K5==0)
- {
- x=x+10;
- }
- while(!K5); // 摁鍵關斷 摁一次觸發一次
- }
- /***********************************************************
- ************K6 P1.4 按一次減 1 開關 S2**************************/
- if(K6==0)
- {
- delay1ms(20);
- if(K6==0)
- {
- if(x==0)
- {
- x=10; // 在 00.0 的時候停止
- }
- x=x-10;
- }
- while(!K6); // 摁鍵關斷 摁一次觸發一次
- }
- /*********************************************************************
- ******************K7 P1.5 初始值 賦值為 60.0 秒開關 S5********************/
- if(K7==0)
- {
- delay1ms(20);
- if(K7==0)
- {
- x=600; // 賦初值 60.0 秒
- }
- while(!K7); // 摁鍵關斷 摁一次觸發一次
- }
- /*********************************************************************
- ******************S60 控制 60S 停止開關 P1.2****************************/
- if(x==600)
- {
- if(S60==0) // 如果 P1.2 口是低電平,秒表變化范圍 00.0~60.0
- {
- TR0=0;
- }
- }
- /********************************************************************
- ******************K8 P1.6 清零 clear0 摁鍵開關 S3************************/
- if(K8==0)
- {
- delay1ms(20); // 延時消震
- if(K8==0)
- {
- x=0; // 數據清 0 數碼管顯示 000.0
- TR0=0; // 溢出標志位清 0
- }
- }
- /************ 數碼管顯示 ***************************************/
- Display(x);
- }
- }
- /**********INT0 中斷函數 用于開始或暫停開關 S4******************
- **************************************************************/
- void begin_stop() interrupt 0
- {
- if(int0==0)
- {
- delay1ms(30); // 延時消震
- if(int0==0)
- {
- TR0=~TR0; // 按鍵摁一次 讀秒開始或暫停
- if(x==0&&SUB60==0)
- {
- TR0=0;
- }
- }
- }
- }
- /*********************************************************
- ******T0 計數器中斷 控制每隔加 0.1 秒 ***********************/
- void add_one0() interrupt 1
- {
- k++;
- if(k==2)
- {
- k=0;
- TF0=0;
- if(SUB60==1) // 當 P1.1 口是高電平時秒表加 0.1s
- // 當 P1.1 口是低電平時秒表減 0.1s
- {
- x=x+1; // 秒表加 0.1s
- }
- else
- {
- x=x-1; // 秒表減 0.1s
- }
- if(x==0)
- {
- TR0=0;
- }
- if(x==9999)
- {
- TR0=0;
- }
- }
- TH0=(65536-50000)/256; // 計數器 T0 高 8 位賦初值
- TL0=(65536-50000)%256; // 計數器 T0 低 8 位賦初值
- }
復制代碼 |
-
-
秒表倒計時蜂鳴器.zip
2022-12-1 20:17 上傳
點擊文件名下載附件
224.12 KB, 下載次數: 6
仿真proteus8,13
|