}
}
}
//----------------------------------------------按键中断初始化函数
voidInitKey_INTKR(void){
PM4=0x3F;//端口4的位5到位0为输入端口
PU4=0x3F;//端口4的位5到位0使用内部上拉电阻
KRM=0x3F;//设置每个按键按下都会产生按键中断信号
KRMK=0;//按键中断允许
PM3.0=1;//接按键的引脚P30设为输入模式
PU3.0=1;//接按键的引脚P30设为使用内部上拉电阻
EGP.5=1;//外部中断INTP5的上升沿有效
PMK5=0;//INTP5中断允许
}
//-----------------------------------------------接收中断函数
voidMD_INTSR0(void){
rbuffer2=RXB0;//接收数据寄存器中的数放到rbuffer2
}
//-----------------------------------------------发送中断函数
voidMD_INTST0(void){
TXE0=0;//uart0不允许发送
}
//--------------------------------------------INTP5中断函数
voidOnKeyOver(){
DI();//关中断
Que=0;//将Que置0关闭所有音乐函数
EI();//开中断
}
//------------------------------------------------按键中断函数
voidOnKeyPress(){
DI();//关中断
switch(P4&0x3F){//检测P4端口位5到位0的值
case0x3E:
rbuffer1=0x32;//将十进制2放到变量rbuffer1中
TXE0=1;//uart0允许发送
TXS0=rbuffer1;//将变量rbuffer1中的数据送入TXS0寄存器中
break;
case0x3D:
rbuffer1=0x33;//将十进制3放到变量rbuffer1中
TXE0=1;//uart0允许发送
TXS0=rbuffer1;//将变量rbuffer1中的数据送入TXS0寄存器中
break;
case0x3B:
rbuffer1=0x34;//将十进制4放到变量rbuffer1中
TXE0=1;//uart0允许发送
TXS0=rbuffer1;//将变量rbuffer1中的数据送入TXS0寄存器中
break;
case0x37:
rbuffer1=0x35;//将十进制5放到变量rbuffer1中
TXE0=1;//uart0允许发送
TXS0=rbuffer1;//将变量rbuffer1中的数据送入TXS0寄存器中
break;
case0x2F:
rbuffer1=0x36;//将十进制6放到变量rbuffer1中
TXE0=1;//uart0允许发送
TXS0=rbuffer1;//将变量rbuffer1中的数据送入TXS0寄存器中
break;
case0x1F:
rbuffer1=0x37;//将十进制7放到变量rbuffer1中
TXE0=1;//uart0允许发送
TXS0=rbuffer1;//将变量rbuffer1中的数据送入TXS0寄存器中
break;
default:
break;
}
EI();
}
//-----------------------------------------------串口通信硬件初始化函数
voidInitUart(){
ASIM0=0x05;//数据格式:
无校验8位数据1位停止
BRGC0=0xCD;//波特率为9600
POWER0=1;//启动uart0功能
RXE0=1;//uart0接收允许
SRIF0=0;//清除UART接收中断请求标志
STIF0=0;//清除UART发送中断请求标志
SRMK0=0;//清除UART接收中断屏蔽标志
STMK0=0;//清除UART发送中断屏蔽标志
PF1.3=1;//定义P13引脚作为TxD0引脚
PM1.3=0;//P1端口的位3为输出模式
}
//-----------------------------------------------定时器初始化函数
voidTimerInit(void){
PRM00=0x01;//计数时钟为f/2(f为主系统时钟)
CRC00=0x00;//CR000为比较寄存器
TOC00=0x03;//CR000与TM00相等时TO00输出允许翻转
CR000=0x11C1;//CR000寄存器初值为0x11C1
PM3.3=0;//端口PM3.3为输出端口
}
//----------------------------------------------INTTM000中断初始化函数
voidINTTM000(void){
TMMK000=0;//INTTM000中断允许
TMPR000=1;//INTTM000中断优先级为1
}
//----------------------------------------------INTTM000中断函数
voidMD_INTTM000(){
Num-=1;//Num值减1
P3.3=!
P3.3;//蜂鸣器打开或关闭
}
//----------------------------------------------音乐中音发音函数
voidflat(intx,inty){
Num=y*freq_b[x]/2;//将音符频率的一半与发音时长的乘积放在Num变量中
TMC00&=0xf3;//TM00与CR000相等时定时器输出(TO00)反转
CR000=regSet_b[x];//将音符频率放入CR000寄存器中
TMC00|=0x0c;//TM00与CR000相等时进入清零
while(Num>0&&Que){}//判断发音是否结束
}
//----------------------------------------------音乐高音发音函数
voidup(intx,inty){
Num=y*freq_c[x]/2;//将音符频率的一半与发音时长的乘积放在Num变量中
TMC00&=0xf3;//TM00与CR000相等时定时器输出(TO00)反转
CR000=regSet_c[x];//将音符频率放入CR000寄存器中
TMC00|=0x0c;//TM00与CR000相等时进入清零
while(Num>0&&Que){}//判断发音是否结束
}
//----------------------------------------------音乐低音发音函数
voiddown(intx,inty){
Num=y*freq_a[x]/2;//将音符频率的一半与发音时长的乘积放在Num变量中
TMC00&=0xf3;//TM00与CR000相等时定时器输出(TO00)反转
CR000=regSet_a[x];//将音符频率放入CR000寄存器中
TMC00|=0x0c;//TM00与CR000相等时进入清零
while(Num>0&&Que){}//判断发音是否结束
}
//----------------------------------------------音乐静音函数
voidsilent(inty){
Num=y*131;
TMC00&=0xf3;//TM00与CR000相等时定时器输出(TO00)反转
CR000=7633;
TMC00|=0x0c;//TM00与CR000相等时进入清零
while(Num>0&&Que){}
}
//-----------------------------------------------音乐结束函数
voidstop(void){
PM3.3=1;//蜂鸣器关闭
TMC00&=0xf3;
}
//----------------------------------------------乐谱函数
voidmusic(){
flat(3,4);flat(5,3);flat(6,1);up(1,3);up(2,1);flat(6,1);up(1,1);flat(5,2);
up(5,3);up(1,1);up(6,1);up(5,1);up(3,1);up(5,1);up(2,5);silent(0.5);
up(2,2);up(2,1);up(3,1);flat(6,2);flat(6,2);flat(5,3);flat(6,1);
up(1,2);up(2,2);flat(3,2);up(1,2);flat(6,1);flat(5,1);flat(6,1);up(1,1);
flat(5,8);
up(3,3);up(5,1);flat(6,2);up(2,2);flat(6,1);up(1,1);flat(5,4);
flat(3,1);flat(5,1);flat(3,2);flat(5,1);flat(6,1);flat(6,1);
up(2,1);flat(6,5);flat(6,1);
flat(5,1);flat(6,1);up(1,3);up(2,1);up(5,2);up(3,2);up(2,2);
up(3,1);up(2,1);up(1,2);flat(6,1);flat(5,1);
flat(3,4);up(1,4);
flat(6,1);up(1,1);flat(6,1);flat(5,1);flat(3,1);flat(5,1);
flat(6,1);up(1,1);flat(5,8);
stop();
}
//---------------------------------------------音乐播放函数
voidsong_1(){
unsignedinti;
DI();//关中断
INTTM000();//INTTM000中断初始化函数
TimerInit();//定时器初始化函数
EI();//开中断
music();//调用乐谱函数
}
voidmain(){
InitUart();//初始化串口通信硬件
InitKey_INTKR();//初始化按键中断函数
EI();//开中断
while
(1){
if(rbuffer2==0x38){//如果接收的数据为8,则音乐响起
rbuffer2=0;//置rbuffer2为0
song_1();//调用歌曲函数
}
Que=1;//置Que为1
}
}
PC机源代码
1.Form1程序代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.IO.Ports;
usingSystem.Threading;
usingSystem.Collections;
namespacepc
{
publicpartialclassForm1:
Form
{
stringstr;//用于保存接收到的串口数据
intmonth1=2;//判断该年的第二个月是多少天
intyear1=2014;//该年份是闰年还是平年
inttemp;//判断当前月的天数
Form2fm2=newForm2();
Form3fm3=newForm3();
inta=0;
intb=0;//判断form2和form3的中间变量
intc=0;
intk=1;//判断闹钟是否关闭
staticStringh,m;//闹钟时间传值
stringc_Time;//闹钟时和分的和
strings_Time;
//主程序入口
publicForm1()
{
InitializeComponent();
fm2.textBoxes1=textBoxes1;
timer1.Start();
}
//初始化Form1时间为系统当前时间
privatevoidForm1_Load(objectsender,EventArgse)
{
minute.Enabled=false;
year.Text=DateTime.Now.Year.ToString();
month.Text=DateTime.Now.Month.ToString();
day.Text=DateTime.Now.Day.ToString();
hour.Text=DateTime.Now.Hour.ToString();
minute.Text=DateTime.Now.Minute.ToString();
second.Text=DateTime.Now.Second.ToString();
}
//初始化serialPort1
privatevoidserialPort1_DataReceived(objectsender,System.IO.Ports.SerialDataReceivedEventArgse)
{
str=serialPort1.ReadExisting();
this.Invoke(newEventHandler(DisplayText));
}
//设置串口
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(!
serialPort1.IsOpen)//如果串口是关闭的
{
serialPort1.PortName=this.dkh.Text;//获取或设置通信端口,包括但不限于所有可用的COM端口
serialPort1.BaudRate=Convert.ToInt32(this.btl.Text);//获取或设置串行波特率
serialPort1.DataBits=Convert.ToInt16(this.sj.Text);//获取或设置每个字节的标准数据位长度
serialPort1.Parity=(Parity)Enum.Parse(typeof(Parity),jyw.Text);//获取或设置奇偶校验检查协议
serialPort1.StopBits=(StopBits)Enum.Parse(typeof(StopBits),tz.Text);//获取或设置每个字节的标准停止位数
try//try:
尝试下面的代码,如果错误就跳出来执行catch里面代码
{
serialPort1.Open();//打开串口
button1.Text="关闭串口";//如果串口打开改变按钮字符为“关闭串口”
dkh.Enabled=false;
btl.Enabled=false;
jyw.Enabled=false;
tz.Enabled=false;
sj.Enabled=false;
}
catch
{
MessageBox.Show("串口打开失败了!
!
");
}
}
else//如果串口是打开的
{
serialPort1.Close();//关闭串口;
button1.Text="打开串口";//如果串口打开改变按钮字符为“打开串口”
dkh.Enabled=true;
btl.Enabled=true;
jyw.Enabled=true;
tz.Enabled=true;
sj.Enabled=true;
}
}
//响应单片机
privatevoidDisplayText(objectsender,EventArgse)
{
fm2.textBoxes1=textBoxes1;
if(str=="2")
{
if(fm2==null)
{
fm2=newForm2();
}
fm2.textBoxes1=textBoxes1;
fm2.setText(textBoxes1);
fm2.Owner=this;
fm2.Show();
a=1;
c=1;
}
if(str=="3")
{
if(fm3==null)
{
fm3=newForm3();
}
fm3.Owner=this;
fm3.Show();
b=1;
c=1;
}
if(str=="4")
{
if(a==1)
fm2.setStr(str,textBoxes1);
if(b==1)
fm3.setStr(str);
}
if(str=="5")
{
if(a==1)
fm2.addTime();
if(b==1)
fm3.addTime();
}
if(str=="6")
{
if(a==1)
fm2.subTime();
if(b==1)
fm3.subTime();
}
if(str=="7"&&c==1)
{
if(a==1)
{
fm2.confirmTime();
a=0;
c=0;
}
if(b==1)
{
h=fm3.returnHour();
m=fm3.returnMinute();
c_Time=(h+m).Trim();
fm3.close();
a=0;
c=0;
}
}
}
//发送数据
privatevoidbutton2_Click(objectsender,EventArgse)
{
if(serialPort1