51单片机LED流星灯C程序
#include <AT89x52.H> //#include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code hanzi[]; uchar code timer[11][16]; uchar code sw[]; void Show_word(); void Show_pass(); void Send_data(unsigned char *d); sbit resget=P0^7; sbit key_moda=P0^6; sbit key_up=P0^5; sbit key_Down=P0^4; sbit T_CLK=P0^2; sbit T_IO =P0^1; sbit T_RST=P0^0; sbit ACC0=ACC^0; sbit ACC7=ACC^7; uchar starts_time[7]={0x00,0x10,0x22,0x11,0x06,0x07,0x06}; uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; uchar a,b,f,h,msec,id,x; uint zimuo; uchar BUFF[10]; void RTInputByte(uchar); uchar RTOutputByte(void); void W1302(uchar, uchar); uchar R1302(uchar); void Set1302(uchar *); void du1302(); void DelayMs(void); void Set(uchar,uchar ); void in_data(); void rxd_data(); void main() { Move=0; zimuo=0; TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; TR0=1; ET0=1; SCON=0; while(zimuo<512) { while(Move<16) { for(Speed=0;Speed<10;Speed++) { for(line=0;line<16;line++) { in_data(); rxd_data(); P2_4=1; DelayMs(); P2_7=1; P2=sw[line]; DelayMs(); } } Move++; } Move=0; zimuo=zimuo+32; } zimuo=0; while(1) { if(resget==0) { DelayMs(); if(resget==0) Set1302(starts_time); W1302(0x8e,0x00); W1302(0x90,0xa5); } du1302(); if (key_moda==0) { DelayMs(); if(key_moda==0) { if(id++==9) {id=0;} h=0;msec=0; while(key_moda==0){ Show_word();} } } if(id!=0) { if (key_up==0) { DelayMs(); if(key_up==0) { while(key_up==0) {Show_word();} h=0;msec=0; Set(id,0); } } if (key_Down==0) { DelayMs(); if(key_Down==0) { while(key_Down==0) {Show_word();} h=0;msec=0; Set(id,1); } } } 【51单片机LED流星灯C程序】是基于51系列单片机设计的一种LED显示效果,通过编程实现LED灯流动闪烁的效果,类似于流星划过夜空的视觉体验。程序中涉及到了单片机的基本操作、定时器、中断、I/O口控制以及数据处理等多个知识点。 1. **51单片机**:51系列单片机是Intel公司生产的8位微处理器,广泛应用于嵌入式系统中,具有易于学习、成本低的特点。在这个程序中,使用的型号是AT89x52,它是51系列的一个扩展,提供了更多的I/O引脚和内存空间。 2. **头文件**:`#include <AT89x52.H>` 和 `#include <reg51.h>`,这两个头文件包含了51单片机的寄存器定义和常用函数,方便对单片机进行编程。 3. **定义与变量**: - `uchar` 和 `uint` 定义为无符号字符型和无符号整型,用于存储数据。 - `hanzi`, `timer`, `sw` 等是代码存储区的字符数组,通常用来存放固定的常量数据。 - `Show_word()`, `Show_pass()`, `Send_data()` 等是自定义的函数,执行特定任务,如显示汉字、处理数据发送等。 - `resget`, `key_moda`, `key_up`, `key_Down` 等定义了单片机的I/O口,用于检测按键输入。 - `T_CLK`, `T_IO`, `T_RST` 是定时器相关的引脚。 4. **定时器配置**: - `TMOD=0x01;` 设置定时器0工作在模式1,即16位定时器。 - `TH0=0x3c; TL0=0xb0;` 初始化定时器初值,用于定时任务。 - `EA=1; TR0=1; ET0=1;` 开启全局中断,启动定时器0,并允许定时器0中断。 5. **I/O口操作**: - `P2_4`, `P2_7`, `P2` 等定义了P2口的某些位,用于LED灯的显示控制。 - `in_data(); rxd_data();` 函数用于读取和处理数据,可能涉及串行通信。 6. **LED显示控制**: - `Move`, `Speed`, `Flicker`, `line` 等变量用于控制LED流星灯的移动速度、闪烁频率和显示位置。 - `Set(uchar,uchar )` 函数可能是设置LED灯的状态或颜色。 - `in_data(); rxd_data();` 用于接收和处理数据,可能涉及串行通信协议。 7. **中断处理**: - `while(zimuo<512)` 中的循环可能在处理定时器中断,更新LED显示。 - `if(resget==0)` 检测复位信号,用于初始化或者重置设备。 - `if(key_moda==0)` 和 `if(key_up==0)`、`if(key_Down==0)` 检测按键输入,用于控制LED显示效果或改变设置。 8. **1302芯片操作**: - `W1302(uchar, uchar);` 和 `R1302(uchar);` 可能是与1302液晶显示驱动芯片进行数据写入和读取的操作。 - `Set1302(uchar *);` 用于设置1302芯片的参数。 - `du1302();` 更新1302芯片显示内容。 9. **延迟函数**: - `DelayMs();` 实现毫秒级别的延时,可能基于定时器实现。 10. **数据数组**: - 代码中给出了多组6位二进制数据,如`right_shift[MAX_MSG][MAX_PIX][6]`,这些数据可能对应于不同形状的LED图案,用于流星灯的流动效果。 整个程序通过定时器、中断、I/O口控制、按键输入和数据处理实现了动态的LED流星灯效果,同时考虑了用户交互,允许通过按键调整显示状态。这个程序展示了51单片机在嵌入式系统中实现复杂动画显示的能力。
剩余21页未读,继续阅读
- yiranyijianmei2013-06-02很不错啊,这个程序很不错,值得学习!
- weiyafengok2013-01-03额装好了,很漂亮
- jianwei20302013-09-28不只流星灯一种状态啊。
- iamzxy6292011-10-24运行起来有点小错,可能是我自己没设置好的原因
- HNNXBTXS2013-10-12编译时有错误,可能是代码哪里搞错了吧
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助