设计一款能够任意启停的秒表,5位LED数码显示,计时单位为1/100秒。 基本任务: 1、设计出如图1所示的单片机电路。计时范围为000.00~999.99S。 按键标号说明:
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
图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)
|