(完整word版)51单片机流水灯
51单片机流水灯程序
51单片机流水灯程序51单片机是一种广泛使用的微控制器,具有丰富的IO端口和定时器资源。
流水灯程序是51单片机入门的基础示例之一,通过多个LED灯按照一定顺序逐个亮起或熄灭,形成流水灯的效果。
下面详细介绍51单片机流水灯程序的编写。
一、硬件连接要实现流水灯效果,需要将多个LED灯连接到51单片机的IO端口上。
一般使用P1端口作为输出端口控制LED灯的亮灭,P2端口作为输出口控制LED灯亮起的顺序。
具体连接方式如下:•将LED灯的阳极通过限流电阻连接到VCC。
•将每个LED灯的阴极通过限流电阻连接到P1端口。
•将P2端口的每个引脚依次连接到每个LED灯的阴极。
二、程序实现#include <reg52.h> //包含51单片机头文件#define LED P1 //定义LED为P1端口#define ORDER P2 //定义顺序控制为P2端口void delay(unsigned int t); //延时函数声明void main(){unsigned char i;while(1) //循环控制流水灯效果{for(i=0; i<8; i++) //控制8个LED灯{LED = 0x01<<i; //将第i个LED灯置亮delay(10000); //延时一段时间,使LED灯亮起后延时熄灭LED = 0x01>>(i+1); //将第i个LED灯置灭}}}void delay(unsigned int t) //延时函数定义{unsigned int i, j;for(i=0; i<t; i++){for(j=0; j<1275; j++);}}该程序首先定义了LED和ORDER两个变量,分别对应P1和P2端口的输出口。
在主函数中,使用一个while循环控制流水灯效果。
在循环内部,使用一个for循环控制8个LED灯的状态。
在每次循环中,先将第i个LED灯置亮,延时一段时间后将其置灭,然后进入下一个循环。
(完整版)51单片机流水灯程序
1.第一个发光管以间隔200ms 闪烁。
2.8 个发光管由上至下间隔1s 流动,其中每个管亮500ms, 灭500ms 。
3.8 个发光管来回流动,第个管亮100ms 。
4.用8 个发光管演示出8 位二进制数累加过程。
5.8 个发光管间隔200ms 由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms 间隔全部闪烁 5 次。
重复此过程。
6.间隔300ms 第一次一个管亮流动一次,第二次两个管亮流动,依次到8 个管亮,然后重复整个过程。
7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8 个全部闪烁 3 次;关闭发光管,程序停止。
1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p P1A0; uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a; delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay() {uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main() {uchar a,i;while(1)a=0xfe; for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a) { uint x,y; for(x=a;x>0;x--) for(y=110;y>0;y--);}void main() {uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main() { uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe; for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa; delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300); a=_crol_(a,1);}}P1=0xff; for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd; delay(300);P1=0xdb; delay(300);P1=0xe7; delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(1);}。
实验二.51单片机点亮流水灯
硬件连接
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
#include<reg52.h> sbit A0=P1^0;//位地址声明 sbit A1=P1^1; sbit A2=P1^2; sbit A3=P1^3; sbit ENLED=P1^4; unsigned char LED[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};//定义无符号字符型一维数组LED的8个初值 void main() { ENLED=0; A3=1; unsigned int i=0;//无符号整形I,并赋初值0 while(1) { P1=LED[0]; for(i=0;i<30000;i++); P1=LED[1]; for(i=0;i<30000;i++); P1=LED[2]; for(i=0;i<30000;i++); P1=LED[3]; for(i=0;i<30000;i++); P1=LED[4]; for(i=0;i<30000;i++); P1=LED[5]; for(i=0;i<30000;i++); P1=LED[6]; for(i=0;i<30000;i++); P1=LED[7]; for(i=0;i<30000;i++); } }
• 表达式1首先执行一次且只执行一次;然后 执行表达式2,通常都是一个判断条件的表 达式,如果表达式2成立,就执行(要执行 的语句);然后再执行表达式3。。。。一 直到表达式2不成立时,跳出循环继续执行 循环语句。
实验一51单片机流水灯实验实验报告
实验一 51单片机流水灯实验实验报告
“流水灯”实验报告 一、实验目的 1.了解单片机I/O口的工作原理。 2.掌握51单片机的汇编指令。 3.熟悉汇编程序开发,调试以及仿真环境。 二、实验内容 通过汇编指令对单片机I/O进行编程(本实验使用P0口),以控制八个发光二极管以一定顺序亮灭。(即流水灯效果) 三、实验原理 通过更改P0口8位的高低电平,分别控制8个发光二极管的亮灭。具体的亮灭情况如下表:
要实现“流水灯”效果,也就是需要将P0口的输出值发生以下变化: FE→FD→FB→F7→EF→DF→BF→7F→BF→DF→EF→F7→FB→FD→FE→...... 可以使用一个循环,不断对数据进行移位运算实现。这里的移位指令采用RL和RR,即不带进位的位移运算指令。如果使用带 进位的位移运算指令(RLC和RRC),则需要定期把CY置0,否则会出现同时亮起两个发光二极管的情况。 四、实验过程 1.在仿真系统中绘制RG 0000H Delay: MOV R0, #0FFH SJMP Start Delay1: MOV R1, #0FFH Start: MOV A, #0FEH Delay2: NOP MOV P0, A DJNZ R1, Delay2 CLR P2.7 DJNZ R0, Delay1 CLR P3.7 RET Move: MOV R2, #7H END MOV R3, #7H RMove: RL A MOV P0, A CALL Delay DJNZ R2, RMove LMove: RR A MOV P0, A CALL Delay DJNZ R3, LMove SJMP Move 五、实验结果 为了便于实验结果的描述,下面分别把P0.0, P0.1…, P0.7对应的发光二极管编号为1, 2, …, 8号二极管。 在仿真系统中,先从1号二极管下面是在仿真系统中的实验结果:
完整word版,C51单片机实行流水灯程序
#include<reg51.h>#define LEDPort P1unsigned char LED01_[9]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,};//方式0,方式1灯开关数组。
unsigned char LED23_[5]={0xFF,0x7E,0xBD,0xDB,0xE7};// 方式2,方式3灯开关数组。
unsigned char LED4_[16]={0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00,0X01,0X03,0X07,0X0f,0X1 f,0X3f,0X7f}; //方式4unsigned char LED56_[8]={0XFF,0X3F,0X9F,0XCF,0XE7,0XF3,0XF9,0XFC};unsigned char LED7_[]={0X0F,0XF0,0X33,0XCC,0X3C,0XC3,0XFF};unsigned char TAB[9]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//定义断码表。
unsigned char i=0,j=9; //数据选择计数。
unsigned char Mode=0; //模式选择,默认为模式0。
unsigned char Count=1; //定时器中断计数。
unsigned char Delay=1; //延迟计数,通过改变改数值改变灯状态延迟时间。
//灯延迟时间=uc_Dalay*定时器溢出时间。
void main(){ P2=0X3F;TMOD=0x01; //定时器0模式一。
TH0=0x3C;TL0=0xB0; //溢出时间:50ms。
TR0=1; //定时器0开启。
IT0=1; //外部中断0下降沿触发。
IT1=1; //外部中断1下降沿触发。
51单片机项目教程项目 4 流水灯实验
4.3 项目实施
4.3.1 流水灯开发实战环节
注意:J1接上才能开始做流水灯模块实验
图4- 6流水灯实物结果
实现延时通常有两种方法:一种是硬件延时,要用到定时器 /计数器,这种方法可以 提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用 循环体进行。
2、编写精确的延时函数 1)使用定时器/计数器实现精确延时
2)软件延时与时间计算
在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延 时。下面介绍几种软件延时的方法。 2.1 短暂延时 2.2 在C51中嵌套汇编程序段实现延时 2.3 使用示波器确定延时时间 2.4 使用反汇编工具计算延时时间
(216-初值)×振荡周期×12
例如:若晶振频率为12MHz,则最长的定时时间为(2160)×(1/12)×12us=65.536ms
4.2 技术准备
3. 方式2 THx作为常数缓冲器,当TLx计数溢出时,在置“1”溢出标志TFx 的同时,还自动的将THx中的初值送至TLx,使TLx从初值开始重新计 数。 其定时时间为:
例如:机器时钟频率为12MHZ,机器周期为1μs 时,
若工作在模式0,则最大定时值为:213×1μs =8.192ms 若工作在模式1,则最大定时值为: 216×1μs =65.536ms (2)置定时/计数器初值,直接将初值写入寄存器的TH0、TL0或TH1、TL1;
(3)对TCON寄存器中的TR0或TR1置位,启动定时/计数器,置位以后,计数器 即按规定的工作模式和初值进行计数或开始定时。
4.2 技术准备
4.2.7定时器编程步骤 MCS-51单片机的定时器/计数器是可编程的,具体步骤如下: (1)对TMOD赋值,以确定定时器的工作模式; 初值计算: 设计数器的最大值为M,则置入的初值X为: 计数方式:X=M-计数值 定时方式:由(M-X)T=定时值,得X=M-定时值/T T为计数周期,是单片机的机器周期。 (模式0: M为213=8192 ,模式1: M为216=65536,模式2和3: M为28=256)
51单片机控制流水灯和数码管
• 灯光在微电脑控制之下完成由亮到暗的逐 渐变化,感觉像是在呼吸。 • 实现灯不同亮度的两种方法: 1 调节灯的保护电阻, 2 使用PWM。
数码管的操作
• 数码管的介绍 • 数码管的操作
g f GND a b a a f e d g b c dp b c d e f g dp a b c d e f g dp
任务
• 第一次一个管亮流动一次,第二次两个管 亮流动,依次到8个管亮,然后重复整个过 程。 • 先奇数亮再偶数亮,循环三次;一个灯上 下循环三次;两个分别从两边往中间流动 三次;再从中间往两边流动三次;8个全部 闪烁3次;关闭发光管,程序停止。 • 用8个发光管演示出8位二进制数累加过程。
呼吸灯的操作
较复杂,成本较高。
动态显示
动态显示的特点是将所有位数码管的段选线并 联在一起,由位选线控制是哪一位数码管有效。选 亮数码管采用动态扫描显示。所谓动态扫描显示即 轮流向各位数码管送出字形码和相应的位选,利用 发光管的余辉和人眼视觉暂留作用,使人的感觉好 像各位数码管同时都在显示。动态显示的亮度比静 态显示要差一些,所以在选择限流电阻时应略小于 静态显示电路中的。
C51库函数 instrins.h
• 循环左移 unsigned char _crol_(unsigned char c,unsigned char b);
C语言中的<<和>>
• 每执行一次<<操作,被操作数高位数丢失, 低位补零;
C语言中的<<和>>
• 每执行一次<<操作,被操作数低位数丢失, 高位补零;
流水灯的操作
2013.0பைடு நூலகம்.22
• 点亮第一个灯; • 让第一个灯闪烁; • 从第一个灯依次点亮至最后一个灯;
51单片机-流水灯
51单片机-流水灯这个是原理图,从图中最右边有一个排阻,也就是这里八个电阻封装在一起,这里排阻的特点是八个电阻有一个公共端,然后一个电源VCC 通过跳线与排阻相连。
到达二极管的电流从正极流向负极,如果二极管负极是低电平,则电流流过二极管,发光二极管亮起来。
负极接在单片机的P2 端口上。
也就是说P2 的引脚位低电平时可驱动发光二极管发光。
驱动各个灯闪烁的方法是把各位循环左移,使用函数_crol_。
#include #include unsigned int a;void delay(){ int i,j; for(i = 0; i #include unsigned int dd;sbit key = P1;void delay(){ int i,j; for(i = 0; i 2. #include 3. #define uint unsigned int 4. uint a; 5. 6. void delay(uint t){ 7. int i,j; 8. for(i = 0; i < t; i++) 9. for(j = 0; j < 0xff;j++) 10. ; 11. } 12. 13. void liushui(){ 14. int i,dd; 15. dd =0xfe; //dd = 1111 1110 此时L9 亮16. for(i = 0; i < 8; i++){ 17.P2 = dd; 18. delay(1000); 19. dd = _crol_(dd,1); // 循环左移一位dd = 1111 1101 20. P2 = 0xff; 21. delay(300); 22. } 23. } 24. void main(){ 25. while(1){ 26. liushui(); 27. } 28.}tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
51单片机最小系统流水灯
51单片机最小系统流水灯按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz 工作频率,使用AT89C51单片机时无须外扩存储器。
因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
其具体硬件组成如图1所示。
图1 流水灯硬件原理图从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
光控电子开关,它的“开”和“关”是靠可控硅的导通和阻断来实现的,而可控硅的导通和阻断又是受自然光的亮度(或人为亮度)的大小所控制的。
该装置适合作为街道、宿舍走廊或其它公共场所照明灯,起到日熄夜亮的控制作用,以节约用电。
工作原理电路如上图所示,220V交流电通过灯泡H及整流全桥后,变成直流脉动电压,作为正向偏压,加在可控硅VS及R支路上。
白天,亮度大于一定程度时,光敏二极管D呈现底阻状态≤1KΩ,使三极管V截止,其发射极无电流输出,单向可控硅VS因无触发电流而阻断。
此时流过灯泡H的电流≤2.2mA,灯泡H不能发光。
51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析
51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析首先,介绍下原理。
下图为主控芯片和流水灯模块的原理图。
流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。
相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。
要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
听起来是不是很简单啊!那么下面我们来看下实现流水灯功能的三种常用方法!第一种,总线方法实现流水灯。
这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。
C程序如下:#include#define uchar unsigned char#define uint unsigned intcode unsigned char tmpled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义八只LED灯,依次点亮八只LED灯//N毫秒的延时函数delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); return 0; }void main(void){unchar i;while (1){for(i=0;i#define uchar unsigned char#define uint unsigned int//N毫秒的延时函数delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); return 0; }。
51单片机经典流水灯程序
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
ORG 0;程序从0地址开始START: MOV A,#0FEH ;让ACC的内容为LOOP: MOV P2,A ;让P2口输出ACC的内容RR A;让ACC的内容左移CALL DELAY ;调用延时子程序LJMP LOOP ;跳到LOOP处执行;0.1秒延时子程序(12MHz晶振)===================DELAY: MOV R7,#200 ;R7寄存器加载200次数D1: MOV R6,#250 ;R6寄存器加载250次数DJNZ R6,$ ;本行执RET;返回主程序END;结束程序开关控制的单片机流水灯汇编在单片机控制下,用一个拨动开关K1,控制8个发光二极管L1-L8,发光的时间间隔为0.5秒。
(完整word版)实验一51单片机流水灯实验实验报告(word文档良心出品)
“流水灯”实验报告一、实验目的1.了解单片机I/O口的工作原理。
2.掌握51单片机的汇编指令。
3.熟悉汇编程序开发,调试以及仿真环境。
二、实验内容通过汇编指令对单片机I/O进行编程(本实验使用P0口),以控制八个发光二极管以一定顺序亮灭。
(即流水灯效果)三、实验原理通过更改P0口8位的高低电平,分别控制8个发光二极管的亮灭。
具体的亮灭情况如下表:要实现“流水灯”效果,也就是需要将P0口的输出值发生以下变化:FE→FD→FB→F7→EF→DF→BF→7F→BF→DF→EF→F7→FB→FD→FE→......可以使用一个循环,不断对数据进行移位运算实现。
这里的移位指令采用RL和RR,即不带进位的位移运算指令。
如果使用带进位的位移运算指令(RLC和RRC),则需要定期把CY置0,否则会出现同时亮起两个发光二极管的情况。
四、实验过程1.在仿真系统中绘制好单片机的电路图2.编写汇编程序,程序如下:ORG 0000H Delay: MOV R0, #0FFHSJMP Start Delay1: MOV R1, #0FFH Start: MOV A, #0FEH Delay2: NOPMOV P0, A DJNZ R1, Delay2CLR P2.7 DJNZ R0, Delay1CLR P3.7 RETMove: MOV R2, #7H ENDMOV R3, #7HRMove: RL AMOV P0, ACALL DelayDJNZ R2, RMoveLMove: RR AMOV P0, ACALL DelayDJNZ R3, LMoveSJMP Move五、实验结果为了便于实验结果的描述,下面分别把P0.0, P0.1…, P0.7对应的发光二极管编号为1, 2, …, 8号二极管。
在仿真系统中,先从1号二极管下面是在仿真系统中的实验结果:实验的结果:二极管的发光状态从1→2→3→4→5→6→7→8→7→…→1→2;如此往复循环。
51单片机流水灯程序
char code table4[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};//P0123 一个灯走动
char code table5[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,};//P0123 两个灯走动
char code table6[]={0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,};//P0123 三个灯走动
for(j=0;j<8;j++)//P0123 一条龙一个灯走动
{ P0=table4[j];
delay(5);
} P0=0xff;
for(j=0;j<8;j++)//P0123 一条龙一个灯走动
{ P2=table4[j];
delay(5);
}
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
for(j=0;j<7;j++)//P0123 两个灯走动
{ P0=table5[j];
P1=table5[j];
P2=table5[j];
P3=table5[j];
for(j=1;j<7;j++)//P0123 一条龙两个灯走动
{ P2=table5[j];
delay(5);
{ P0=table10[j];
P1=table10[j];
P2=table10[j];
P3=table10[j];
delay(5);
} P0=0x00;P1=0x00;P2=0x00;P3=0x00;delay(5);
51单片机流水灯程序
51单片机流水灯程序// 51 单片机的心形流水灯 #include unsigned int x,y; void delayms(unsigned int z) //延时程序 { unsigned int i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } /*----------------------------------------------------------*/ void Offall() //开启所有灯 { P0=0x00; P1=0x00; P2=0x00; P3=0x00; P4=0X00; P5=0X00; } /*----------------------------------------------------------*/ void Onall()//关闭所有灯 { P0=0xff; P1=0xff; P2=0xff; P3=0xff; P4=0XFF; P5=0XFF; } /*----------------------------------------------------------*/ void ls()//等时流水灯 { P0=0x00; P0=0x01; delayms(50); P0=0x02; delayms(50); P0=0x04; delayms(50) ; P0=0x08; delayms(50) ; P0=0x10;delayms(50) ; P0=0x20; delayms(50); P0=0x40; delayms(50) ; P0=0x80; delayms(50); P0=0x00; P2=0x00; P2=0x80; delayms(50) ; P2=0x40; delayms(50);P2=0x20; delayms(50) ; P2=0x10; delayms(50) ; P2=0x08; delayms(50) ; P2=0x04; delayms(50); P2=0x02; delayms(50) ; P2=0x01; delayms(50); P2=0x00; P3=0x00;P3=0x80; delayms(50) ; P3=0x40; delayms(50); P3=0x20; delayms(50) ; P3=0x10; delayms(50) ; P3=0x08; delayms(50) ; P3=0x04; delayms(50); P3=0x02;delayms(50) ; P3=0x01; delayms(50); P3=0x00;P1=0x00; P1=0x80; delayms(50) ; P1=0x40; delayms(50); P1=0x20;delayms(50) ; P1=0x10; delayms(50) ; P1=0x08; delayms(50) ; P1=0x04;delayms(50); P1=0x02; delayms(50) ; P1=0x01; delayms(50); P1=0x00; P0=0x01; delayms(50); P0=0x00; } /*----------------------------------------------------------*/ void fxls()//反向等时流水灯 { P0=0x00; P0=0x01; delayms(50); P0=0x00; P1=0x00; P1=0x01;delayms(50); P1=0x02;delayms(50); P1=0x04;delayms(50);P1=0x08;delayms(50); P1=0x10;delayms(50); P1=0x20;delayms(50);P1=0x40;delayms(50); P1=0x80;delayms(50); P1=0x00; P3=0x00;P3=0x01;delayms(50); P3=0x02;delayms(50); P3=0x04;delayms(50);P3=0x08;delayms(50);P3=0x10;delayms(50); P3=0x20;delayms(50); P3=0x40;delayms(50);P3=0x80;delayms(50); P3=0x00; P2=0x00; P2=0x01;delayms(50);P2=0x02;delayms(50); P2=0x04;delayms(50); P2=0x08;delayms(50);P2=0x10;delayms(50); P2=0x20;delayms(50); P2=0x40;delayms(50);P2=0x80;delayms(50); P4=0X00; P4=0x01;delayms(50); P4=0x02;delayms(50);P4=0x04;delayms(50); P4=0x08;delayms(50); P4=0x10;delayms(50);P4=0x20;delayms(50); P4=0x40;delayms(50); P4=0x80;delayms(50); P4=0X00;P2=0x00; P0=0x00; P0=0x80;delayms(50); P0=0x40;delayms(50);P0=0x20;delayms(50); P0=0x10;delayms(50); P0=0x08;delayms(50);P0=0x04;delayms(50); P0=0x02;delayms(50); P0=0x01;delayms(50); P0=0x00; } /*----------------------------------------------------------*/ void bsb()//半双边流水由上至下 { Offall(); P0=0x01;delayms(50); P0=0x02;P1=0x01;delayms(50);P0=0x04;P1=0x02;delayms(50);P0=0x08;P1=0x04;delayms(50); P0=0x10;P1=0x08;delayms(50);P0=0x20;P1=0x10;delayms(50); P0=0x40;P1=0x20;delayms(50);P0=0x80;P1=0x40;delayms(50);P0=0x00; P2=0x80;P1=0x80;delayms(50);P1=0x00;P2=0x40;P3=0x01;delayms(50); P2=0x20;P3=0x02;delayms(50);P2=0x10;P3=0x04;delayms(50); P2=0x08;P3=0x08;delayms(50);P2=0x04;P3=0x10;delayms(50); P2=0x02;P3=0x20;delayms(50); P2=0x01;P3=0x40;delayms(50);Offall(); P3=0x80;delayms(50);Offall(); } /*----------------------------------------------------------*/ void fbsb() //半双边流水由下至上 { Offall();P3=0x80;delayms(50); P2=0x01;P3=0x40;delayms(50); P2=0x02;P3=0x20;delayms(50); P2=0x04;P3=0x10;delayms(50); P2=0x08;P3=0x08;delayms(50);P2=0x10;P3=0x04;delayms(50); P2=0x20;P3=0x02;delayms(50);P2=0x40;P3=0x01;delayms(50);Offall(); P2=0x80;P1=80;delayms(50);Offall();P0=0x80;P1=0x40;delayms(50); P0=0x40;P1=0x20;delayms(50);P0=0x20;P1=0x10;delayms(50); P0=0x10;P1=0x08;delayms(50);P0=0x08;P1=0x04;delayms(50); P0=0x04;P1=0x02;delayms(50);P0=0x02;P1=0x01;delayms(50);Offall(); P0=0x01;Offall(); } void zxsz() //正向生长 { Offall(); P0=0x01;delayms(50); P0=0x03;delayms(50); P0=0x07;delayms(50);P0=0x0f;delayms(50); P0=0x1f;delayms(50); P0=0x3f;delayms(50);P0=0x7f;delayms(50); P0=0xff;delayms(50); P2=0x80;delayms(50);P2=0xc0;delayms(50); P2=0xe0;delayms(50); P2=0xf0;delayms(50);P2=0xf8;delayms(50); P2=0xfc;delayms(50); P2=0xfe;delayms(50);P2=0xff;delayms(50); P3=0x80;delayms(50); P3=0xc0;delayms(50);P3=0xe0;delayms(50); P3=0xf0;delayms(50); P3=0xf8;delayms(50);P3=0xfc;delayms(50); P3=0xfe;delayms(50); P3=0xff;delayms(50);P1=0x80;delayms(50); P1=0xc0;delayms(50); P1=0xe0;delayms(50);P1=0xf0;delayms(50); P1=0xf8;delayms(50); P1=0xfc;delayms(50);P1=0xfe;delayms(50); P1=0xff;delayms(50); } /*----------------------------------------------------------*/ void fxsz() //反向生长 { Offall();P0=0x01;delayms(50); P1=0x01;delayms(50); P1=0x03;delayms(50);P1=0x07;delayms(50); P1=0x0f;delayms(50); P1=0x1f;delayms(50);P1=0x3f;delayms(50); P1=0x7f;delayms(50);P1=0xff;delayms(50); P3=0x01;delayms(50); P3=0x03;delayms(50);P3=0x07;delayms(50); P3=0x0f;delayms(50); P3=0x1f;delayms(50);P3=0x3f;delayms(50); P3=0x7f;delayms(50); P3=0xff;delayms(50);P2=0x01;delayms(50); P2=0x03;delayms(50); P2=0x07;delayms(50);P2=0x0f;delayms(50); P2=0x1f;delayms(50); P2=0x3f;delayms(50);P2=0x7f;delayms(50); P2=0xff;delayms(50); P0=0x81;delayms(50);P0=0xc1;delayms(50); P0=0xe1;delayms(50); P0=0xf1;delayms(50);P0=0xf9;delayms(50); P0=0xfd;delayms(50); P0=0xff;delayms(50); } /*----------------------------------------------------------*/ void zxsw() //正向死亡{ Onall(); P0=0xfd;delayms(50); P0=0xf9;delayms(50); P0=0xf1;delayms(50);P0=0xf0;delayms(50); P0=0xe1;delayms(50); P0=0xc1;delayms(50);P0=0x81;delayms(50); P0=0x01;delayms(50); P2=0x7f;delayms(50);P2=0x3f;delayms(50); P2=0x1f;delayms(50); P2=0x0f;delayms(50);P2=0x07;delayms(50); P2=0x03;delayms(50); P2=0x01;delayms(50);P2=0x00;delayms(50); P3=0x7f;delayms(50); P3=0x3f;delayms(50);P3=0x1f;delayms(50); P3=0x0f;delayms(50); P3=0x07;delayms(50);P3=0x03;delayms(50); P3=0x01;delayms(50); P3=0x00;delayms(50);P1=0x7f;delayms(50); P1=0x3f;delayms(50); P1=0x1f;delayms(50);P1=0x0f;delayms(50); P1=0x07;delayms(50); P1=0x03;delayms(50);P1=0x01;delayms(50); P1=0x00;delayms(50); P0=0x00;delayms(50);}/*----------------------------------------------------------*/ void fxsw() //反向死亡 { Onall(); P1=0xfe;delayms(50); P1=0xfc;delayms(50);P1=0xf8;delayms(50); P1=0xf0;delayms(50); P1=0xe0;delayms(50);P1=0xc0;delayms(50); P1=0x80;delayms(50); P1=0x00;delayms(50);P3=0xfe;delayms(50); P3=0xfc;delayms(50); P3=0xf8;delayms(50);P3=0xf0;delayms(50); P3=0xe0;delayms(50);P3=0xc0;delayms(50); P3=0x80;delayms(50); P3=0x00;delayms(50);P2=0xfe;delayms(50); P2=0xfc;delayms(50); P2=0xf8;delayms(50);P2=0xf0;delayms(50); P2=0xe0;delayms(50); P2=0xc0;delayms(50);P2=0x80;delayms(50); P2=0x00;delayms(50); P0=0x7f;delayms(50);P0=0x3f;delayms(50); P0=0x1f;delayms(50); P0=0x0f;delayms(50);P0=0x07;delayms(50); P0=0x03;delayms(50); P0=0x01;delayms(50);P0=0x00;delayms(50); } /*----------------------------------------------------------*/ void bbs()//半边交替闪{ Offall();P0=0x00;P2=0xff;P3=0x80;delayms(200);Offall();P0=0xfe;P1=0xff;P3=0x ff;delaym s(200); } /*----------------------------------------------------------*/ void sxs()//上下交替闪{ Offall();P1=0xff;P0=0x00;P2=0x80;delayms(200);Offall();P2=0x7f;P3=0xff;delay ms(200); } void cx() //出现一点点 {Offall();delayms(1000); P0=0x00;P2=0x00;P1=0x40;P3=0x00;delayms(1000);P0=0x20;P2=0x40;P1=0x40;P3=0x00;delayms(1000);P0=0x24;P2=0x42;P1=0x40;P3=0x04;delayms(1000);P0=0xa6;P2=0x5a;P1=0x52;P3=0x65;delayms(1000); P0=0xee;P2=0xdf;P1=0xdb;P3=0xef; delayms(1000); P0=0xff;P2=0xff;P1=0xff;P3=0xff;delayms(1000); } void xs(){ Onall();delayms(1000); P0=0xee;P2=0xdf;P1=0xdb;P3=0xef; delayms(1000);P0=0xa6;P2=0x5a;P1=0x52;P3=0x65;delayms(1000);P0=0x24;P2=0x42;P1=0x40;P3=0x04;delayms(1000);P0=0x20;P2=0x40;P1=0x40;P3=0x00;delayms(1000);P0=0x00;P2=0x00;P1=0x40;P3=0x00;delayms(1000);Offall();delayms(1000); } void main() { Onall(); delayms(1000); Offall(); delayms(1000); cx();//一点点出现xs(); zxsw();/* 正向死亡*/ ls(); /* 正向流水 */ zxsz();/* 正向生长 */ zxsw();/* 正向死亡 */ //一点点消失fxsz();/* 反向生长 */ fxsw(); /* 反向死亡 */ fxls(); /* 反向流水*/ bsb();/* 半双边流水由上至下 */ fbsb();/* 半双边流水由下至上 */ sxs(); bbs(); }。
最经典的51单片机经典流水灯汇编程序
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#11101111BLCALL DELAYMOV P1,#11110111BLCALL DELAYMOV P1,#11111011BLCALL DELAYMOV P1,#11111101BLCALL DELAYMOV P1,#11111110BLCALL DELAYMOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯org 00h ;程序上电从00h开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成11111110loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
51单片机 流水灯 实验(汇编)
实验一 单片机I/O 并口视觉实验(流水灯)(仅供参考) 开课学院及实验室:xxxx 实验时间 : xxxx 年 xx 月 xx 日实验目的1、了解简单单片机应用系统的设计方法。
2、掌握应用KEIL 软件编辑、编译源程序的操作方法。
3、掌握应用PROTEUS 仿真软件的操作方法。
4、掌握C51的编程方法。
5、培养良好的实验习惯。
实验内容1、AT89S52为主控芯片,用PROTEUS 仿真设计简单单片机应用系统。
2、编程实现8个发光LED“流水”的现象。
实验原理1、流水灯(1)实验原理图(2)流程图:(我自己没画好请自行画)此处略去(2)实验程序1、单灯流水灯ORG 000HMOV R7,#0FEH ;初始:11111110 LOOP:MOV P1,R7LCALL DELAYMOV A,R7RL A ;左移MOV R7,ASJMP LOOPDELAY:MOV R6,#4H ;最外层4次DE1:MOV R5,#250 ;次外层250次DE2:MOV R4,#250 ;最外层250次DJNZ R4,$DJNZ R5,DE2DJNZ R6,DE1 ;共:2us*4*250*250=0.5s RETEND2、来回灯ORG 000HLL:MOV R7,#0FEH;左移初始化MOV R1,#7LOOPL:MOV P1,R7LCALL DELAYMOV A,R7RL AMOV R7,ADJNZ R1,LOOPL ;左移7次后跳至右移LR:MOV R2,#07FH;右移初始化MOV R1,#7LOOPR:MOV P1,R2LCALL DELAYMOV A,R2RR AMOV R2,ADJNZ R1,LOOPR ;右移7次后跳至左移JJM:SJMP LLDELAY:MOV R6,#4HDE1:MOV R5,#250DE2:MOV R4,#250DJNZ R4,$DJNZ R5,DE2DJNZ R6,DE1RETEND3、自定义灯ORG 000HMAIN:MOV DPTR,#TABMOV R0,#0MOV R1,#18MLOOP:MOV A,R0MOVC A,@A+DPTRMOV P1,ACALL DELAYINC R0DJNZ R1,MLOOPJMP MAINTAB:DB 0E7H, 0DBH, 0BDH, 07EH, 0F0H, 0E1H, 0C3H, 087H, 00FH, 087H, 0C3H, 0E1H, 000H, 0FFH, 000H, 0FFH, 000H, 0FFHDELAY:MOV R6,#4HDE1:MOV R5,#250DE2:MOV R4,#250DJNZ R4,$DJNZ R5,DE2DJNZ R6,DE1RETEND4、级联ORG 000H/********R7为灯的寄存**********//*R1控制灯的次数R2控制循环几次*//*********单灯两次*************/MOV R2,#2DANDENG:MOV R7,#0FEHMOV R1,#8LOOP1:MOV P1,R7LCALL DELAYMOV A,R7RL AMOV R7,ADJNZ R1,LOOP1DJNZ R2,DANDENG/*********来回一次**************/ LAIHUI:MOV R7,#0FEHMOV R1,#7LOOPLL:MOV P1,R7LCALL DELAYMOV A,R7RL AMOV R7,ADJNZ R1,LOOPLLLR:;MOV R2,#07FHMOV R1,#8LOOPRR:MOV P1,R7LCALL DELAYMOV A,R7RR AMOV R7,ADJNZ R1,LOOPRR/**********自定义一次************/ ZIDINGYI:MOV DPTR,#TABMOV R0,#0MOV R1,#18MMLOOP:MOV A,R0MOVC A,@A+DPTRMOV P1,ACALL DELAYINC R0DJNZ R1,MMLOOPTAB:DB 0E7H, 0DBH, 0BDH, 07EH, 0F0H, 0E1H, 0C3H, 087H, 00FH, 087H, 0C3H, 0E1H, 000H, 0FFH, 000H, 0FFH, 000H, 0FFHLOOPALL:SJMP DANDENGDELAY:MOV R6,#4HDE1:MOV R5,#250DE2:MOV R4,#250DJNZ R4,$DJNZ R5,DE2DJNZ R6,DE1RETEND实验总结1、实验中出现的问题,如何解决2、心得体会。
51单片机爱心流水灯原理及制作
C 2—*XTAL1—P?-R5470△型30PSEN ALE FALED 32 1'LED31 2! _E「〔i 3 丄::艾_4!岸匚舷5L 竺总 :LEt® 了 :-已不芒P1 M2P- \T ;EX P\2 pfiLEMRiyELEr^BF 2 Li I■ 05 L£kfllR4D2p-F?RT2LtO@Ri>M —n <TE3.T>■LEr--BIH^ ■iflEJC" 尺2l --------- 1_CTM» ^TEJ.T=jv ---------1L£EQD a 6 LE 仙日問Tl TR31砂JL : r - ■二□ 1LHbtiROi<reAi*^C17 1 •PT1 --------- r 也LES-BF-3JOJl-■=>DiflLE>BIF3R77<L~-LEBHR-ft126UEP-jJ月:訥4KRFHLED*"耶R24R13 TF ―—■■——■ i'fOfc .E[I •曰耶口1 - P14"E- v L2b1 二盲 Q ?3耕LFBTW.LEMRAnpR151! ■R2DLEI :1,1L=PUI ID31 丐Ml 舲 ■=rE^7=- LECJpT-.D13 RIB i " °^DR "5FU2<ED !4R13LEE BF ILE : BR :-■* ----4?0RLE :』赋iEW1、51 单片机x1、40Pin 座x12、L ED x32 (建议用5mm七彩的)3、电阻470Q x334、晶振12MHz x15、10uf电解电容x1、谐振瓷片电容30pf x26•其他的可以看自己的爱好去加7、其实也可以不用那么多的电阻,用几个排阻就OKT 效果展示:作品程序:#in clude<>#defi ne uchar un sig ned charuchar flag=200;/////////////////////////////////////////////////////////////////////// uchar codeTab1[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF};〃下uchar codeTab2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF};〃上uchar code Tab3[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};〃下uchar code Tab4[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00};〃上uchar code Tab11[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xff};〃下uchar code Tab22[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xff};//////////////////////////////////////////////////////////////////// 暗中左移向暗中右移向亮中左移向亮中右移向暗中左移向uchar code Tab33[]={0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF}; uchar code Tab44[]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};uchar code Tab55[]={0x08,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff};uchar code Tab5[]={0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xff}; uchar code Tab6[]={0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xff}; uchar code Tab7[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar code Tab8[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};////////////////////////////////////////////////////////////////void shansuo();void xl(); /////////////////////////////////////////////////////////////// void delay(void){unsigned char m,n; for(m=0;m<flag;m++) for(n=0;n<250;n++)J} /////////////////////////////////// void hy1(void) // 点亮状态逆时针旋转90 度(一个一个{灭)unsigned char i; for(i=0;i<8;i++){ P0=Tab11[i];P1=Tab22[i];P2=Tab11[i];P3=Tab22[i]; delay();} for(i=0;i<8;i++){ P0=Tab44[i];P1=Tab55[i];P2=Tab44[i];P3=Tab55[i];delay();}}///////////////////////////////////////////void hy2(void) // 暗中逆时针转360 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机的流水灯控制
班级:100712
姓名:***
学号:********
一、设计要求
用51单片机设计一个流水灯的控制方案,要求采用定时器定时,利用中断法控制流水灯的亮灭,画出电路图和程序流程图,写出程序代码以及代码注释。
二、电路原理图
原理图分析:
本原理图采用STC89S52单片机控制8个LED灯,其中8个LED灯的负极接单片机的P1端口,正极通过1KΩ排阻连接到电源上。
原理图中还给出了晶振与复位端,以保证控制器的稳定工作。
三、程序流程图
四、程序代码及注解
1.非中断定时器控制
#include<reg52.h>
#include<intrins.h>//包含了_crol_函数的头文件
#define uchar unsigned char
#define uint unsigned int
uint i=0;
uchar a=0xfe;
void main()
{
TMOD=0x01;//设置工作方式为定时器0,16位手动重装初值
TH0=(65536-46080)/256;//50毫秒定时赋初值
TL0=(65536-46080)%256;
TR0=1;//启动定时器0
while(1)
{
If(TF==1)//读溢出标志位
{
TH0=(65536-46080)/256;//重新赋初值
TL0=(65536-46080)%256;
i++;
if(i==10)//500毫秒定时
{
i=0;
P1=a;//P1端口赋值
a=_crol_(a,1);//循环左移
}
TF=0;//清除定时器溢出标志
}
}
}
程序分析:本程序采用非中断定时器法控制流水灯,核心语句在于读取标志位TF位,TF为定时器溢出标志位,溢出时硬件自动置一,所以循环读取标志位以判断定时器是否溢出,而每次溢出需要手动清零,否则定时器无法再次溢出,利用标志i读取10次即可达到500毫秒的定时。
另外需要注意的是单片机晶振为11.0592MHz,所以计时一个数的时间为12/11.0592=1.085us,故定时50毫秒的计数为50000/1.085=46080。
2.中断定时器控制
#include<reg52.h>
#include<intrins.h>//包含了_crol_函数的头文件
#define uart unsigned char
#define uint unsigned int
uint i=0;
uchar a=0xfe;
void Timer0_init();
void main()
{
Timer0_init();//定时器中断初始化
while(1);
}
Timer0_init()
{
TMOD=0x01;//设置定时器方式为定时器0,16位手动重装初值
TH0=(65536-46080)/256;//50毫秒定时赋初值
TL0=(65536-46080)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//开启定时器0
}
void timer0() interrupt 1//定时器0中断服务程序
{
TH0=(65536-46080)/256;//重装初值
TL0=(65536-46080)%256;
i++;
if(i==10)//500毫秒定时
{
P1=a;//P1端口赋值
a=_crol_(a,1);//循环左移
}
}
程序分析:本程序采用定时器中断法控制流水灯,核心语句在于中断的产生上,主程序中定时器初始化一次之后用一个while循环让程序停留在此处等待中断的产生,此句话是为了防止程序跑飞设计。
而定时器计数溢出后将产生中断,定时器0的中断服务程序标志是interrupt 1,定时溢出后将自动跳转到此中断服务程序中执行,通过读取10次来达到500毫秒的定时,注意初值的重置与标志位的清零即可。