
单片机控制8×8 LED点阵屏显示数字的设计
班级:
姓名(学号):
组号:单片机控制8×8 LED点阵屏显示数字的设计
一、设计要求:
用单片机的P0口外接74LS245作为控制8×8 LED点阵屏的行驱动,列选通由P1端口控制,程序运行时,8×8 LED点阵屏依次循环显
示数字0~9。刷新时间由定时器T1的定时中断来完成。
二、方案论证:
方案一:最小系统加74LS245驱动芯片和成品8*8点阵进行设计。
优点:外围电路简单易焊,耗时少!
缺点:成本较高。
方案二:最少系统加三极管驱动和手焊8*8点阵进行设计。
优点:成本相对较低。
缺点:点阵难焊,耗时长。
本次课设采用方案一,原因是耗时少,电路相对稳定。
三、理论设计:用CAD软件绘制的硬件原理图及工作原理的分析;软件流程图
及带注释的程序清单。
工作原理:P0口外芯片74LS245来驱动行点亮,P1口外接点阵进行列选通,以扫描方式依次显示0-9.软件流图:开始
↓
定时器1初始化
↓
主循环←←↑←←↑
↓无↑↑
定时中断函数→→有无中断→→↑↑
↓有↑
↓↑
调用显示子函数↑
↓→→→→→→
完整程序:
#include #define uchar unsigned char #define uint unsigned int uint i,a,b=0,t; uchar code dxuan0[]={0x00,0x18,0x24,0x24,0x24,0x24,0x24,0x18,}; //"0" uchar code dxuan1[]={0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x00,}; //"1" uchar code dxuan2[]={0x00,0x3C,0x24,0x0C,0x18,0x30,0x3C,0x00,}; //"2" uchar code dxuan3[]={0x00,0x3C,0x24,0x18,0x0C,0x24,0x38,0x00,}; //"3" uchar code dxuan4[]={0x00,0x08,0x18,0x38,0x28,0x3C,0x08,0x00,}; //"4" uchar code dxuan5[]={0x00,0x3C,0x20,0x3C,0x04,0x24,0x38,0x00,}; //"5" uchar code dxuan6[]={0x00,0x18,0x24,0x20,0x38,0x24,0x24,0x18,}; //"6" uchar code dxuan7[]={0x00,0x3C,0x04,0x08,0x08,0x10,0x10,0x10,}; //"7" uchar code dxuan8[]={0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,}; //"8" uchar code dxuan9[]={0x18,0x24,0x24,0x24,0x1C,0x04,0x24,0x18,}; //"9" uchar code wxuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,};//位选 void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--)for(y=256;y>0;y--); } //***********************显示函数**************************// void display0(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan0[i];delay(1);} } void display1(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan1[i];delay(1);} } void display2(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan2[i];delay(1);} } void display3(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan3[i];delay(1);} } void display4(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan4[i];delay(1);} } void display5(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan5[i];delay(1);} } void display6(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan6[i];delay(1);} } void display7(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan7[i];delay(1);} } void display8(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan8[i];delay(1);} } void display9(){for(a=50;a>0;a--) for(i=0;i<9;i++) {P1=wxuan[i];P0=dxuan9[i];delay(1);} } void main(void) { TMOD=0X10; //设置定时器1为工作方式1 TH1=(65536-50000)/256; TL1=(65536-50000)%256; //定时50000us EA=1; //开总中断 ET1=1; //开定时器1中断 TR1=1; //启动定时器1while(1) { if(t==40) { t=0; switch(b) { case 0: display0();break; case 1: display1();break; case 2: display2();break; case 3: display3();break; case 4: display4();break; case 5: display5();break; case 6: display6();break; case 7: display7();break; case 8: display8();break; case 9: display9();break; } b++;if(b==10)b=0; } } } //*****************定时中断函数****************// void ext1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; t++; } 四、电路仿真及仿真结果分析: 电路仿真结果正确,达到预期设计要求,能循环显示0-9,刷新时间由定时器1设定。 五、测试方案与测试结果: 经自焊硬件测试,结果与仿真效果一致,由于材料,点阵引脚与订座子有时会接触不良,导致某条LED不亮。 六、作品功能和使用说明: 接上5V电源即可循环显示0-9. 七、心得体会: 设计过程中遇到程序设计问题,网上找到视频教程学习中断程序的编写,以及查阅C语言课本得以解决。调试过程中发现点阵不亮,到处检查电路有无短路和断路,无果,一次无意间碰到芯片发现在灯闪了一下,这才意识到芯片与插座接触不良,这是由于材料有限,没有匹配的引脚插座,用其他代替所致,后来做了点手脚,好多了! 本次课设收获:通过焊接动手能力增强,积累了究错经验,通过编程对C语言也学到了不少,更重要的是,更进一步理解了单片机的功能与用法。 八、参考文献 《单片机原理及应用》主编李建忠 《C语言程序设计教程》主编杨路明
