設計一款能夠任意啟停的秒表,5位LED數碼顯示,計時單位為1/100秒。 基本任務: 1、設計出如圖1所示的單片機電路。計時范圍為000.00~999.99S。 按鍵標號說明:
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
圖片1.png (2.98 MB, 下載次數: 47)
下載附件
圖1
2020-12-26 19:35 上傳
圖1、單片機總電路 當剛上電時,數碼管和LCD的顯示值都為零。按下START鍵開始計時,按下STOP暫停計時,利用單片機的復位電路對示值清零,即按下RST鍵實現復位清零。 進階任務: 1.設置重新啟動功能。 重啟功能即重新開始計時功能,可以用RESRTART按鍵實現。其中RESTART鍵和START鍵均可以使單片機進入外部中斷0,兩者之間通過二極管隔離,START按鍵按下時不會拉低RESRTART所連的P3.4端口的值。按下RESRTART鍵時不但可以拉低P3.4端口的值,同時可以進入外部中斷零。 2.設置計時功能。可以同時計時三個時間,停止后可通過按鍵選擇顯示。 與進階任務1中類似,使用相同的硬件電路。普通計時模式與次模式可以使用MOD-CHOOSE鍵進行切換,當這個鍵彈起時,為普通計時模式,按下時為同時計時三個時間。 當處于計時三個時間的模式時,STOP鍵需按下三次才會暫停,每一次按下時的時間都會存儲起來,暫停以后可以通過NEXT鍵使時間從高到低循環顯示。 3. 同時選用LCD液晶屏顯示。 如圖1 所示。
單片機源程序如下:
- #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];//存儲個位到萬位
- uint k; //每10ms加一
- uchar ktime=1;//停止按鍵按下次數
- uint table3[5];//存儲多次計時的時間
- uchar ch2=0x01;
- uchar ch1=0;
- uchar q;
- uint flag=3;
- float klcd;
- void delay(uchar z) //延時
- {
- 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;
- }
- /*------------------------------------------------
- 判忙函數
- ------------------------------------------------*/
- bit lcd_busy(void)
- {
- P0= 0xFF;
- rs=0;
- rw=1;
- en=0;
- _nop_();
- en=1;
- return (bit)(P0 & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- //while(lcd_busy()); //忙則等待
- delay(2);
- rs=0;
- rw=0;
- en=1;
- P0= com;
- _nop_();
- en=0;
- }
- /*------------------------------------------------
- 寫入數據函數
- ------------------------------------------------*/
- 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); /*顯示模式設置*/
- delay(2);
- LCD_Write_Com(0x38);
- delay(2);
- LCD_Write_Com(0x38);
- delay(2);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標移動設置*/
- delay(2);
- LCD_Write_Com(0x0C); /*顯示開及光標設置*/
- }
- 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;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電子秒表.7z
(99.5 KB, 下載次數: 92)
2020-12-26 19:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|