下面是小弟的一个89C52单片机通讯程序,现在8个灯都能亮,但是都是常亮!我想让每个都亮3S自动熄灭!

下面是小弟的一个89C52单片机通讯程序,现在8个灯都能亮,但是都是常亮!我想让每个都亮3S自动熄灭!,第1张

/

一个简单的程序被你写的这么复杂,代码写的很乱,你说你8个LED灯都能亮,

是一直长亮,不延时3s在灭掉,我只看到你程序里面打开LED没有看到关闭LED啊,

if(dat==0x31)

{

LED1=0; //点亮LED,没有看到那里关闭啊,

SBUF=0x61; //给上位机发生 0x61

while(TI == 0); //等待发送完成

TI = 0;

}

可以考虑写个延时3s程序,

LED = 0;点亮

Delay3s();延时

P1= 0xFF; 关闭LED

/

1、没必要通过24c02来存储设置的数据

2、89C52没有ADC,如果需要输入模拟量,请外接ADC

3、部分程序贴出。供大家参考:(全部程序请下载zip附件)

#include<REG52h>

#include<timerh>

#include<DigitalTubeh>

//中断0唤醒单片机 //开启单片机按键接P3^2;

//以下随意改,只要不与数码管数据冲突

sbit key_1 = P1^0; //关闭单片机

sbit key_2 = P1^1; //时间+

sbit key_3 = P1^2; //时间-

sbit key_4 = P1^3; //确认

#define Period 5 //每次加或减的时间(分钟)

sbit LAMP = P1^4; //台灯开关控制输入

bit confirm=0;

char time=40; //以分钟为单位,每次加Period分钟或减Period分钟

void menu(void)

{

if(key_1==0)

{

delay(10);

if(key_1==0)

{

delay(5);

while(key_1==0)delay(5);

PCON=0x02; //进入掉电模式

}

}

if(key_2==0)

{

delay(10);

if(key_2==0)

{

delay(5);

while(key_2==0)delay(5);

if(time<60)

{

time+=Period;

}

}

}

if(key_3==0)

{

delay(10);

if(key_3==0)

{

delay(5);

while(key_3==0)delay(5);

if(time>20)

{

time-=Period;

}

}

}

if(key_4==0)

{

delay(10);

if(key_4==0)

{

delay(5);

while(key_4==0)delay(5);

confirm=1;

}

}

}

void main(void)

{

IE=0x81; //开中断

IT0=1; //低电平触发

LAMP=1; //点亮台灯

PCON=0x02; //关闭单片机

while(1)

{

while(!confirm)

{

menu();

DigitalTube_disNum(0,time/10);

DigitalTube_disNum(1,time%10);

}

while(time>0)

{

time--;

delay(60000); //一分钟,误差有一点

}

LAMP=0; //关闭台灯

time=40;

confirm=0;

}

}

void Wakeup() interrupt 0 using 0  //中断唤醒单片机

{

unsigned char i = 0;

IE = 0x00;

delayMicroseconds(10);

while(i<4)

{

DigitalTube_disNum(i++,8);

}

IE = 0x81;

}

#include"timerh"

#if FOSC==12 //如果使用12MHz晶振

void delay(unsigned int ms)

{

unsigned int i;

for(;ms>0;ms--)

for(i=0;i<124;i++);

}

#else

void delay(unsigned int ms)

{

unsigned int i;

for(;ms>0;ms--)

for(i=0;i<=113;i++);

}

#endif

void delayMicroseconds(unsigned int us)

{

for(;us>4;us-=4);

}

#ifdef USE_MORE_DELAY

void delayminutes(unsigned int minute)

{

unsigned int i,j;

for(;minute>0;minute--)

for(i=0;i<125;i++)

for(j=0;j<60000;j++);

}

void delayday(unsigned int day)

{

   unsigned int i,j;

for(;day>0;day--)

for(i=0;i<3000;i++)

for(j=0;j>60000;j++);

}

#endif

#include"DigitalTubeh"

#define HIGH 0

#define LOW  1

#ifdef CO_CATHODE

#define N_0 0xC0

#define N_1 0xF9

#define N_2 0xA4

#define N_3 0xB0

#define N_4 0x99

#define N_5 0x92

#define N_6 0x82

#define N_7 0xF8

#define N_8 0x80

#define N_9 0x90

#endif

#ifdef CO_ANODE

#define N_0 0x3F

#define N_1 0x06

#define N_2 0x5B

#define N_3 0x4D

#define N_4 0x66

#define N_5 0x6D

#define N_6 0x7D

#define N_7 0x07

#define N_8 0x7F

#define N_9 0x6F

#endif

#if Seg_Number>7

#define SegLOW {Segment_7 = LOW;Segment_6 = LOW;Segment_5 = LOW;Segment_4 = LOW;Segment_3 = LOW;Segment_2 = LOW;Segment_1 = LOW;Segment_0 = LOW;}

#endif

#if Seg_Number>6

#ifndef SegLOW

#define SegLOW {Segment_6 = LOW;Segment_5 = LOW;Segment_4 = LOW;Segment_3 = LOW;Segment_2 = LOW;Segment_1 = LOW;Segment_0 = LOW;}

#endif

#endif

#if Seg_Number>5

#ifndef SegLOW

#define SegLOW {Segment_5 = LOW;Segment_4 = LOW;Segment_3 = LOW;Segment_2 = LOW;Segment_1 = LOW;Segment_0 = LOW;}

#endif

#endif

#if Seg_Number>4

#ifndef SegLOW

#define SegLOW {Segment_4 = LOW;Segment_3 = LOW;Segment_2 = LOW;Segment_1 = LOW;Segment_0 = LOW;}

#endif

#endif

#if Seg_Number>3

#ifndef SegLOW

#define SegLOW {Segment_3 = LOW;Segment_2 = LOW;Segment_1 = LOW;Segment_0 = LOW;}

#endif

#endif

#if Seg_Number>2

#ifndef SegLOW

#define SegLOW {Segment_2 = LOW;Segment_1 = LOW;Segment_0 = LOW;}

#endif

#endif

#if Seg_Number>1 

#ifndef SegLOW

#define SegLOW {Segment_1 = LOW;Segment_0 = LOW;}

#endif

#endif

#if Seg_Number>0

#ifndef SegLOW

#define SegLOW {Segment_0 = LOW;}

#endif

#endif

unsigned int i = 0;

void DigitalTube_disNum(unsigned char seg_Number,unsigned char Data)

{

switch(Data)

{

case 0: SegData_Port = N_0;break;

case 1: SegData_Port = N_1;break;

case 2: SegData_Port = N_2;break;

case 3: SegData_Port = N_3;break;

case 4: SegData_Port = N_4;break;

case 5: SegData_Port = N_5;break;

case 6: SegData_Port = N_6;break;

case 7: SegData_Port = N_7;break;

case 8: SegData_Port = N_8;break;

case 9: SegData_Port = N_9;break;

}

SegLOW

switch(seg_Number)

{

#if Seg_Number>7

case 7:Segment_7 = HIGH;break;

#endif

#if Seg_Number>6

case 6:Segment_6 = HIGH;break;

#endif

#if Seg_Number>5

case 5:Segment_5 = HIGH;break;

#endif

#if Seg_Number>4

case 4:Segment_4 = HIGH;break;

#endif

#if Seg_Number>3

case 3:Segment_3 = HIGH;break;

#endif

#if Seg_Number>2

case 2:Segment_2 = HIGH;break;

#endif

#if Seg_Number>1

case 1:Segment_1 = HIGH;break;

#endif

#if Seg_Number>0

case 0:Segment_0 = HIGH;break;

#endif

}

while(i++<30);i=0; //一点点延时,保障数码管不闪烁也不缺段

}

主函数不完整,你这样写主函数运行完还没等到中断程序就退出去了。在主函数最下面加一个while(1);就可以了,酱紫:

void main()

{

t0=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

while(1);

}

另:num最好处理一下,要不然增加到256就会溢出了。

#include <REG52H>

#include <INTRINSH>

//本例采用89C52, 晶振为110592MHZ

//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码

//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;

//所以拿出谱子, 试探编吧!

sbit Beep = P1^5 ;

unsigned char n=0; //n为节拍常数变量

unsigned char code music_tab[] ={

0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,

0x20, 0x40, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x10,

0x1C, 0x10, 0x18 , 0x40,

0x1C, 0x20, 0x20 , 0x20,

0x1C, 0x20, 0x18 , 0x20,

0x20, 0x80, 0xFF , 0x20,

0x30, 0x1C, 0x10 , 0x18,

0x20, 0x15, 0x20 , 0x1C,

0x20, 0x20, 0x20 , 0x26,

0x40, 0x20, 0x20 , 0x2B,

0x20, 0x26, 0x20 , 0x20,

0x20, 0x30, 0x80 , 0xFF,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x80,

0x20, 0x30, 0x1C , 0x10,

0x20, 0x10, 0x1C , 0x10,

0x20, 0x20, 0x26 , 0x20,

0x2B, 0x20, 0x30 , 0x20,

0x2B, 0x40, 0x20 , 0x15,

0x1F, 0x05, 0x20 , 0x10,

0x1C, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x30,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x40, 0x1C , 0x20,

0x20, 0x20, 0x26 , 0x40,

0x13, 0x60, 0x18 , 0x20,

0x15, 0x40, 0x13 , 0x40,

0x18, 0x80, 0x00

};

void int0() interrupt 1 //采用中断0 控制节拍

{ TH0=0xd8;

TL0=0xef;

n--;

}

void delay (unsigned char m) //控制频率延时

{

unsigned i=3m;

while(--i);

}

void delayms(unsigned char a) //豪秒延时子程序

{

while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!

}

void main()

{ unsigned char p,m; //m为频率常数变量

unsigned char i=0;

TMOD&=0x0f;

TMOD|=0x01;

TH0=0xd8;TL0=0xef;

IE=0x82;

play:

while(1)

{

a: p=music_tab[i];

if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍

else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符

else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数

TR0=1; //开定时器1

while(n!=0) Beep=~Beep,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)

TR0=0; //关定时器1

}

}

你参考这个吧

以上就是关于下面是小弟的一个89C52单片机通讯程序,现在8个灯都能亮,但是都是常亮!我想让每个都亮3S自动熄灭!全部的内容,包括:下面是小弟的一个89C52单片机通讯程序,现在8个灯都能亮,但是都是常亮!我想让每个都亮3S自动熄灭!、求单片机大神!用89c52单片机实现智能台灯程序!、89c52单片机T0定时器中断程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9272745.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存