电子装配工艺_第1页
电子装配工艺_第2页
电子装配工艺_第3页
电子装配工艺_第4页
电子装配工艺_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子装配工艺专业:应用电子技术 班级:1547 姓名:李苗 学号:1230302154715秒表的设计与工程实现一 单片机系统设计方案描述 系统设计基本指标: 1.实现最大时间长度超过5分钟的正常倒计时 2.可以在5分钟范围内自由方面设置秒表的开始时间 3.进入最后一分钟时,三声蜂鸣器响提示 4.秒表计时到,五声蜂鸣器响,同时小灯亮提示 电子工程训练是一个综合性实验。秒表系统设计总体上分为硬件设计和软件设计两个部分,并要充分考虑它们的匹配设计。硬件设计特别是引脚的配置要充分考虑软件实现的需要,反过来,软件设计也要建立在硬件的

2、基础上,并且充分利用硬件提供的资源。 硬件电路大体上可分为最小系统板电路、数码管显示电路和按键电路。最小系统板电路和数码管显示电路在老师指导下很快得以完成。按键电路为充分考虑以后软件设计的灵活性和可扩展形,采用了排线将引脚引出。 软件设计上,为方便秒表的操作使用,设置了“修改”、“增加”、“移位”和“开始/暂停”四个按键功能。“修改”键按下,进入修改状态,相应的修改位闪烁,提示按“增加”键修改该位时间参数,操作“移位“按键可以移动修改位。“开始暂停”则用于秒表的开始运行和暂停运行。 按键处理通常有查询和中断两种方式处理,查询占用较多的单片机运行资源,而且延迟防抖效

3、果较差,容易多次触发,而中断方式消抖则操作更为灵敏。同时考虑到AT89S52只有两个外部中断,将使用较多的“增加”和“开始/暂停”两个按键处理分配给两个外部中断。另外两个按键则采用查询方式检测处理。 软件设计整体上利用了“有限状态机”的思想,按键控制状态的转换,并在相应的状态下执行相应的操作。一共设置了3个状态:state=0(暂停状态),state=1(开始运行状态),state=2(修改状态),它们的相互转化如下:由于本人之前接触过一些仿真软件Proteus的知识,而本系统设计所需要的单片机、按键、数码管、蜂鸣器等硬件均可在Proteus得到仿真。在程序的编写调试过程中,可以完全

4、脱离硬件,高效率的完成了程序的编写调试。 2  硬件原理图(电路原理图、硬件仿真图)     Proteus仿真图 三系统流程图: 1.主程序流程图2.  修改状态数据操作和数码管显示 3.  开始状态的数码管显示 4暂停状态的数码管显示较为简单,根据保留的时间参数,刷新数码管,保持刚才的时间显示。 5中断INT0修改时间的流程图6中断INT1开始与暂停状态的切换,程序较为简单,按键触发时,在state为1(开始状态)和state为0(暂停状态)来回切换&

5、#160;4、 程序  四、程序  #include<reg51.h> #define ulong unsigned long char tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90; char tab_dp=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x58,0x00,0x10; #define LED P0   

6、  /P0为数码管的段选 #define WS P1  /P1为数码管的位选 sbit time_shift=P30;   /P30为"移位"按键 sbit time_set=P31;  /P31为"修改"按键 sbit set_inc=P32;   /P32为"增加"按键 sbit time_run=P33

7、;  /P33为"计时开始暂停"按键 sbit LIGHT=P20; sbit SPEAKER=P27; unsigned char sec,min,sec_ge,sec_shi,min_ge,min_shi,t; /定义秒,分,时,秒的个位,十位,分的个位,十位 int state;    /秒表状态指示 0-计时暂停  1-正在倒计时  2-计时时间参数修改

8、60;int flag;  /秒表修改数据指示 0-分钟十位 1-分钟个位 2-秒钟十位  3-秒钟个位 int  blink; /- void init(); void display_run(); void display_pause(); void delay(int); void time_modify();    /- 

9、;void main()   init();   state=0;  flag=0;  blink=1;  t=0;   LIGHT=1;  SPEAKER=1;   min=5;  sec=0;  sec_ge=0;    /秒的个位和十位  sec_shi=0;  

10、min_ge=5;    /分的个位和十位  min_shi=0;                    while(1)      if(time_set=0)    /如果"调时"按键按下  &#

11、160;    delay(5);      /延时去抖      if(time_set=0)      state=2;          if(state=0)         TR0

12、=0;     TR1=0;      display_pause();       if(state=1)           TR0=1;      TR1=0;      displa

13、y_run();       if(state=2)        TR1=1;   time_modify();           /- void init()    TMOD=0x11;  EA=1;  

14、                     /开总中断  ET0=0;  ET1=0;        /定义定时器0工定时器1作与方式1  TH0=0x4d;     /定时器0赋初值 

15、60;TL0=oxfc;   TH1=15536/256;     /定时器1赋初值  TL1=15536%256;   /中断初始化   EX0=1;   PX0=0;     IT0=1;   EX1=1;  PX1=1;   IT1=1;   

16、  /外中断1 void INT_1() interrupt 2 using 0    if( time_run=0)/表示按钮有按下    delay(20); /延时    if(time_run=0)        state=(state+1)%2;   LIG

17、HT=1;      SPEAKER=1;           /外中断0 void INT_0()  interrupt 0 using 1    if( set_inc=0)/表示按钮有按下    delay(20);  /延时去抖 &

18、#160;    if(set_inc=0)                  switch(flag)  /分支结构,根据flag的值来判断哪一位加1             case 0:  &#

19、160;                    min=(min+10)%60;          break;               

20、0;    case 1:                       min=(min+1)%10+min/10*10;          break;     

21、60;            case 2:                        sec=(sec+10)%60;      break;  

22、;                case 3:                       sec=(sec+1)%10+sec/10*10;    

23、0;     break;            default:break;                         /-延时子函数- void de

24、lay(int x)      int i,j; for(i=x;i>0l;i-)      for(j=255;j>0;j-)       /-显示子函数- void display_run()   if(TF0=1)    /如果定时器溢出   

25、;  TF0=0;    /清中断标志位   t+;   if(t=20)         t=0; if(min=0&&sec=0)             min=60;     

26、    if(sec=0)           sec=59;      min-;         else sec-;            if(min=0&

27、;&sec>56)       SPEAKER=0;    delay(20);    SPEAKER=1;         if(min=0&&sec=0)       LIGHT=0;delay(20);    SP

28、EAKER=1; delay(240);          SPEAKER=0;    delay(20);    SPEAKER=1; delay(240);          SPEAKER=0;    delay(20);  

29、0; SPEAKER=1; delay(240);          SPEAKER=0;    delay(20);    SPEAKER=1;  state=4;     min=5;/回归初始化          sec=0

30、;          sec_ge=0;    /秒的个位和十位          sec_shi=0;          min_ge=5;    /分的个位和十位    

31、60; min_shi=0;           sec_ge=sec%10;    /秒的个位和十位  sec_shi=sec/10;  min_ge=min%10;    /分的个位和十位  min_shi=min/10;  WS=0xfe;    /循环扫描 &#

32、160;LED=tabsec_ge;  delay(1);  WS=0xfd;  LED=tabsec_shi;  delay(1);  WS=0xfb;  LED=tab_dpmin_ge;  delay(1);  WS=0xf7;  LED=tabmin_shi;  delay(1);    void display_pause() 

33、  WS=0xfe;    /循环扫描  LED=tabsec_ge;  delay(1); WS=0xfd;  LED=tabsec_shi;  delay(1);  WS=0xfb;  LED=tab_dpmin_ge;  delay(1);  WS=0xf7;  LED=tabmin_shi;  delay(1);

34、0;  void time_modify()     /修改位的闪烁状态     if(TF1=1)           TF1=0;  blink=(blink+1)%2;          /修改具体哪个数码管指示  

35、;    if(time_shift=0)                   delay(60);           if(time_shift=0)        flag=

36、(flag+1)%4;              / 修改状态下的数码管显示     switch(flag)  /分支结构,根据flag的值来决定扫描状态             case 0:   

37、0;                     sec_ge=sec%10;    /秒的个位和十位            sec_shi=sec/10;      

38、60;     min_ge=min%10;    /分的个位和十位            min_shi=min/10;            WS=0xfe;    /循环扫描    &

39、#160;   LED=tabsec_ge;            delay(1);            WS=0xfd;            LED=tabsec_shi;  

40、60;         delay(1);            WS=0xfb;            LED=tab_dpmin_ge;           

41、; delay(1);        if(blink=1)                      WS=0xf7;              L

42、ED=tabmin_shi;              delay(1);               break;                &

43、#160;     case 1:                        sec_ge=sec%10;    /秒的个位和十位          

44、60;sec_shi=sec/10;           min_ge=min%10;    /分的个位和十位           min_shi=min/10;           WS=0xfe;  

45、60; /循环扫描           LED=tabsec_ge;           delay(1);           WS=0xfd;         

46、60; LED=tabsec_shi;           delay(1);            if(blink=1)           WS=0xfb;       &#

47、160;    LED=tab_dpmin_ge;            delay(1);                 WS=0xf7;          

48、0;   LED=tabmin_shi;           delay(1);     break;                  case 2:     

49、0;                  sec_ge=sec%10;    /秒的个位和十位           sec_shi=sec/10;          

50、60;min_ge=min%10;    /分的个位和十位           min_shi=min/10;           WS=0xfe;    /循环扫描           L

51、ED=tabsec_ge;           delay(1);     if(blink=1)                WS=0xfd;           L

52、ED=tabsec_shi;           delay(1);                WS=0xfb;           LED=tab_dpmin_ge;    

53、       delay(1);           WS=0xf7;           LED=tabmin_shi;           delay(1);   &

54、#160;           break;                  case 3:                        sec_ge=sec%10;    /秒的个位和十位          sec_shi=sec/10;           min_ge=min%

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论