89C51. p2口控制8个LED灯,正常运行时循环右移,中断(INT1)时,8个LED灯闪

作者&投稿:代点 (若有异议请与网页底部的电邮联系)
使用AT89C51设计一个接在p2口的8个led从左到右循环依次点亮~

这是一个很简单的控制单片机端口的程序,估计老师要求用定时器的吧

提问的时候没说具体要求,所以只好给出一个利用定时器来完成的流水灯程序

定时时间为一秒,即1000毫秒,可根据实际需要进行修改

星号是各个函数间的分隔符号,不喜欢可以删除,程序如下:
/***************************************************************************/
#include //通用89C52头文件
char LD[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED流水灯编码
int n,t;
/***************************************************************************/
void main(void)//主函数
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化

while(1)
{
P2=LD[t];//状态输出
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;t++;}//如果达到一秒
if(t>7){t=0;}//如果达到24小时,小时清零
}
/***************************************************************************/

#include //头文件声明 //
#define uint unsigned int
#define uchar unsigned char
sbit wela=P1; // P1口控制各数码管的数据发送数据 //
sbit key1=P3^2;
uchar num;
uchar num1;
uchar num2;
uchar num3;
uchar num4; //计数为NUM,num1为个位,num2为十位....//
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //计数数字在数码管上的显示(数码管是8位的..) //
void delay(uint z);
void liushui();
void main()
{
EA=1;//开总中断 //
EX0=1;//开外部中断0 3.2口,默认的是电平触发方式,如果需要用跳变沿触发,请设置下,INT0为P3.2口//
num1=0;
num2=0;
num3=0;
num4=0;
while(1) //程序大循环//
{

wela=0x80;
delay(100); //选择个位,显示0 wela为 P0口,锁存器的选择,将数据发送到不同的锁存器锁存 //
P3=table[num1];
delay(100);
wela=0x40;
delay(100); //选择十位,显示0 //
P3=table[num2];
delay(100);
wela=0x20;
delay(100); //选择百位,显示0 //
P3=table[num3];
delay(100);
wela=0x10;
delay(100); //选择千位,显示0 //
P3=table[num4];
delay(100);
liushui(); //调用流水灯函数
num1=num1++; //判断数码管的显示方式
if (num1>9)
{
num2++;
num1=0;
if (num2>9)
{
num3++;
num2=0;
if(num3>9)
{
num4++;
num3=0;
if(num4>9)
{
num1=0 ;
num2=0 ;
num3=0 ;
num4=0 ;
}


}
}
}



}
}
void liushui() //子程序
{
P1=0x01 ;
delay (200);
P1=0x03 ;
delay (200);
P1=0x07 ;
delay (200);
P1=0x0F ;
delay (200);
P1=0x1F ;
delay (200);
P1=0x3F ;
delay (200);
P1=0x7F ;
delay (200);
P1=0xFF ;
delay (200);
P1=0X00;
delay (400);

}
void delay(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void exit0() interrupt 0 //中断服务程序
{

P1=0x80 ;
delay (200);
P1=0xC0 ;
delay (200);
P1=0xE0 ;
delay (200);
P1=0xF0 ;
delay (200);
P1=0xF8 ;
delay (200);
P1=0xFC ;
delay (200);
P1=0xFE ;
delay (200);
P1=0xFF ;
delay (200);
P1=0X00;
delay (400);
num1=num1--;
if (num1<1);
{ if(num2<1);
{
if(num3<1);
{


num4--;
num3=9;

}
num3--;
num2=9;
}



num2--;
num1=9;

}

wela=0x80;
delay(100);
P3=table[num1];
delay(100);
wela=0x40;
delay(100);
P3=table[num2];
delay(100);
wela=0x20;
delay(100);
P3=table[num3];
delay(100);
wela=0x10;
delay(100);
P3=table[num4];
delay(100);

}
你不会再QQ问问上也问了的吧,怎么那么像?http://wenwen.soso.com/z/q250236048.htm
把中断服务程序改一下~~就可以用了

ORG 0000h
AJMP main
ORG 000bh
AJMP int_timer
ORG 0030h
main: MOV tmod,#01h ;设置定时器工作方式寄存器。
MOV th0,#high(65536-10000) ;
MOV tl0,#low(65536-10000) ;设10MS初始值。
MOV ie,#82h ;设置中断允许寄存器
MOV 30h,#10 ;
MOV 31h,#6 ;30H和31H是两个软件计数器。
SETB tr0 ;启动定时
AJMP $ ;原地踏步

int_timer: ;定时器0中断服务程序。
MOV th0,#high(65536-10000) ;
MOV tl0,#low(65536-10000) ;重设10MS定时。
DJNZ 30h,l1 ;
MOV 30h,#10 ;
DJNZ 31h,l1 ;
MOV 31h,#6 ;软件计数
CPL p2.0 ;10*6*10MS=600MS时间到,P1.1取反
l1: RETI ;中断返回
END
很简单吧 ,改一点就ok了。

参考:

http://hi.baidu.com/do_sermon/item/f5e0851aee2af64ce65e065b


贵南县15249248732: 使用AT89C51设计一个接在p2口的8个led从左到右循环依次点亮 -
双眨全威: 这是一个很简单的控制单片机端口的程序,估计老师要求用定时器的吧提问的时候没说具体要求,所以只好给出一个利用定时器来完成的流水灯程序定时时间为一秒,即1000毫秒,可根据实际需要进行修改星号是各个函数间的分隔符号,不...

贵南县15249248732: 用AT89C51单片机的P2口控制8个Led的流水灯的C程序看不懂? -
双眨全威: #include void Delay1ms(unsigned int count) /*延时函数,延迟时间为count*1ms)*/{ unsigned int i,j; for(i=0;i<count;i++...

贵南县15249248732: 用AT89C51单片机控制8个Led的流水灯的C程序看不懂 -
双眨全威: #include<reg51.h> 包含单片机专用头文件 #include<intrins.h> 这个是什么俺也不知道,但这个程序不需要这个头文件 void Delay10ms(unsigned int c); 自定义的延时函数声明 main() 主函数 {unsigned int LED; 建立一个数值型变量,变量名...

贵南县15249248732: 单片机89c51 8个开关倒着控制8个灯 这个图跪求程序 -
双眨全威: 这图还真不好看懂,大概齐吧,程序如下: #include #define uchar unsigned char main() {uchar key,tmp,i;P2=0xff;P1=0xff;while(1){key=P1;tmp=0x00;for(i=0;i {if(key&0x01)tmp|=0x01;tmp key>>=1;}P2=tmp;} }

贵南县15249248732: 51单片机用汇编语言实现八个LED的全亮全灭 -
双眨全威: ;以89c51单片机为例,假定用P1控制LED: IO_LED EQU P1; led_0 BIT P1.0; led_1 BIT P1.1; led_2 BIT P1.2; led_3 BIT P1.3; led_4 BIT P1.4; led_5 BIT P1.5; led_6 BIT P1.6; led_7 BIT P1.7;;定义开关LED的数据,假定LED正极一端接电源,...

贵南县15249248732: 用89c51单片机控制8颗灯,从中间那里开始向两变移动一颗颗点亮,c程序应该怎么写? -
双眨全威: led_on(led_number/2); for (i=; i{ led_on(i); led_on((led_number - i); } led_on 是点灯函数.led_number是灯的总数

贵南县15249248732: 89C51. p2口控制8个LED灯,正常运行时循环右移,中断(INT1)时,8个LED灯闪 -
双眨全威: 参考:http://hi.baidu.com/do_sermon/item/f5e0851aee2af64ce65e065b

贵南县15249248732: 哪位大虾帮帮我用AT89C51单片机控制8个Led的流水灯的单片机程序 希望是能够仿真运行的啊!急求 -
双眨全威: 你的LED用错模型了,要用LED-RED 那几个后面带颜色的.#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char uchar i,j; void delay(uint ms) {uchar k; while(ms--)for(k=0;k<123;k++); } void main() { while(1) ...

贵南县15249248732: 为什么我用89c52单片机P2口点亮8个LED左移,在开发板上可以.在我自己焊接的板上就不行了(焊接没错). -
双眨全威: 可能是你的口焊的不同,led灯你焊到P1口,要在P1口上赋值,P2口上要在P2口上赋值,检查一下你的led灯的接口看是和单片机那个口连起来的,或者你的LED灯的正负极焊反了,或者你中间没加电阻或电阻失效了.细心检查一下,查看原理图,一下子就清楚了.

贵南县15249248732: 单片机89c51将8只LED实现2种闪烁效果,8个发光二极管依次点亮和交替亮灭 求各位大大 程序和流程图怎么画 -
双眨全威: 你好:电路结构这样就够了,接下来需要程序去支持.因为现在使用手机回答,程序我没法给,但是你可以先到我百度空间里,最近的一篇文章叫单片机编程,里边我有写各种LED亮灭的程序和设计原理;如果不是你需要的,那你回复我,我帮你做.希望我的回答能帮助到你.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网