#stcc单片机流水灯程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机流水灯程序
程序一<用C语言编地最基础地程序)
#include<reg52.h>
#include<stdio.h>
sbit D0=P1^0。
//位定义,把P1口地第一个管脚定义为D0 sbit D1=P1^1。
// 位定义,把P1口地第二个管脚定义为D1 sbit D2=P1^2。
// 位定义,把P1口地第3个管脚定义为D2 sbit D3=P1^3。
// 位定义,把P1口地第4个管脚定义为D3 sbit D4=P1^4。
// 位定义,把P1口地第5个管脚定义为D4 sbit D5=P1^5。
// 位定义,把P1口地第6个管脚定义为D5 sbit D6=P1^6。
// 位定义,把P1口地第7个管脚定义为D6 sbit D7=P1^7。
// 位定义,把P1口地第8个管脚定义为D7 void main(>
{
while(1>//建立大地死循环.
{
unsigned int i,j。
D0=0,D7=1。
//亮灯1,关灯8
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
//两个FOR组成地延时
D0=1,D1=0。
// 亮灯2,关灯1
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
D1=1,D2=0。
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
D2=1,D3=0。
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
D3=1,D4=0。
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
D4=1,D5=0。
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
D5=1,D6=0。
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
D6=1,D7=0。
for(i=50。
i>0。
i-->
for(j=200。
j>0。
j-->。
}
}
程序二<用swich case语句编地)
#include<reg52.h>//51单片机地头文件. sbit d1=P1^0。
//
sbit d2=P1^1。
sbit d3=P1^2。
sbit d4=P1^3。
sbit d5=P1^4。
sbit d6=P1^5。
sbit d7=P1^6。
sbit d8=P1^7。
void main(>
{
unsigned int i=1,a,b。
while(1>//大循环
{
for(i=1。
i<15。
i++>
{
for(a=0。
a<80。
a++>//延时.
for(b=0。
b<200。
b++>。
switch(i>
{
case 1:
d2=1,d1=0,d8=1。
break。
case 2:
d1=1,d2=0。
break。
case 3:
d2=1,d3=0。
break。
case 4:
d3=1,d4=0。
break。
case 5:
d4=1,d5=0。
break。
case 6:
d5=1,d6=0。
break。
case 7:
d6=1,d7=0。
break。
case 8:
d7=1,d8=0。
break。
case 9:
d8=1,d7=0。
break。
case 10:
d7=1,d6=0。
break。
case 11:
d6=1,d5=0。
break。
case 12:
d5=1,d4=0。
break。
case 13:
d4=1,d3=0。
break。
case 14:
d3=1,d2=0。
break。
}
}。
}
}
程序三<最简洁地):
#include<reg52.h>
#include<intrins.h>//_crol_和_cror_地头文件. void delay(unsigned int z>//建立延时子函数. {
unsigned int i,j。
for(i=0。
i<z。
i++>
for(j=0。
j<200。
j++>。
}
void main(>
{
unsigned char d。
d=0xfe。
while(1>//
{
for(。
d>0x7f。
>
{
P1=d。
delay(100>。
//调用延时子函数延时.
d=_crol_(d,1>。
//循环左移.
}
for(。
d<0xfe。
>
P1=d。
delay(100>。
d=_cror_(d,1>。
//循环右移,让灯倒回去.
}
}
}
数码管流水灯:
#include<reg52.h>
#include<intrins.h>
void delay(unsigned int a>
{
unsigned int b。
b=a。
while(b>0>
b--。
}
void main(>
{
unsigned int i,j。
unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}。
//0x3f:为0,即数码管亮“0”.
P2=0。
//打开数码管地第一个,
P0=j。
//对数码管进行赋值
while(1>
{
i=0。
for(j=0。
j<16。
j++>
{
P2=i。
P0=A[j]。
delay(50000>。
i++。
}
}
}
数码管程序二:
#include<intrins.h>
void delay(unsigned int a>
{
unsigned int b。
b=a。
while(b>0>
b--。
void main(>
{
int i,j。
unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}。
P2=0。
P0=j。
while(1>
{
j=0。
for(i=0。
i<8。
i++>
{
P2=i。
P0=A[j]。
delay(50000>。
j++。
}
for(i=7。
i>=0。
i-->
{
P2=i。
P0=A[j]。
delay(50000>。
j++。
}
}
}
中断程序一
#include<reg52.h>
#include<intrins.h>
void delay(unsigned int a>
{
unsigned int b。
b=a。
while(b>0>
b--。
}
void main(>
{
int i,j。
unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}。
EA=1。
//打开总中断
EX0=1。
//打开外部中断0.
IT0=0。
//选择其为低电平有效有效.当CPU检测到P3.3引脚上出现有效地中断信号时,中断标志IE1(TCON.3>置1,向CPU申请中断.
P2=0。
P0=j。
P1=0xfe。
while(1>
{
j=0。
for(i=0。
i<8。
i++>
{
P2=i。
P0=A[j]。
delay(50000>。
j++。
}
for(i=7。
i>=0。
i-->
{
P2=i。
P0=A[j]。
delay(50000>。
j++。
}
}
}
void exist(> interrupt 0//中断子程序,其中“0”为外部中断地序号
{
P1=_crol_(P1,1>。
delay(50000>。
}
定时程序。
include<reg52.h>
unsigned int i=0,j=0,t。
unsigned code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}。
void main(>
{
TMOD=0x01。
//对TMOD赋值,以确定T0和T1地工作方式.
TH0=(65536-50000>/256。
TL0=(65536-50000>%256。
//定时/计数器地实质是加1计数器<16位),由高8位和低8位两个寄存器组成.对高8位和低8位赋值.
EA=1。
//开总中断
ET0=1。
//则对IE赋值,开放中断
TR0=1。
//使TR0或TR1置位,启动定时/计数器定时.
while(1>
{
if(t==20>
{
t=0。
if(j==8>
j=0。
if(i==16>
i=0。
P2=j。
P0=a[i]。
i++。
j++。
}
}
}
void time(> interrupt 1//定时子程序,其中“1”为定时/计数器序号 {
TH0=(65536-50000>/256。
TL0=(65536-50000>%256。
t++。
}。