一個51單片機9.9 秒計時器proteus仿真設計
開始時,顯示"00",第 1 次按下 BY1 后就開始計時。第 2 次按 BY1 后,計時
停止。 第3次按BY1后,計時歸零。
下面是仿真原理圖:
0.png (31.33 KB, 下載次數: 114)
下載附件
2016-10-10 16:28 上傳
單片機源程序:
- /********************************************************************
- 51黑電子論壇
- *********************************************************************/
- #include<reg52.h> //庫文件
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- /********************************************************************
- 初始定義
- *********************************************************************/
- code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數碼管字跟
- uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位的控制端
- uchar sec; //定義計數值,每過1/10 秒,sec 加一
- uchar keycnt=0;//按下次數值
- uint tcnt; //鍵值判斷
- sbit P3_0=P3^0;
- /********************************************************************
- 延時函數
- *********************************************************************/
- void delay(uchar t)
- {
- uchar i,j;
- for(i=0;i<t;i++)
- {
- for(j=13;j>0;j--);
- { ;
- }
- }
- }
- /********************************************************************
- 顯示函數
- *********************************************************************/
- void Led(int date) //顯示函數
- {
- /*****************數據轉換*****************************/
- uint z,x,c,v;
- z=date/1000; //求千位
- x=date%1000/100; //求百位
- c=date%100/10; //求十位
- v=date%10; //求個位
- P2=0XFF;
- P0=seg7code[z];
- P2=wei[0];
- delay(80);
- P2=0XFF;
- P0=seg7code[x];
- P2=wei[1];
- delay(80);
- P2=0XFF;
- P0=seg7code[c];
- P2=wei[2];
- delay(80);
- P2=0XFF;
- P0=seg7code[v];
- P2=wei[3];
- delay(80);
- P2=0XFF;
- }
- /********************************************************************
- 按鍵掃描函數
- *********************************************************************/
- void KEY() //按鍵掃描程序
- {
- uchar i,j;
- if(P3_0==0)
- {
- delay(20);
- if(P3_0==0)
- {
- keycnt++;
- /********************************************************************
- 按下次數判斷函數
- *********************************************************************/
- switch(keycnt) //按下次數判斷
- {
- case 1: //第一次按下
- TH0=0x06; //對TH0 TL0 賦值
- TL0=0x06;
- TR0=1; //開始定時
- break;
- case 2: //第二次按下
- TR0=0; //定時結束
- break;
- case 3: //第三次按下
- keycnt=0; //重新開始判斷鍵值
- sec=0; //計數重新從零開始
- break;
- }
- while(P3_0==0);
- }
- }
- }
- /********************************************************************
- 定時中斷服務函數
- *********************************************************************/
- void t0(void) interrupt 1 using 0 //定時中斷服務函數
- {
- tcnt++; //每過250ust tcnt 加一
- if(tcnt==400) //計滿400 次(1/10 秒)時
- {
- tcnt=0; //重新再計
- sec++;
- if(sec==100) //定時10 秒,在從零開始計時
- {
- sec=0;
- }
- }
- }
- /********************************************************************
- 主函數
- *********************************************************************/
- void main()
- {
- TMOD=0x02; //定時器工作在方式2
- ET0=1;
- EA=1;
- sec=0;
- while(1)
- {
- KEY();
- Led(sec);
- }
- }
-
- /********************************************************************
- 結束
- *********************************************************************/
復制代碼
0.png (58.79 KB, 下載次數: 117)
下載附件
2016-10-10 16:28 上傳
9.9 秒計時器仿真工程文件及所有完整程序等資料下載地址(壓縮包一共有45個單片機仿真,全部下載后找到第010個項目即可):
http://www.zg4o1577.cn/bbs/dpj-56298-1.html
|