湖南理工学院单片机串口通信课程综合练习_第1页
湖南理工学院单片机串口通信课程综合练习_第2页
湖南理工学院单片机串口通信课程综合练习_第3页
湖南理工学院单片机串口通信课程综合练习_第4页
湖南理工学院单片机串口通信课程综合练习_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

甲 乙双方晶振均采用11 0592MHz 电路如图所示 1 甲 乙双机串行通信 波特率9600 采用偶校验 2 甲机读入P1口的8个开关的状态 通过串行口发送到乙机 3 乙机接收数据且校验正确后 根据接收数据控制8个LED 课程练习 K0键按下 全亮后全灭 交替闪烁 K1键按下 8只LED由上向下流动点亮 K2键按下 8只LED由下向上流动点亮 K3键按下 8只LED全灭 其余为无效键 间隔时间为0 5秒 由T0方式1定时确定 课程练习 硬件电路分析 发送方硬件电路键值分析按下键P1 7P1 6P1 5P1 4P1 3P1 2P1 1P1 0键值K011111110FEHK111111101FDHK211111011FBHK311110111F7H其它键值为无效键值程序中MOVA P1改为MOVA P3SWAPAORLA 0F0H 课程练习 硬件电路分析 接收方硬件电路程序中 在初始化中加SETBP2 5 可以不要注意 实际P1 0对应的LED在下方 课程练习 开发装置的电路 编程准备 波特率为9600b s SMOD 0 查表初值为FDH 发送方 00100000 T1作波特率发生器 定时模式 方式2 仅接收方T0定时 方式1 00000000 00H 20H 课程练习 接收方 00100001 21H 串行口方式3 发送方 11000000 C0H 课程练习 中断设置 允许串行口 仅接收方允许定时器T0中断 发送方 10010000 90H 接收方 10010010 92H D0H 接收方 11010000 课程练习 计算T0定时50ms的初值x 4C00H 因此 TH0 4CH TL0 00H0 5S定时 采用B计数 10次就是0 5S 程序设计思想 发送方1 主程序 1 设置相关SFR 9600波特率 串行口方式3 允许串行口中断 2 读出P1口开关状态 不管何种键值都作为发送数据 确定第9位TB8 将发送数据放入SBUF 2中断服务程序 1 TI清0 2 作主程序 2 相同的事 可以看出 发送方每隔1 15ms读一次开关状态 并将开关状态通过串行口发出 课程练习 甲机发送程序ORG0000HLJMPMAINORG0023H 串行口中断地址LJMPCOM INT 课程练习 MAIN MOVSP 60H 设置堆栈指针MOVTMOD 20H 设置定时器工作方式MOVTH1 0FDH 设置计数器初值MOVTL1 0FDHMOVPCON 00H 波特率不加倍SETBTR1 启动T1计数器计数MOVSCON 0C0H 设置串行口工作方式3MOVIE 90H 开中断 仅允许串行口中断MOVP1 0FFH 要输入 先输出 1 MOVA P1 读出P1口MOVC P A中 1 和P中 1 一定是偶数MOVTB8 C 校验位送TB8 采用偶校验MOVSBUF A 发送一次HERE SJMPHERE 波特率设置 课程练习 COM INT CLRTI 发送中断标志位TI清0MOVA P1MOVC P A中1的个数为奇数 P 1MOVTB8 C 校验位送TB8 采用偶校验MOVSBUF A 启动发送RETI 中断返回 课程练习 C语言甲机发送程序 includevoidmain TMOD 0 x20 设置定时器T1为方式2TH1 0 xfd 波特率9600TL1 0 xfd PCON 0 x00 波特率不加倍TR1 1 启动T1SCON 0 xc0 方式3只发送 不接收IE 0 x90 开中断 仅允许串行口中断P1 0 xff P1口为输入 要输入 先输出 1 波特率设置 课程练习 ACC P1 读出P1口TB8 P A中 1 和P中 1 一定是偶数SBUF ACC 数据送串行口发送while 1 voidcomint isr void interrupt4 串行口的中断服务函数 TI 0 发送中断标志位TI清0ACC P1 读出P1口TB8 P A中 1 和P中 1 一定是偶数SBUF ACC 数据送串行口发送 课程练习 程序设计思想 接收方1 主程序 1 初始化 a SFG T1波特率设置 T0定时500mS 串行口方式3 允许串行口和T0中断 b 控制值单元清0 2 根据控制值 控制LED 采用子程序 按下键P1 7P1 6P1 5P1 4P1 3P1 2P1 1P1 0键值功能K011111110FEH全亮后全灭 交替闪烁K111111101FDH由上向下流动点亮K211111011FBH由下向上流动点亮K311110111F7H全灭 课程练习 程序设计思想 接收方2 各子程序 1 闪烁 进入条件 控制值 FEH 置初值FFH 变反 输出 等待0 5S标志TIME 1 清0TIME 控制值 FEH 是 转 否 返回 2 上 下 下 上 流动点亮 进入条件 控制值 FDH FBH 置初值FEH 7FH 输出 等待0 5S标志TIME 1 清0TIME 左 右 移1位 控制值 FDH FBH 是 转 否 返回 课程练习 程序设计思想 接收方3 串行口中断服务程序 1 RI清0 2 读出SBUF中的接收数据 并进行偶检验 RB8 P 接收出错 3 若接收数据正确 且是有效键值 用接收数据更新控制值 4 T0中断服务程序 1 重新置初值 2 计数值减1 3 计数值 0 0返回 0 计数值 10 设置0 5秒到标志TIME 课程练习 乙机接收程序CTROLDATA50H 控制值单元TIMEBIT7FH 0 5S到标志ORG0000HLJMPMAIN 转主程序ORG000BH T0中断地址LJMPIT0P 转T0中断处理程序ORG0023H 串行口中断地址LJMPCOM INT 转串行口中断处理程序 主程序ORG0030HMAIN MOVSP 60H 设置堆栈指针MOVCTROL 00H 控制值单元清0 课程练习 MOVTMOD 21H 设置定时器工作方式MOVTL0 00H 给T0设初值MOVTH0 4CHMOVTH1 0FDH 设置计数器初值MOVTL1 0FDHMOVPCON 00H 波特率不加倍SETBTR1 启动T1计数器计数MOVSCON 0D0H 设置串行口工作方式 开启接收MOVIE 92H 开中断 仅允许T0与串行口中断SETBTR0 启动T0定时MOVB 10 定时计数器置10次CLRTIME 0 5s定时时间到标志清0 T0定时设置 课程练习 波特率设置 LOOP MOVA 0FEHCJNEA CTROL NEXT1LCALLDIS0 K0键按下显示子程序NEXT1 MOVA 0FDHCJNEA CTROL NEXT2LCALLDIS1 K1键按下显示子程序NEXT2 MOVA 0FBHCJNEA CTROL NEXT3LCALLDIS2 K2键按下显示子程序NEXT3 MOVA 0F7HCJNEA CTROL LOOPMOVP1 0FFHLJMPNEXT3 课程练习 K0键按下判断处理 K1键按下判断处理 K2键按下判断处理 K3键按下判断处理 K0键按下显示子程序 功能 全亮后全灭 交替闪烁DIS0 MOVA 0FFHDIS0A CPLA 变反MOVP1 A 输出DIS0B JNBTIME DIS0B 等待0 5S到CLRTIME 清0 5S到标志MOVR6 CTROLCJNER6 0FEH DIS0C 控制值变化返回SJMPDIS0A 控制值没变继续DIS0C RET 课程练习 K1键按下显示子程序 功能 8只LED由上向下流动点亮DIS1 MOVA 0FEH 点亮P1 0开始DIS1A MOVP1 ADIS1B JNBTIME DIS1B 等待0 5S到CLRTIME 清0 5S到标志RLA 左移一位MOVR6 CTROLCJNER6 0FDH DIS1C 控制值变化返回SJMPDIS1A 控制值没变继续DIS1C RET 课程练习 K2键按下显示子程序 功能 8只LED由下向上流动点亮DIS2 MOVA 7FH 点亮P1 7开始DIS2A MOVP1 ADIS2B JNBTIME DIS2B 等待0 5S到CLRTIME 清0 5S到标志RRA 右移一位MOVR6 CTROLCJNER6 0FBH DIS2C 控制值变化返回SJMPDIS2A 控制值没变继续DIS2C RET 课程练习 T0中断服务子程序IT0P MOVTL0 000H 给T0置初值MOVTH0 4CHDJNZB IT0P1 10次到否 没到返回SETBTIME 到了 设置0 5S到标志MOVB 10 重新置计数值10IT0P1 RETI 课程练习 课程练习 串行口中断服务子程序COM INT PUSHACCPUSHPSWCLRRI 接收中断标志位TI清0MOVA SBUF 接收的数据送AJNBP COM1 P 0 转L1JNBRB8 CEND P 1 RB8 0 出错SJMPKEY P 1 RB8 1 正确COM1 JBRB8 CEND P 0 RB8 1 出错KEY CJNEA 0FEH KEY1SJMPCOM2 键值 FEH 作控制值 课程练习 KEY1 CJNEA 0FDH KEY2SJMPCOM2 键值 FDH 作控制值KEY2 CJNEA 0FBH KEY3SJMPCOM2 键值 FBH 作控制值KEY3 CJNEA 0F7H CEND 键值 F7H 作控制值COM2 MOVCTROL ACEND POPPSWPOPACCRETI C语言乙机接收程序 include defineucharunsignedchardataucharctrol at 0 x50 定义控制值变量ctroldataucharcount 定义计数变量countbittime 0 定义0 5S到标志位变量time并清0 课程练习 voiddis0 K0键按下显示函数 全亮后全灭 交替闪烁 datauchara 0 xff while ctrol 0 xfe 控制值没变继续循环 a a 变反P1 a 从P1输出while time 0 等待0 5S到time 0 清0 5S到标志 课程练习 voiddis1 K1键按下显示函数 LED由上向下流动点亮 datauchara 1 保证只有一个点亮while ctrol 0 xfd 控制值没变继续 P1 a 低电平点亮while time 0 等待0 5S到time 0 清0 5S到标志a a 1 左移一位if a 0 a 1 全0 则置1 课程练习 voiddis2 K2键按下显示函数 LED由下向上流动点亮 datauchara 0 x80 保证只有一个点亮while ctrol 0 xfb 控制值没变继续 P1 a 低电平点亮while time 0 等待0 5S到time 0 清0 5S到标志a a 1 左移一位if a 0 a 0 x80 全0 则置80H 课程练习 voidmain TMOD 0 x21 设置定时器T1为方式2TL0 0 x00 给T0设初值TH0 0 x4c TR0 1 启动T0定时TH1 0 xfd 波特率9600TL1 0 xfd PCON 0 x00 波特率不加倍TR1 1 启动T1作波特率发生器SCON 0 xd0 方式3 启动接收IE 0 x92 开中断 允许T0与串行口中断 课程练习 T0定时设置 波特率设置 ctrol 0 控制值ctrol清0count 10 计数变量count置10while 1 if ctrol 0 xfe dis0 K0键按下 执行dis0函数if ctrol 0 xfd dis1 K1键按下 执行dis1函数if ctrol 0 xfb dis2 K2键按下 执行dis2函数if ctrol 0 xf7 P1 0 xff K3键按下 全灭 课程练习 voidit0p void interrupt1 T0中断服务函数 TL0 0 x00 给T0设初值TH0 0 x4c count if co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论