
/
一个简单的程序被你写的这么复杂,代码写的很乱,你说你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定时器中断程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)