时钟串行通信报告.docx
- 文档编号:26872139
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:33
- 大小:51.84KB
时钟串行通信报告.docx
《时钟串行通信报告.docx》由会员分享,可在线阅读,更多相关《时钟串行通信报告.docx(33页珍藏版)》请在冰豆网上搜索。
时钟串行通信报告
山西大学计算机与信息技术学院
小组设计报告书
经济性:
由于单片机由学校提供,所以可以减少其他的经济开销。
实用性:
本串行通讯系统无太多复杂的操作要求,也没有过分花哨的装饰品,人性化的设计界面可以使操作者轻易运用自如。
4系统设计
4.1设计目标
为了方便单片机和电脑间进行通讯,管理单片机和电脑的时钟,在电脑程序运行后无需操作电脑便可实现电脑时间程序的设置以及运行,以节省时间、操作简单、提高效率为目的设计该程序。
4.2概要设计
4.2.1时序图:
+1
-1
4.2.2流程图
4.2.2.2PC机流程图
附件
单片机源代码
#pragmasfr//使用特殊功能寄存器
#pragmaDI//使用关中断功能
#pragmaEI//使用开中断功能
#pragmainterruptINTKROnKeyPress//使用按键中断功能
#pragmainterruptINTP5OnKeyOver//使用INTP5有效沿检测中断功能
#pragmainterruptINTST0MD_INTST0//发送中断函数为MD_INTST0
#pragmainterruptINTSR0MD_INTSR0//接收中断函数为MD_INTSR0
#pragmainterruptINTTM000MD_INTTM000//INTTM000中断功能
//-------------------------------------函数声明
voidDelay(intk);//软件延时函数
voidInitKey_INTKR(void);//按键中断初始化函数
//-------------------------------------全局变量定义
unsignedcharrbuffer1=0;//定义串行发送数据变量
unsignedcharrbuffer2=0;//定义串行接收变量
unsignedcharQue=1;//关闭音乐控制变量
signedintNum=0;
unsignedintfreq_a[]={262,294,330,349,392,440,494};
unsignedintregSet_a[]={7633,6802,6060,5730,5100,4545,4048};
unsignedintfreq_b[]={524,587,660,698,784,880,988};
unsignedintregSet_b[]={3816,3406,3030,2864,2550,2272,2022};
unsignedintfreq_c[]={1046,1148,1318,1396,1568,1760,1976};
unsignedintregSet_c[]={1912,1740,1516,1432,1274,1136,1010};
//--------------------------------------------软件延时函数
voidDelay(intk){
unsignedchari,j;
for(i=0;i for(j=0;j } } } //----------------------------------------------按键中断初始化函数 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 时钟 串行 通信 报告