我在用单片机编程,怎么才能使万年历和蜂鸣器同时运行。用的89C51芯片,C语言!求解答

c250987998 2015-01-04 03:33:20
我写的程序如下 不知道怎么修改 求教大神
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
void time();
void player();
uchar top[]={0,0,0,0,':',0,0,':',0,0};
uchar tab[]={0,0,':',0,0,':',0,0};
uchar count=0,month=1,day=1,hour=0,minite=0,second=0;
uchar k,n,m;
uint year=2015;
uchar num=0;
sbit rs=P2^4;
sbit re=P2^5;
sbit key_H=P1^0;
sbit key_M=P1^1;
sbit key_D=P1^2;
sbit key_MON=P1^3;
sbit key_Y=P1^4;
sbit BUZZER=P1^5;
sbit key_S=P3^2;
sbit key_T=P3^3;
uint code table[16]={65521,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};
uchar code music[32]={8,0,8,9,8,0xB,0xA,0,8,0,8,9,8,0xC,0xB,0,8,0,8,0xF,0xD,0xB,0xA,9,0xE,0,0xE,0xD,0xB,0xC,0xB,0x0};
uchar code music_L[32]={2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4};
uchar code music1[40]={4,5,6,4,4,5,6,4,6,7,8,0,6,7,8,0,8,0,9,8,0,7,6,4,8,0,9,8,0,7,6,4,8,1,4,0,4,8,4,0};
uchar code music_L1[40]={4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1,1,2,1,1,4,4,2,1,1,2,1,1,4,4,4,4,4,4,4,4,4,4};
uint temp;
uchar a,b;

void delay(uint v)
{
while(v!=0) v--;
}
void delay1(uint j)
{
while(j!=0){j--;delay(200);}
}
void delay2(uint j)
{
while(j!=0){j--;delay1(80);}
}
void Tdelay(uint x)
{
ulong a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--)
{;}
}
void wzhiling(uchar zhiling)
{
rs=0;
re=0;
Tdelay(1);
P0=zhiling;
Tdelay(2);
re=1;
Tdelay(2);
re=0;
}
void wshuju(uchar shuju)
{
rs=1;
re=0;
Tdelay(2);
P0=shuju;
Tdelay(2);
re=1;
Tdelay(2);
re=0;
}
void INIT( )
{
wzhiling(0x38);
Tdelay(1);
wzhiling(0x0c);
Tdelay(1);
wzhiling(0x06);
Tdelay(1);
wzhiling(0x01);
Tdelay(1);
}
void Time0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count>=20)
{
count=0;
second++;
}
}
time1 () interrupt 3 using 3
{
TH1=a;
TL1=b;
BUZZER=!BUZZER;
}
void main()
{
while(1)
{
player();
time();
}
}
void time()
{ EA=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
IT0=1;
TR0=1;
INIT( );
while(1)
{
if(second==60)
{
{
minite++;
second=0;
}
if(minite==60)
{
{
hour++;
minite=0;
}
if(hour==24)
{
{
hour=0;
minite=0;
second=0;
day++;
}
if(day==30)
{
{
month++;
day=0;
}
if(month==12)
{
{
year++;
month=0;
}
}
}
}
}
}
if(key_M==0)
{
EA=0;
Tdelay(1);
if(key_M==0)
{while(key_M==0);
minite++; }
EA=1;
}
if(key_H==0)
{
EA=0;
Tdelay(1);
if(key_H==0)
{while(key_H==0);
hour++;}
EA=1;
}
if(key_D==0)
{
EA=0;
Tdelay(1);
if(key_D==0)
{while(key_D==0);
day++;}
EA=1;
}
if(key_MON==0)
{
EA=0;
Tdelay(1);
if(key_MON==0)
{while(key_MON==0);
month++;}
EA=1;
}
if(key_Y==0)
{
EA=0;
Tdelay(1);
if(key_Y==0)
{while(key_Y==0);
year++;}
EA=1;
}
top[8]=0x30+day/10;
top[9]=0x30+day%10;
top[5]=0x30+month/10;
top[6]=0x30+month%10;
top[0]=0x30+year/1000;
top[1]=0x30+year%1000/100;
top[2]=0x30+year%1000%100/10;
top[3]=0x30+year%10;
tab[6]=0x30+second/10;
tab[7]=0x30+second%10;
tab[3]=0x30+minite/10;
tab[4]=0x30+minite%10;
tab[0]=0x30+hour/10;
tab[1]=0x30+hour%10;
for(num=0;num<10;num++)
{
wzhiling(0x80+0x00+num);
wshuju(top[num]);
}
for(num=0;num<8;num++)
{
wzhiling(0x80+0x40+num);
wshuju(tab[num]);
}
}
}
void player()
{
TMOD=0x10;
ET1=1;
TR1=1;
IT0=1;
IT1=1;
if(key_S==0)
{
EA=1;
for(k=0;k<32;k++)
{
n=music[k];
m=music_L[k];
temp=table[n];
a=temp/256;
b=temp%256;
delay2(m);
if(key_T==0)
{EA=0;break;}
}
EA=0;
}
if(key_T==0)
{ EA=1;
for(k=0;k<40;k++)
{
n=music1[k];
m=music_L1[k];
temp=table[n];
a=temp/256;
b=temp%256;
delay2(m);
if(key_S==0)
{EA=0;break;}
}
EA=0;
}
}
...全文
352 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小要饭 2015-03-06
  • 打赏
  • 举报
回复
教你个最简单的办法: 将蜂鸣器换成有源驱动的.不要为自己找麻烦.
wirner 2015-01-06
  • 打赏
  • 举报
回复
引用 4 楼 yanzhifei 的回复:
[quote=引用 3 楼 wirner 的回复:] 高校的教育一直沿用89C51,说来也奇怪,这个芯片到现在还能买到? 现在都ARM架构了。
一个stc89c51片子3块钱左右,一个arm多少钱?做硬件要考虑成本和销售价格以及消费者的价格承受能力。[/quote] 我是站在学习的角度说问题,如果站在硬件设计角度看问题: 几毛的51都有,stc89c51 买3块,说明渠道不行。
hyz_cs 2015-01-06
  • 打赏
  • 举报
回复
引用 4 楼 yanzhifei 的回复:
[quote=引用 3 楼 wirner 的回复:] 高校的教育一直沿用89C51,说来也奇怪,这个芯片到现在还能买到? 现在都ARM架构了。
一个stc89c51片子3块钱左右,一个arm多少钱?做硬件要考虑成本和销售价格以及消费者的价格承受能力。[/quote] arm也有便宜的,比如下面这上,零售也才2.2元. 型号 STM32F030F4P6 内核 ARM CORTEX-M0 CPU最高速度 48 MHz Flash 16 KB RAM 4 KB 工作温度范围 -40 ~ +85℃
shinerise 2015-01-06
  • 打赏
  • 举报
回复
另外客观说,51的硬件体系结构实在太弱了,很多硬件功能 不完善,价格上也并不比cotex的arm有多大优势。能学一下新的体系架构的MCU,还是换一个吧,毕竟51实在太老了。
shinerise 2015-01-06
  • 打赏
  • 举报
回复
加一个μ内核吧,想qp nano这种,只是一个状态机的frame work,可以让编程人员用类似OS的想法,设计多“线程”程序,像并行那样。也很简单,全是C代码。很适合单片机之类的处理器使用。
c250987998 2015-01-06
  • 打赏
  • 举报
回复
引用 7 楼 qq_21881145 的回复:
小伙子不错嘛,不要怕,期末老师我不得挂你
程极 你会被点的
c250987998 2015-01-06
  • 打赏
  • 举报
回复
引用 2 楼 sunxingzhesun 的回复:
两个子函数有点长,你可以把万年历的一些语句放到定时器中断中,蜂鸣器的切换在中断3中很短,这个执行时间可以忽略,在函数和中断的语句数量上处理一下
谢谢啊 我试试 新手才学 以后希望多帮助!!!
qq_21881145 2015-01-06
  • 打赏
  • 举报
回复
小伙子不错嘛,不要怕,期末老师我不得挂你
yanzhifei888 2015-01-06
  • 打赏
  • 举报
回复
为什么非要用一个?蜂鸣器加一个89c2052呗
yanzhifei888 2015-01-06
  • 打赏
  • 举报
回复
引用 3 楼 wirner 的回复:
高校的教育一直沿用89C51,说来也奇怪,这个芯片到现在还能买到? 现在都ARM架构了。
一个stc89c51片子3块钱左右,一个arm多少钱?做硬件要考虑成本和销售价格以及消费者的价格承受能力。
wirner 2015-01-05
  • 打赏
  • 举报
回复
高校的教育一直沿用89C51,说来也奇怪,这个芯片到现在还能买到? 现在都ARM架构了。
  • 打赏
  • 举报
回复
两个子函数有点长,你可以把万年历的一些语句放到定时器中断中,蜂鸣器的切换在中断3中很短,这个执行时间可以忽略,在函数和中断的语句数量上处理一下
  • 打赏
  • 举报
回复
51是单线程的,万年历子函数和蜂鸣器子函数是交替切换运行的,蜂鸣器子函数执行很快,万年历子函数也不慢,主函数中运行后,效果给人的感觉应该是同时运行的

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧