設(shè)計(jì)一款能夠任意啟停的秒表,5位LED數(shù)碼顯示,計(jì)時(shí)單位為1/100秒。 基本任務(wù): 1、設(shè)計(jì)出如圖1所示的單片機(jī)電路。計(jì)時(shí)范圍為000.00~999.99S。 按鍵標(biāo)號(hào)說(shuō)明:
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
圖片1.png (2.98 MB, 下載次數(shù): 47)
下載附件
圖1
2020-12-26 19:35 上傳
圖1、單片機(jī)總電路 當(dāng)剛上電時(shí),數(shù)碼管和LCD的顯示值都為零。按下START鍵開(kāi)始計(jì)時(shí),按下STOP暫停計(jì)時(shí),利用單片機(jī)的復(fù)位電路對(duì)示值清零,即按下RST鍵實(shí)現(xiàn)復(fù)位清零。 進(jìn)階任務(wù): 1.設(shè)置重新啟動(dòng)功能。 重啟功能即重新開(kāi)始計(jì)時(shí)功能,可以用RESRTART按鍵實(shí)現(xiàn)。其中RESTART鍵和START鍵均可以使單片機(jī)進(jìn)入外部中斷0,兩者之間通過(guò)二極管隔離,START按鍵按下時(shí)不會(huì)拉低RESRTART所連的P3.4端口的值。按下RESRTART鍵時(shí)不但可以拉低P3.4端口的值,同時(shí)可以進(jìn)入外部中斷零。 2.設(shè)置計(jì)時(shí)功能?梢酝瑫r(shí)計(jì)時(shí)三個(gè)時(shí)間,停止后可通過(guò)按鍵選擇顯示。 與進(jìn)階任務(wù)1中類(lèi)似,使用相同的硬件電路。普通計(jì)時(shí)模式與次模式可以使用MOD-CHOOSE鍵進(jìn)行切換,當(dāng)這個(gè)鍵彈起時(shí),為普通計(jì)時(shí)模式,按下時(shí)為同時(shí)計(jì)時(shí)三個(gè)時(shí)間。 當(dāng)處于計(jì)時(shí)三個(gè)時(shí)間的模式時(shí),STOP鍵需按下三次才會(huì)暫停,每一次按下時(shí)的時(shí)間都會(huì)存儲(chǔ)起來(lái),暫停以后可以通過(guò)NEXT鍵使時(shí)間從高到低循環(huán)顯示。 3. 同時(shí)選用LCD液晶屏顯示。 如圖1 所示。
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <stdio.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit start=P3^2;
- sbit stop =P3^3;
- sbit clear=P3^4;
- sbit swch =P3^5;
- sbit next =P3^7;
- //sbit e1=P2^0;sbit e2=P2^1;sbit e3=P2^2;sbit e4=P2^3;sbit e5=P2^4;
- sbit rs=P3^0;
- sbit rw=P3^1;
- sbit en=P3^6;
- sbit dp=P1^7;
- char displaytemp[16];
- uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar table2[5];//存儲(chǔ)個(gè)位到萬(wàn)位
- uint k; //每10ms加一
- uchar ktime=1;//停止按鍵按下次數(shù)
- uint table3[5];//存儲(chǔ)多次計(jì)時(shí)的時(shí)間
- uchar ch2=0x01;
- uchar ch1=0;
- uchar q;
- uint flag=3;
- float klcd;
- void delay(uchar z) //延時(shí)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void led_disp(uchar ch0) //led顯示
- {
- P2=~ch2;
- P1=table[table2[ch0]];
- if(ch2==0x04)
- dp=1;
- else
- dp=0;
- ch2=ch2<<1;
- if(ch2==0x20)
- ch2=0x01;
- }
- /*------------------------------------------------
- 判忙函數(shù)
- ------------------------------------------------*/
- bit lcd_busy(void)
- {
- P0= 0xFF;
- rs=0;
- rw=1;
- en=0;
- _nop_();
- en=1;
- return (bit)(P0 & 0x80);
- }
- /*------------------------------------------------
- 寫(xiě)入命令函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- //while(lcd_busy()); //忙則等待
- delay(2);
- rs=0;
- rw=0;
- en=1;
- P0= com;
- _nop_();
- en=0;
- }
- /*------------------------------------------------
- 寫(xiě)入數(shù)據(jù)函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- //while(lcd_busy()); //忙則等待
- delay(2);
- rs=1;
- rw=0;
- en=1;
- P0= Data;
- _nop_();
- en=0;
- }
- void lcd_clear(void) //清屏
- {
- LCD_Write_Com(0x01);
- delay(3);
- }
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y==0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s++;
- }
- }
- void lcd_init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設(shè)置*/
- delay(2);
- LCD_Write_Com(0x38);
- delay(2);
- LCD_Write_Com(0x38);
- delay(2);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關(guān)閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標(biāo)移動(dòng)設(shè)置*/
- delay(2);
- LCD_Write_Com(0x0C); /*顯示開(kāi)及光標(biāo)設(shè)置*/
- }
- void main(void)
- {
- uchar m=0;
- k=0;
- lcd_init();
- TMOD=0x11;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=(65536-8000)/256;
- TL1=(65536-8000)%256;
- EA=1;
- IT0=1;EX0=1;
- IT1=1;EX1=1;
- TR0=0;ET0=1;
- TR1=1;ET1=1;
- while(1)
- {
- klcd=(float)k/100;
- sprintf(displaytemp,"% 3.2f",klcd);
- LCD_Write_String(1,0,displaytemp);
- if(table2[0]==table2[1]==table2[2]==table2[3]==table2[4]==9)
- {
- EA=0;
- for(q=0;q++;q<5)
- table2[q]=0;
- EA=1;
- }
- }
- }
- void int0(void) interrupt 0
- {
- if(clear==0)
- {
- TR0=0;
- k=0;
- delay(2);
- TR0=1;
- }
- else if(clear&next)
- TR0=1;
- else
- // if(table3[3]!=0)
- {
- k=table3[flag];
- flag--;
- if(flag==0)
- flag=3;
- }
- }
- void int1(void) interrupt 2
- {
- if((swch==1))
- TR0=0;
- else
- {
- TR0=0;
- table3[ktime]=k;
- delay(1);
- TR0=1;
- ktime++;
- if(ktime==4)
- {
- ktime=1;
- TR0=0;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
電子秒表.7z
(99.5 KB, 下載次數(shù): 92)
2020-12-26 19:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|