51单片机启用2个定时制作流水灯+Proteus仿真
51单片机启用2个定时制作流水灯+Proteus仿真
- Proteus

程序代码
采用2个定时器,工作方式都是1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| #include "reg52.h"
static unsigned char value = 0x01,value1 = 0x01; //给P1赋值 对应 0000 0001 static unsigned char i=0,j=0,n=0,m=0; static unsigned char flag =1,flag1 = 1; //左右移动标志 /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \*函数名:Timer0\_Init \*功能:定时器0初始化 \*参数:无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void Timer\_Init() { EA=1;//打开总中断 ET0=1;//打开定时器0中断允许 ET1=1;//打开定时器1中断允许 //TMOD|=0X01;//选择为定时器0模式,工作方式1,16位定时器,仅用TR0打开启动。 TMOD = 0x11; //同时设置T0和T1为工作模式1 TH0=(65536-50000)/256; //高四位寄存器的值; //给定时器赋初值,定时50ms TL0=(65536-50000)%256; //低四位寄存器的值; TH1=(65536-50000)/256; //高四位寄存器的值; //给定时器赋初值,定时50ms TL1=(65536-50000)%256; //低四位寄存器的值; // TH0=0X3C; // TL0=0XB0;
TR0=1;//打开定时器0 TR1=1;//打开定时器1 }
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \*函数名:main \*功能:函数入口 \*参数:无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void main() { Timer\_Init(); P0 = value; P2 =value1; while(1) { } }
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名: Timer0 \* 函数功能: 定时器0中断服务函数 \* 参数:无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void Timer0() interrupt 1 { static int i = 0; //控制循环左右移动 static int j = 0; //控制左右移动时间
j += 1; //每次进入中断加1
TH0=(65536-50000)/256; //高四位寄存器的值; TL0=(65536-50000)%256; //低四位寄存器的值; // TH0=0X3C; //手动给定时器重新赋初值,定时50ms // TL0=0XB0;
if(j>=40) {//2秒移位一次50msX40 if(i>=0 && i < 7 && flag ==1) { i++; value = value<<1; //0000 0001 << = 0000 0010 } else if(i==7) { flag = 0; } if(i <= 7 && i>0 && flag == 0) { i--; value = value>>1; //0000 0001 >> = 0000 0010 } else if(i==0) { i++; value = value<<1; //若此处不移则led0会在返回时多亮一个0.25s flag = 1; } P0 = value; j=0; //时间计数清零 } } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名: Timer1 \* 函数功能: 定时器1中断服务函数 \* 参数:无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void Timer1() interrupt 3 { m += 1; //每次进入中断加1 // TH1=0X3C; //手动给定时器重新赋初值,定时50ms // TL1=0XB0; if(m>=20) { if(n>=0 && n < 7 && flag1 ==1) { n++; value1 = value1<<1; //0000 0001 << = 0000 0010 } else if(n==7) { flag1 = 0; } if(n <= 7 && n>0 && flag1 == 0) { n--; value1 = value1>>1; //0000 0001 >> = 0000 0010 } else if(n==0) { n++; value1 = value1<<1; //若此处不移则led0会在返回时多亮一个0.25s flag1 = 1; } P2 = value1; m=0; //时间计数清零 } TH1=(65536-50000)/256; //高四位寄存器的值; TL1=(65536-50000)%256; //低四位寄存器的值; }
|
仿真资源和程序代码
1 2 3
| 链接:https://pan.baidu.com/s/132KX6Emc2kwI6mYstEwTVQ 提取码:jjf3
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!