我在用单片机编程,怎么才能使万年历和蜂鸣器同时运行。用的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;
}
}
...全文
361 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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是单线程的,万年历子函数和蜂鸣器子函数是交替切换运行的,蜂鸣器子函数执行很快,万年历子函数也不慢,主函数中运行后,效果给人的感觉应该是同时运行的
01-LedTest -- 实现LED按照一定频率闪烁。主要用来测试LED工作是否正常。P10要接通。 02-CrossLed -- 实现花灯显示。主要学习对软件延时的使用。P10要接通。 03-FlowRight -- 实现流水灯,方向是从左向右。主要学习在C语言里如何实现准确的位操作。P10要接通。 04-FlowLeft -- 实现流水灯,方向是从右向左。主要学习在C语言里如何实现准确的位操作。P10要接通。 05-button -- 独立按键测试,实现按哪个按键然后使用对应LED显示。实现按键的检测和LED的控制。拨码开关要打到OFF位置。 06-boma -- 用LED显示拨码状态。不可以按按键。 07-Relay -- 继电器测试程序,并有LED指示同时伴有蜂鸣器的声音。P8纵向连接上面2个。 08-music -- 用C语言演奏生日快乐歌,使用软件定时。使用软件定时演奏生日快乐歌。P8纵向连接上面2个。 09-musicasm -- 用汇编语言演奏一首民歌,使用硬件定时。主要学习51定时器汇编语言编写中断功能,和如何编写中断服务程序。P8纵向连接上面2个。 10-music2 -- 用C语言中断演奏。主要学习在C语言中定义51内部定时器中断服务程序。P8纵向连接上面2个。 11-disp1234 -- 采用软件延时在数码管上显示1234ABCD。这是比较普遍的数码管显示。P14接通 12-disp1234int -- 采用硬件延时在数码管上显示1234ABCD。利用中断可以节约资源,这个程序比10更好。P14接通 13-adddec -- 使用两个按键S22,S23控制数码管上显示的数加减,具有去抖动功能。主要讲如何进行数码管动态显示并且怎样对键盘去抖动。P14接通。 14-time -- 15-alarm -- 综合实验,实现倒计时结束时使用蜂鸣器报警,编程技巧的组合。P8纵向连接上面2个。 16-uart -- UART发送和接收,实现从PC发送到单片机任何字母和数字,单片机立即向PC发送同样的字母数字可以由超级终端或者串口调试助手调试。 17-uartint -- UART接收采用不占用资源的中断接收,其余同16。推荐使用串口中断方式,使用查询方式太占用资源。 18-18b20 -- 使用温度传感器18B20测温度,并用数码管显示。P14接通。 19-1602 -- 使用LCD1602显示字符。LCD1602接到P4,方向和板子方向相反。 20-24c08 -- 对24c08进行写读操作。并把写进和读到的数用LED显示。P8纵向连接下面2个。 21-matrix -- 调试矩阵键盘,对应LED亮。注意,本程序执行需要把拨码开关打到OFF状态,程序只有矩阵键盘前两行显示,后两行请自行添加代码。 22-DS1302 -- 使用DS1302时钟芯片对预制的时间进行计时。P9横向连接左边两个。 23-chibang -- 演奏《飞舞翅膀的女孩》等音乐的综合程序。 24-wannianli -- 综合程序,用DS1302,LCD1602,温度传感器等板上设备做一个万年历。LCD1602要正确连接,P9横向连接左边两个。使能DS1302。独立按键从左到右功能为,选择设置/加/减/确定,由于去抖动功能和LCD响应时间问题,所以要按时间稍微长一点。 25-demo -- 使用RS-232实现PC与51之间通信,详细操作方法请见相关教程。 26-remote -- 红外功能测试程序,使用普通遥控器和红外接收头协同工作,用板上LED显示接收状态,LED_EN跳线必须接通,否则观察不到LED状态。 27-1602-scroll -- LCD1602动态字幕显示,方便用户理解1602的用户指令集。有时程序不正常,则为LCD1602的RAM没有清空所致,必须给板子重新上电,并按一次复位键。 28-12864 -- LCD12864显示程序。AT89S5x系列单片机需要摘掉LCD下载程序,下载完毕后插上LCD,并按复位键才可以正常显示,带着LCD下载程序会失败。STC单片机则无此问题。 29-12864-pic -- LCD12864的汉字,图形,半屏,反白及动态显示测试程序。注意事项同28。 30-adc0832 -- 扩展ADC0832调试程序,具体扩展口请见程序内说明。

13,871

社区成员

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

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