资源描述
实验二 定时器和实时时钟实验一、实验目的a)数码管动态显示技术b)定时器的应用c)按键功能定义二、实验实现的功能a)开机12个二极管同色灯依次点亮,通过按键选择定时器功能或者实时时钟 功能b)当选择实时时钟功能时,用12个LED显示小时,用数码管显示分和秒,时 间都由按键设定,同时具备复位功能c)当选择定时器功能时,12个LED闪烁,然后通过按键设定分和秒的时间,启 动定时器,当定时时间到,12个LED闪烁,同时具备复位功能。三、系统硬件设计1919CHYBTAL-=TEXTz1326 7T 云R_TnuTef8C TEXTSC3293D31XTAL1POIYADQPD.VAD1POADZXTAL2P0AD3P0.4/AD*PDSfADSP0J&AD6RJ8TPQP2.VASP2A10PSEHPZ3A11ALEP2.WA12SP2 夕A13PZj&AUP2.7M15P1OTZpmaxDp i irrz家P3 1HXDP3IB1UpuP33TITTP3.WT0P1SP3STT1PipiAfrinrphP3.7/IFU1m.TES:ST10 TTLEO-YELLOVU4T8SODR19CT TEXTS-LED-YEL10WED11D10OREEMTEKTsR13R16R17 v=cTEXTR10 CD e TEXT*R9D9IET6l四、系统软件设计#include #define uchar unsigned char#define uint unsigned int #define N 10/0-F的共阴极字段码表ucharcodevalue=0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0 X5E,0X79,0X71;小时显示uchartab=( 0x00,0x00,0xfe,0x3f,0xfc,0x3f,0xf8,0x3f,0xf0,0x3f,0xe0,0x3f,0xc0,0x3f,0x80,0x3f,0x00,0x3f,0x00,0x38,0x00,0x30,0x00,0x20);待显示的4位缓冲uchar Num_Buffer=( 0,0,0,0;char sec=0,min=0,hour=0,time=0,count=0;void delay(uint x) 延时函数uchar i;while(x)for(i=0;i 120;i+);void display() 显示函数N um_Buffer 3 =min/10;Num_Buffer| 2=min% 10;Num_Bufferl =sec/10;Num_BufferO=sec% 10;P0=0XFE;P1 =codevalueNum_Buffer3; delay(N);P0=0XFD;P1 =code value Num_B offer 2; delay(N);P0=0XFB;Pl=codevalueNum_Bufferl |; delay(N);P0=0XF7;P1 =codevalueNum_Buffer0; delay(N);uchar scan_key()/按键扫描函数(uchar a=0x40,i,ptr=0,m; for(i=0;iv2;i+)P3=a; delay(N);m=PO;switch(m&OxeO)case OxcO: ptr=i*3+1; return ptr;break;case OxaO: ptr=i*3+2;return ptr;break;case 0x60: ptr=i*3+3;return ptr; break; default:break;a=al; void shan()(P2=0XB6;P3=0X37; delay(8N);P2=0X6D;P3=0X2F; delay(8N);P2=0XDB;P3=OX1B;delay(8N); main()P1MO=OXFF;Pl Ml =0X00;TMOD=OX11;TH0=-50000/256;TL0=-50000%256;TH 1 =-50000/256;TLl=-50000%256;EA=1;ETO=1;ET1 = 1;while(l)P1MO=OXFF;Pl Ml =0X00;TMOD=OX11;TH0=-50000/256;TL0=-50000%256;TH 1 =-50000/256;TLl=-50000%256;EA=1;ETO=1;ET1 = 1;while(l)( uchar i,k;选择定时器0,1,工作方式1定时器0赋初值定时器1赋初值开总中断定时器。允许中断定时器1允许中断P0=0XFF;shan();k=scan_key();if(k=l) 按键1按下,实现时钟功能while(l) P2=tab2*hour; 小时用 LED 显示 P3=tab2*hour+1;displayO;k=scan_key();if(k=l) 按下1键设定小时( delay(40N);hour+;if(hour=12)hour=0;P2=tab0;P3=tabl;)else if(k=2) 按下2键设定分(delay (20N);min+;if(min=60) min=0;else if(k=3) 按下3键设定秒delay (20N);sec+;if(sec=60) sec=0;)else if(k=4)按下4键启动(TRO=1;else if(k=5)/按下5键复位TR0=0; hour=0; min=0;sec=O;else if(k=6) 按下6键返回break;else if(k=2)/按键2按下,实现定时器功能(while(l)displayO;if(min=0&sec=0)TR1=O;P2=0;P3=0X83;for(i=0;iv20;i+)( displayO;P2=0XFF;P3=0XBF;for(i=0;i20;i+)(display();)k=scan_key();if(k=2) /按下2键设定分delay (20N);min+;if(min=60) min=0;)else if(k=3) 按下3键设定秒(delay(20N); sec+;if(sec=60)sec=0;else if(k=4)/按下4键启动TR1=1;else if(k=5)/按下5键复位 TR1=O;min=O; sec=O;else if(k=6) 按下 6 键返Il break;) void timerO(void) interrupt 1 定时器 0 中断(TH0=-50000/256;TL0=-50000%256;count+;if(count=20)(count=0;sec+;if(sec=60)(sec=0;min+;if(min=60)(min=0;hour+;if(hour=12)hour=0;)void timer 1 (void) interrupt 3 定时器 1 中断(TH 1 =-50000/256;TLl=-50000%256;count+;if(count=20)(count=0;sec;if(secO&min !=0)sec=59;min;)五、实验过程中遇到的问题及解决方法问题1:有一段中断程序如下void timer 1 (void) interrupt 3定时器 1 中断(TH 1 =-50000/256;TLl=-50000%256;count+;if(count=20)(count=0;sec;if(sec0&min !=0)(sec=59;min;)当秒减到。后,会出现乱码。解决:经反复检查,发现由于在定义秒的时候定义的类型为uchar,当执行if(sec0&min!=0) 时sec超出了范围,所以出现了乱码,将sec定义类型改为char后运行正常 问题2:当从一个功能返回时数码管最后一位显示0,例如:当执行定时器功能的时候,按 下5键停止,然后按下6键返回后,数码管最后一位显示0.解决:在程序最开始进入while (1)的时候添加P0=0XFF;使数码管不显示。指导老师签字:日期:
展开阅读全文