求写一个单片机(AT89C51)C语言程序。

要求:1、控制8个LED灯依次闪烁,第1个亮了间隔1S熄灭,然后第2个亮间隔1S熄灭.....依次闪烁。
2、程序可以循环,也就是第8个灯熄灭了第个又亮。

用C啊,我想想:
1、和硬件有点儿关系,这个你清楚么?
2、假设LED连接到P1口吧。第一个灯接到P1.0。阴极接IO,阳极接5V。
#include <reg51.h>
bit SecFlag;
unsigned char mS;
void Display(unsigned char num,unsigned char sec)
{
num%=8;
P1=~(1<<num);
while(sec--!=0)
{
TR0=1;
while(SecFlag==0);SecFlag=0;
TR0=0;
}
}
main()
{
unsigned char i;
TMOD=1;IE=0x82;
while(1)
{
Display( (i++)%8,1);
}
}
void ISRT0(void) interrupt 1
{
TH0=(-50000)>>8;TL0=-50000;
mS++;
if(mS>20){mS=0;SecFlag=1;}//12MHz, 50mS定时中断,1秒计时。
}
你很容易扩展出任意要求的闪烁流水灯啦。
Display(2,1);
Display(1,1);
Display(3,2);
Display(1,2);
……放到while里面就好了。祝你玩得开心。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-24
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME0

ORG 30H
START:
MOV P1, #0FFH;Note:Hex立即数前必须补0
MOV 35H, #07FH

MOV 30H, #00H
MOV TMOD, #01H
MOV TH0, #0D5H;更改此处可以更改定时器高位,调节以实现1s
MOV TL0, #9FH;更改此处更改定时器地位,调节以实现1s(两者共同作用以实现1s)
SETB EA
SETB ET0
SETB TR0
LOOP:
AJMP LOOP

TIME0:
PUSH ACC
PUSH PSW
INC 30H
MOV A, 30H
CJNE A, #10, T_RET

T_L1:
MOV A, 35H;Note:必须移到ACC中才可以右移
RR A
MOV 35H, A
MOV P1, A
MOV 30H,#0

T_RET:
MOV TH0, #0D5H
MOV TL0, #9FH
POP PSW
POP ACC
RETI
END追问

C语言啊
不是汇编

第2个回答  2011-03-24
gvgvfghv2 这位仁兄的答案可以,只是我不喜欢在中断里面处理事情,因为中断时间总是很急的嘛,那就得注重效率咯,还有一种最愚蠢的方法,就是延时1s啊(一个效率最低的方法哈)
//选择12MHz晶振
//由P0.0~P0.7分别接8个LED,采用共阳极接法。
#include<at89x51.h>
#define uchar unsigned char
uchar time=0;

void timer0_init()
{
TMOD=0X01;
TL0=0XAF;
TH0=0X3C;
ET0=1;
EA=1;
}

void main()
{
timer0_init();
TR0=1;
P0=0XFE;
while(1)
{
if(time>=20)
{
time=0;
P0=(P0<<1)|1;
if(P0==0XFF)P0=0XFE;
}
}
}

void TIMER0_ISR() interrupt 1
{
TL0=0XAF;
TH0=0X3C;
time++;
}
第3个回答  2011-03-24
//选择12MHz晶振
//由P0.0~P0.7分别接8个LED,采用共阳极接法。
#include<at89x51.h>
#define uchar unsigned char

void timer0_init()
{
TMOD=0X01;
TL0=0XAF;
TH0=0X3C;
ET0=1;
EA=1;
}

void main()
{
timer0_init();
TR0=1;
P0=0XFE;
while(1);
}

void TIMER0_ISR() interrupt 1
{
static uchar time=0;
TL0=0XAF;
TH0=0X3C;
time++;
if(time>=20)
{
time=0;
P0=(P0<<1)|1;
if(P0==0XFF)P0=0XFE;
}
}

求一个单片机AT89C51的C语言程序 控制8个灯的 要求有中断程序 至少有两 ...
} else { P1=led; led=_cror_(led,1); } }}

求用单片机设计一个秒表AT89C51
ORG 0000H AJMP MAIN ORG 0003H AJMP X0_INT ORG 000BH AJMP T0_INT ORG 0013H AJMP X1_INT MAIN:MOV TMOD,#01H ;T0定时方式1 MOV TH0, #(65536-50000) \/ 256 ;50ms@12MHz MOV TL0, #(65536-50000) MOD 256;SETB TR0 SETB ET0 ;开启定时中断 SETB EX0 SET...

用C语言编写AT89C51单片机程序,设计一个智能数字钟。
这是我的课程设计,6个数码管,显示时分秒,三个按钮P0.0、P0.1、P0.2可以调时,有8个彩灯(可以不要),没闹钟、倒计时之类的。呵呵。include<AT89X52.H> define uchar unsigned char int i;\/\/***时钟的 uchar one[10]={0xbf,0xb0,0xdb,0xcf,0xe6,0xed,0xfd,0x07,0xff,0xef}...

单片机at89c51用C语言编写报警器
include<reg51.h>#define uchar unsigned charuchar time;sbit spk=P1^0;void t0isr() interrupt 1{TH0=t_h;TL0=t_l;spk=~spk;}void t1isr() interrupt 3{TH1=(65536-50000)\/256;TL1=(65536-50000)%256;time++;time%=6;if(time==0){t_h=(65536-500)\/256;t_l=(65536-500)%256;...

求C语言程序,AT89C51单片机为核心,DS18B20测温度,实时用4位LED显示...
\/\/温度正负标志 \/***ds1820程序***\/ void delay_18B20(unsigned int i) \/\/延时1微秒 { while(i--); }void ds1820rst() \/*ds1820复位*\/ { unsigned char x=0; DQ = 1; \/\/DQ复位 delay_18B20(4); \/\/延时 DQ = 0; \/\/DQ拉低 delay...

用C语言编写AT89C51单片机程序,设计一个智能数字钟。
sbit s4=P2^1; \/\/s4按键,减1 sbit led1=P0^0;sbit led2=P0^1;sbit led3=P0^2;uchar count;uchar sec,minu,hour,day,week,mon;uchar n_sec,n_minu,n_hour;uint year;uchar set_2=1,set_1=1;uchar hs,hg,mis,mig,ss,sg;uchar nhs,nhg,nms,nmg,nss=0,nsg=0;uchar ms,mg,...

AT89C51单片机,定时器1,50ms中断,用c语言写出初始化程序和中断函数程序...
include <reg51.h> void InitTimer1(void){ TMOD = 0x10;TH1 = 0x3C;TL1 = 0x0B0;EA = 1;ET1 = 1;TR1 = 1;} void main(void){ InitTimer1();} void Timer1Interrupt(void) interrupt 3 { TH1 = 0x3C;TL1 = 0x0B0;\/\/add your code here!} ...

单片机AT89C51用C语言编,两个按钮分别控制一个数码管加减数,最好用中...
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; \/\/0到f uchar dat;void ext0() interrupt 0 { dat++;dat%=10;P1=distab[dat];} ext1() interrupt 2 { if(dat>0)dat--;P1=disab[dat];} main(){ EX0=1;EX1=1;IT0=1;IT1=1;EA=1;while(1);} ...

用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键...
void t0isr() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;num++;if(num>=20){ num=0;sec++;} } main(){ TMOD=0x01;TH0=(65536-50000)\/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;LED1=0;LED2=0;while(1){ key=P1;if((key&0x0f)!=0x0f){ delay...

用C语言怎么在单片机AT89C51上编写一个延时10秒的程序?
1、十秒对于单片机来说是很长很长的时间了,单片机十秒的时间什么事都不能做,只在跑这延时程序,那是什么概念,用中断的话,单片机正常运行其他程序,只是时间到了才过来处理延时以后的程序,效率不知道高了多少 。2、例程:\/\/假设晶振12MHZ include "reg51.h"unsigned int YSJS=0;void main(void...

相似回答
大家正在搜