时钟串行通信报告.docx

上传人:b****4 文档编号:26872139 上传时间:2023-06-23 格式:DOCX 页数:33 大小:51.84KB
下载 相关 举报
时钟串行通信报告.docx_第1页
第1页 / 共33页
时钟串行通信报告.docx_第2页
第2页 / 共33页
时钟串行通信报告.docx_第3页
第3页 / 共33页
时钟串行通信报告.docx_第4页
第4页 / 共33页
时钟串行通信报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

时钟串行通信报告.docx

《时钟串行通信报告.docx》由会员分享,可在线阅读,更多相关《时钟串行通信报告.docx(33页珍藏版)》请在冰豆网上搜索。

时钟串行通信报告.docx

时钟串行通信报告

 

山西大学计算机与信息技术学院

 

小组设计报告书

 

经济性:

由于单片机由学校提供,所以可以减少其他的经济开销。

实用性:

本串行通讯系统无太多复杂的操作要求,也没有过分花哨的装饰品,人性化的设计界面可以使操作者轻易运用自如。

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1