点阵流水灯_第1页
点阵流水灯_第2页
点阵流水灯_第3页
点阵流水灯_第4页
点阵流水灯_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

河南大学物理与电子学院2015级单片机课程设计论文点阵流水灯论 文 作 者:论 文 合作者:所 在 学 院:所 在 专 业:指导教师姓名:论文完成时间: 目录一、单片机系统组成与功能 3 1系统组成 3 2 复位电路 3 3 晶振电路 4 4 二位共阴极数码管 6 二、点阵设计结构框图 7三、程序源代码 8 1心形流水灯源程序 8 2 点阵源程序 29 四、系统原理 32 1 原理图 32(1) 心形流水灯原理图 32 (2) 点阵原理图 32 2 实物引脚说明 35 3点阵资料 35 五、焊接 36一单片机系统的组成与功能1 系统组成单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。下面给出一个51单片机的最小系统电路图。 2 复位电路:一、复位电路的用途:单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。二、51单片机要复位只需要在第9引脚接个高电平持续2US就可以实现。在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。开机的时候为什么会复位:在电路图中,电容的的大小是10uF,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。也就是说在单片机启动的0.1S内,电容两端的电压时在03.5V增加。这个时候10K电阻两端的电压为从51.5V减少(串联电路各处电压之和为总电压)。所以在0.1S内,RST引脚所接收到的电压是5V1.5V。在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。按键按下的时候为什么会复位:在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。3 晶振电路:晶振电路:晶振是晶体振荡器的简称。有两个谐振点:以频率的高低分其中较低的频率是串联谐振;较高的频率是并联谐振。 由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感。所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路。由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大 这个振荡器的频率也不会有很大的变化。晶振有一个重要的参数:那就是负载电容值。选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容。一般的晶振的负载电容为15pF或12.5pF。如果再考虑元件引脚的等效输入电容,则两个22pF的电容构成晶振的振荡电路就是比较好的选择。晶振与单片机的脚XTAL0和脚XTAL1构成的振荡电路中会产生偕波(也就是不希望存在的其他频率的波) ,这个波对电路的影响不大,但会降低电路的时钟振荡器的稳定性。为了电路的稳定性起见,ATMEL公司只是建议在晶振的两引脚处接入两个。10pf-50pf的瓷片电容接地来削减偕波对电路的稳定性的影响 ,所以晶振所配的电容在10pf-50pf之间都可以的,没有什么计算公式。P0口的上拉电阻:P0口作为I/O口输出的时候时输出低电平为0输出高电平为高组态(并非5V,相当于悬空状态)。也就是说P0口不能真正的输出高电平,给所接的负载提供电流,因此必须接上拉电阻(一电阻连接到VCC),由电源通过这个上拉电阻给负载提供电流。由于P0口内部没有上拉电阻,是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。1.一般51单片机P0口作为地址/数据复用时不接上拉电阻。2.作为一般的I/O口时用时,由于内部没有上拉电阻,故要接上上拉电阻!3.当p0口用来驱动PNP管子的时候,就不需要上拉电阻,因为此时的低电平有效;4.当P0口用来驱动NPN管子的时候,就需要上拉电阻的,因为此时只有当P0为1时候,才能够使后级端导通。31脚EA/Vpp接电源:STC89C51/52或其他51系列兼容单片机特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行,当接低电平时,复位后直接从外部ROM的0000H开始执行。4 二位共阴数码管 (外形尺寸15mm*14mm*7.2mm,10只脚)二、点阵设计结构框图按键复位电源列驱动器行驱动器LED显示点阵单片机时钟开始清屏左移动暂 停方向键右移动否静止显示是否三 程序源代码1心形流水灯源程序 #include #include#define uchar unsigned char#define uint unsigned intsbit dig1=P34; sbit dig2=P35; sbit DS_595=P32; sbit SH_CP_595=P36; sbit ST_CP_595=P37; sbit IR_R=P33; uchar code table11=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff; uchar code table11=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00; uchar dig_flag; uchar dis_time_count; uchar dis_dat2; uchar value; /以下为红外接收解码用到的寄存器 uchar IR_receive_time; uchar IR_receive_flag; uchar IR_receive_data33; uchar IR_receive_bit; bit IR_receive_OK; uchar IR_receive_code4; bit IR_receive_end; uchar type_t1,type_t2;uchar count;bit stop_flag; uchar code type8=0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00; uchar code type18=0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00; uchar code type28=0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff; uchar code type38=0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff; uchar code type44=0x7e,0x3c,0x18,0x00; uchar code type54=0x81,0xc3,0xe7,0xff; uchar code type64=0xe7,0xc3,0x81,0x00; uchar code type74=0x18,0x3c,0x7e,0xff; /*延时程序*/void delay(uint t) uint x,y;for(x=t;x0;x-) for(y=120;y0;y-);/*74HC595数据输出程序*/void data_hc595(uchar dis_tmp) uchar j;for(j=0;j8;j+) SH_CP_595=0;DS_595=dis_tmp&0x80; dis_tmp=dis_tmp1;_nop_();_nop_(); ST_CP_595=0;_nop_();_nop_();ST_CP_595=1; /*数码管显示初始化设置程序*/void display(void)dig1=1;dig2=1;EA=1;TMOD=0x21; TH0=0xFC;TL0=0x17;ET0=1;TR0=1; /*红外解码初始化程序*/void init_IR_R(void)IR_receive_time=0;IR_receive_flag=0;IR_receive_bit=0;IR_receive_OK=0;IR_receive_end=0;TMOD=0x21; TH1=0x00;TL1=0x00; ET1=1; IT1=1; EX1=1; EA=1; TR1=1; /*红外接收产生256us定时计数程序*/void time1(void) interrupt 3 IR_receive_time+; /*红外数据解码程序*/void IR_code(void)uchar k,i,j,value;k=1; for(j=0;j4;j+) for(i=0;i1; if(IR_receive_datak6) value=value|0x80; k+;IR_receive_codej=value; IR_receive_end=1; /*红外键值处理程序*/void IR_dat_check(uchar tmp) switch(tmp) case 0x16: value=10; break; case 0x19: value=11; break; case 0x0d: value=12; break; case 0x0c: value=1; break; case 0x18: value=2; break; case 0x5e: value=3; break; case 0x08: value=4; break; case 0x1c: value=5; break; case 0x5a: value=6; break; case 0x42: value=7; break; case 0x52: value=8; break; case 0x4a: value=9; break; case 0x09: value=0; break; case 0x15: value+; if(value12) value=12; break; case 0x07: value-; if(value=255) value=0; break;default: break;/*数值转换显示程序*/void IntToStr(uchar k,uchar *buf) *buf=k/10;buf+;*buf=k%10; /*更新数码管显示与红外指令数据*/void update_dat() if(IR_receive_OK) IR_receive_OK=0;IR_code(); if(IR_receive_end) IR_receive_end=0;IR_dat_check(IR_receive_code2);IntToStr(value,&dis_dat0); stop_flag=1;/*定时器0中断服务程序*/void int0() interrupt 1 /数据管显示程序 TH0=0xFC; TL0=0x17;dis_time_count+;/update_dat(); if(dis_time_count=10) dis_time_count=0; if(dig_flag32&IR_receive_time63) IR_receive_bit=0; IR_receive_dataIR_receive_bit=IR_receive_time; IR_receive_time=0; IR_receive_bit+; if(IR_receive_bit=33) IR_receive_bit=0; IR_receive_OK=1;update_dat(); else IR_receive_flag=1; IR_receive_time=0; /*两边逐个亮*/void zg(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0xff; P2=0xfe;delay(t); for(i=0;i7;i+) P0=type1i; P2=typei+1;delay(t);P2=0x00;P0=0x00;delay(t);for(i=0;i4;i+) P1=type4i; delay(t); delay(t); /*全部闪烁*/void qs(uint t,uchar a) uchar j; for(j=0;ja;j+) P2=P1=P0=0xff; delay(t); P2=P1=P0=0x00;delay(t); /*逆时针逐个点亮 */void zgxh(uint t,uchar a) uchar i,j; for (j=0;ja;j+) P2=P1=P0=0xff; for(i=0;i8;i+) P0=type1i; delay(t); for(i=0;i8;i+) P1=type1i; delay(t); for(i=0;i8;i+) P2=type1i; delay(t); /*逆时针逐个灭*/void nszgm(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0x00; for(i=0;i8;i+) P0=type3i;delay(t); for(i=0;i8;i+) P1=type3i;delay(t); for(i=0;i8;i+) P2=type3i;delay(t); /*顺时针逐个点亮*/void zgxh1(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0xff; for(i=0;i8;i+) P2=typei; delay(t); for(i=0;i8;i+) P1=typei; delay(t); for(i=0;i8;i+) P0=typei; delay(t); /*顺时针逐个灭*/void sszgm(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0x00; for(i=0;i8;i+) P2=type2i;delay(t); for (i=0;i8;i+) P1=type2i; delay(t); for (i=0;i8;i+) P0=type2i; delay(t); /*对角闪*/void djs(uint t,uchar a) uchar j; for(j=0;ja;j+) P2=P1=P0=0xff; P0=0xE1; P1=0xf0;delay(t); P2=P1=P0=0xff; P2=0x87; P1=0x0f;delay(t); /*左右半亮*/void zybl(uint t,uchar a) uchar j;for(j=0;ja;j+) P2=P1=P0=0xff; P0=0x00; P1=0x0f;delay(t); P0=0xff; P2=0x00; P1=0xf0;delay(t);/*两边逐个灭*/void lbzgm(uint t,uchar a) uchar i,j; for (j=0;ja;j+) P2=P1=P0=0x00; delay(t); for(i=0;i4;i+) P1=type7i; delay(t);P0=0x01;delay(t);for(i=0;i7;i+) P0=type2i+1;P2=type3i; delay(t); P2=0xff;delay(t); /*顺时逐个同步亮*/void sztl(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0xff; for(i=0;i8;i+) P2=P1=P0=typei; delay(t); /*顺时逐个同步灭*/void sztm(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0x00; for(i=0;i8;i+) P2=P1=P0=type2i; delay(t); /*逆时逐个同步亮*/void nztl(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0xff; for(i=0;i8;i+) P2=P1=P0=type1i;delay(t); /*逆时逐个同步灭*/void nztm(uint t,uchar a) uchar i,j; for(j=0;ja;j+) P2=P1=P0=0x00; for(i=0;i8;i+) P2=P1=P0=type3i; delay(t); /*横往中间亮*/void hwzjl(uint t,uchar a) uchar i,j,k,m; for(j=0;ja;j+) P2=P1=P0=0xff;k=0;m=0;for(i=0;i8;i+) P2=typei; P0=type1i; k+;if(k=2)k=0;P1=type6m; m+; delay(t); /*横往中间灭*/void hwzjm(uint t,uchar a) uchar i,j,k,m; for(j=0;ja;j+) P2=P1=P0=0x00; k=0;m=0;for(i=0;i8;i+) P2=type2i; P0=type3i; k+;if(k=2) k=0;P1=type7m; m+; delay(t); /*逆时逐段亮*/void nzdl(uint t,uchar a) uchar i,j; for (j=0;ja;j+) P2=P1=P0=0xff; for(i=0;i8;i+) P0=type1i; delay(t); P0=0xff; for(i=0;i8;i+) P1=type1i; delay(t); P1=0xff; for(i=0;i8;i+) P2=type1i; delay(t); P2=0xff; /*逆时逐段一个点亮*/void nzdgl(uint t,uchar a) uchar i,j,k; for(j=0;ja;j+) k=type10; P2=P1=P0=k;delay(t); for(i=0;i8;i+) k=_crol_(k,-1); P2=P1=P0=k;delay(t); /*逆时逐段一个灭*/void nzdgm(uint t,uchar a) uchar i,j,k; for(j=0;ja;j+) k=type30; P2=P1=P0=k;delay(t); for(i=0;i8;i+) k=_crol_(k,-1); P2=P1=P0=k;delay(t); /*间隔闪*/void jgs(uint t,uchar a) uchar j; for (j=0;ja;j+) P2=P1=P0=0xaa; delay(t); P2=P1=P0=0x55; delay(t); /*眨眼睛*/void zyj(uint t,uchar a)uchar j;for(j=0;ja;j+)P2=P1=P0=0x00;delay(t);P2=P1=P0=0xaa;delay(t);P2=P1=P0=0x00;delay(t);P2=P1=P0=0x55;delay(t);/*顺时针全部暗只有一个灯亮在流水*/void ygdl(uint t,uchar a) uchar i,j,k; P2=P1=P0=0xff;for(j=0;ja;j+) k=0xfe; P2=k;delay(t); for(i=0;i7;i+) k=_crol_(k,1); P2=k; delay(t); P2=0xff;k=0x7f;P1=k; for(i=0;i8;i+) k=_crol_(k,1); P1=k; delay(t); P1=0xff;k=0x7f;P0=k; for(i=0;i8;i+) k=_crol_(k,1); P0=k; delay(t); k=P0=0xff; /*逆时针全部暗只有一个灯亮在流水*/void nygdl(uint t,uchar a) uchar i,j,k; P2=P1=P0=0xff;for(j=0;j0;i-) k=_crol_(k,-1); P0=k; delay(t); P0=0xff;k=0xfe;P1=k; for(i=8;i0;i-) k=_crol_(k,-1); P1=k; delay(t); P1=0xff;k=0xfe;P2=k; for(i=8;i0;i-) k=_crol_(k,-1); P2=k; delay(t); k=P2=0xff; /*上下半亮*/void sxbl(uint t,uchar a)uchar j;for(j=0;ja;j+)P2=P1=P0=0xff;delay(t);P2=0xc0;delay(t);P0=P1=P2=0xff;delay(t);P0=0xfc;P2=0x3f;P1=0x00;delay(t);P0=P1=P2=0xff;delay(t);P0=0x00;P2=0x00;P1=0x00;delay(t);P0=P1=P2=0xff;delay(t);P0=P1=P2=0x00;/*/void main(void)IP=0x04; IR_R=1; DS_595=0;SH_CP_595=0;ST_CP_595=0;dig_flag=0; dis_time_count=0x00;stop_flag=0; display(); init_IR_R(); value=0x00;type_t1=70; type_t2=400; IntToStr(value,&dis_dat0); P2=0xff;P1=0xff;P0=0xff;while(1)if(value=1|value=0)zg(70,1);if(stop_flag)stop_flag=0;goto end;lbzgm(70,1); if(stop_flag)stop_flag=0;goto end;zg(200,1); if(stop_flag)stop_flag=0;goto end;lbzgm(200,1); if(value=2|value=0)qs(100,20); if(stop_flag)stop_flag=0;goto end;qs(600,5); if(value=3|value=0) zgxh(70,1); if(stop_flag)stop_flag=0;goto end;nszgm(70,1); if(stop_flag)stop_flag=0;goto end;zgxh1(70,1); if(stop_flag)stop_flag=0;goto end;sszgm(70,1); if(stop_flag)stop_flag=0;goto end;zgxh(200,1); if(stop_flag)stop_flag=0;goto end;nszgm(200,1); if(stop_flag)stop_flag=0;goto end;zgxh1(200,1); if(stop_flag)stop_flag=0;goto end;sszgm(200,1); / if(value=4|value=0)zyj(50,20); if(stop_flag)stop_flag=0;goto end;zyj(120,20); if(value=5|value=0) djs(100,3); if(stop_flag)stop_flag=0;goto end;zybl(100,3); if(stop_flag)stop_flag=0;goto end;djs(600,3); if(stop_flag)stop_flag=0;goto end;zybl(600,3); if(value=6|value=0)/*nzdgm(50,10); nzdgm(200,5); */sxbl(100,2); if(stop_flag)stop_flag=0;goto end;sxbl(300,2); if(value=7|value=0)sztl(type_t1,1); if(stop_flag)stop_flag=0;goto end;sztm(type_t1,1); if(stop_flag)stop_flag=0;goto end;nztl(type_t1,1); if(stop_flag)stop_flag=0;goto end;nztm(type_t1,1); if(stop_flag)stop_flag=0;goto end; sztl(type_t2,1); if(stop_flag)stop_flag=0;goto end;sztm(type_t2,1); if(stop_flag)stop_flag=0;goto end;nztl(type_t2,1);if(stop_flag)stop_flag=0;goto end;nztm(type_t2,1); if(value=8|value=0)hwzjl(100,1); if(stop_flag)stop_flag=0;goto end;lbzgm(100,1); if(stop_flag)stop_flag=0;goto end;hwzjl(300,1); if(stop_flag)stop_flag=0;goto end;lbzgm(300,1); if(value=9|value=0)ygdl(100,1); if(stop_flag)stop_flag=0;goto end;nygdl(100,1); if(stop_flag)stop_flag=0;goto end;ygdl(300,1); if(stop_flag)stop_flag=0;goto end;nygdl(300,1); if(value=10|value=0)nzdl(type_t1,2); if(stop_flag)stop_flag=0;goto end;nzdl(type_t2,2); if(value=11|value=0)nzdgl(50,5); if(stop_flag)stop_flag=0;goto end;nzdgl(200,2); if(value=12|value=0)jgs(100,20); if(stop_flag)stop_flag=0;goto end;jgs(800,4); end:; /*if(value=0)zg(100,1); lbzgm(100,1); jgs(300,4); djs(100,3); zybl(100,3); P2=P1=P0=0xff;for(count=0;count3;count+) P0=0x00; delay(800);P0=0xff;delay(800);P0=0x00;for(count=0;count3;count+) P1=0x00;delay(800);P1=0xff;delay(800);P1=0x00;for(count=0;count3;count+)P2=0x00;delay(800);P2=0xff;delay(800);qs(500,3); /全闪 for(count=0;count6;count+)zgxh(50,1); nszgm(50,1); djs(100,20); for(count=0;count3;count+)zg(100,1);lbzgm(100,1); qs(200,10); djs(100,50);for(count=0;count5;count+)sztl(200,1);nztm(200,1);nztl(200,1); sztm(200,1);djs(300,10);nzdgl(300,10); jgs(300,10); for(count=0;count3;count+)zgxh(100,1);nszgm(100,1); for(count=0;count5;count+)zgxh1(100,1); sszgm(100,1); nzdl(200,3);jgs(50,100);P2=P1=P0=0xff;for(count=0;count8;count+)P0=type1count;delay(200);for(count=0;count8;count+)P2=typecount;delay(200);for(count=0;count3;count+)P0=P2=0x00;delay(200);P0=P2=0xff;delay(200);nzdgl(50,40); for(count=0;count4;count+)zg(100,1);qs(100,10); lbzgm(100,1);for(count=0;count3;count+)zgxh(100,1);nszgm(100,1);djs(1000,10);for(count=0;count10;count+)hwzjl(200,1);hwzjm(200,1);for(count=0;count5;count+)zgxh(100,1);nszgm(100,1);djs(100,20);zg(300,1); lbzgm(300,1); for(count=0;count5;count+)sztl(200,1);nztm(200,1);nztl(200,1);sztm(200,1); djs(500,20);djs(100,30);djs(50,50);delay(1000); */2点阵程序源程序#include#include#define uchar unsigned char#define uint unsigned int#define data1 P0#define data2 P2sbit s1=P36;sbit s2=P37;bit fangxiang;uint alt=0,net=0,sl=288;bit mode;uchar code tab=/ (0) (1) 老(2) 师(3) ,(4) 你(5) 辛(6) 苦(7) 了(8) !0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x

温馨提示

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

评论

0/150

提交评论