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