用定时器 T0 或 T1 模拟串行口程序
- 格式:doc
- 大小:52.50 KB
- 文档页数:9
习题 11.1 单项选择题(1) A (2)C (3)C1.2 填空题(1)硬件系统、软件系统(2)时钟电路、复位电路(3)XTAL1、XTAL2、RESET、EA(4)晶振1.3 问答题什么是单片机?它由哪几部分组成?什么是单片机应用系统?答:单片微型计算机(Single Chip Microcomputer)简称单片机,是指集成在一个芯片上的微型计算机,它的各种功能部件,包括CPU(Central Processing Unit)、存储器(memory)、基本输入/输出(Input/Output,简称I/O)接口电路、定时/计数器和中断系统等,都制作在一块集成芯片上,构成一个完整的微型计算机。
单片机应用系统是以单片机为核心,配以输入、输出、显示等外围接口电路和控制程序,能实现一种或多种功能的实用系统。
1.4 上机操作题(1)参考程序:#include <reg51.h> //包含头文件reg51.h,定义了51单片机的专用寄存器//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无void delay(unsigned int i) //延时函数{unsigned int k;for(k=0;k<i;k++);}void main() //主函数{while(1){P1=0x00;delay(20000); //调用延时函数,实际参数为20000P1=0xff;delay(20000); //调用延时函数,实际参数为20000}}(2)参考程序:#include <reg51.h> //包含头文件reg51.h,定义了51单片机的专用寄存器//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无void delay(unsigned int i) //延时函数{unsigned int k;for(k=0;k<i;k++);}void main() //主函数{while(1){P1=0x55;delay(20000); //调用延时函数,实际参数为20000P1=0xff;delay(20000); //调用延时函数,实际参数为20000}}习题 22.1 单项选择题(1)C (2)A (3)A (4)A (5)A (6)D (7)C (8)A (9)A (10)C 2.2 填空题(1)外部程序存储器、外部数据存储器、内部程序存储器、内部数据存储器(2)程序存储器(3)工作寄存器组、位寻址区、用户RAM(4)1us、2us(5)按键复位、上电复位(6)2、高2.3 回答题(1)P3口的第二功能是什么?答:P3口各引脚的第二功能如下表。
单片机原理及应用期末考试试题汇总1、单片机是将微处理器、一定容量的 RAM 和ROM以及(I/O)口、定时器等电路集成在一块芯片上而构成的微型计算机.2、单片机89C51片内集成了(4)KB的FLASH ROM,共有(5)个中断源。
3、两位十六进制数最多可以表示(256)个存储单元。
4、89C51是以下哪个公司的产品?( C )A、INTELB、AMDC、ATMELD、PHILIPS5、在89C51中,只有当EA引脚接(高)电平时,CPU才访问片内的Flash ROM.6、是非题:当89C51的EA引脚接低电平时,CPU只能访问片外ROM,而不管片内是否有程序存储器。
T7、是非题:当89C51的EA引脚接高电平时,CPU只能访问片内的4KB空间。
F8、当CPU访问片外的存储器时,其低八位地址由(P0)口提供,高八位地址由(P2)口提供,8位数据由(P0)口提供。
9、在I/O口中,(P0)口在接LED时,必须提供上拉电阻,(P3)口具有第二功能。
10、是非题:MCS-51系列单片机直接读端口和读端口锁存器的结果永远是相同的.F11、是非题:是读端口还是读锁存器是用指令来区别的。
T12、是非题:在89C51的片内RAM区中,位地址和部分字节地址是冲突的。
F13、是非题:中断的矢量地址位于RAM区中.F14、MCS-51系列单片机是属于(B)体系结构.A、冯诺依曼B、普林斯顿C、哈佛D、图灵15、89C51具有( 64 ) KB的字节寻址能力.16、是非题:在89C51中,当CPU访问片内、外ROM区时用MOVC指令,访问片外RAM区时用MOVX指令,访问片内RAM区时用MOV 指令。
T17、在89C51中,片内RAM分为地址为 00H~7FH 的真正RAM区,和地址为80H~FFH的特殊功能寄存器(SFR)区两个部分。
18、在89C51中,通用寄存器区共分为(4)组,每组(8)个工作寄存器,当CPU复位时,第(0)组寄存器为当前的工作寄存器。
单片机应用技术(C语言版)模拟试卷14(考核方式:笔试闭卷,考试时间:120分钟,满分:100分)题号一二三四总分得分签名总得分________统分人签名_________核分人签名__________一、单选题(每小题2分,共20分)【得分:】1.51单片机能够直接执行的程序是。
A、C语言程序B、汇编语言程序C、机器语言程序D、源程序2.程序计数器PC的作用是。
A、指示和引导汇编语言进行汇编B、指示下一条将要执行的指令地址C、指示堆栈指针D、指示返回指令的地址3.8051单片机的机器周期为1µs,则其晶振频率fosc为MHz。
A、1B、2C、6D、124.单片机最多可以扩展外部程序存储器或外部数据存储器。
A、4KBB、8KBC、16KBD、64KB5.按位与运算经常用于把指定位,其余位不变的操作。
A.置1B.取反C.清0D.以上都不对6.定时器T0的计数溢出标志位是。
A.TCON中的TF0B.TCON中的TF1C.TCON中的TR0D.TCON中的TR17.显示方式编程较简单,但占用I/O口线多,其一般适用显示位数较少的场合。
A.静态B.动态C.静态和动态D.查询8.采用P0口来静态控制1个数码管显示,属于通信方式。
A.中断B.查询C.并行D.串行9.异步串行通信的字符帧格式中位于开头的是。
A.起始位B.数据位C.校验位D.停止位10.8051单片机只能输出量。
A.数字B.模拟C.数字与模拟D.串行二、填空题(每空1分,共20分)【得分:】1.(1)口作为通用I/O口使用时,需外加(2);分时复用作为低8位(3)线和8位(4)线时是真正的双向口。
2.访问程序存储控制信号的引脚名称是(5)。
3.复位后,单片机并行I/O口P0~P3的值是(6)。
4.单分支选择结构程序一般用(7)语句实现;双分支选择结构程序一般用(8)语句实现;多分支选择结构程序一般用(9)语句或(10)语句实现。
5.用符号常量PI表示数值3.1415,定义方法是:(11)。
试卷库试卷一题号一二三四五六七八九十总分累分人签名题分30 10 10 20 16 14 100得分考生注意事项:1、本试卷共 6 页,请查看试卷中是否有缺页或破损。
如有立即举手报告以便更换。
2、考试结束后,考生不得将试卷、答题纸和草稿纸带出考场。
一、填空题(每空1分,共30分)得分评阅人1、AT89S51单片机主要硬件资源有:8位的CPU、256字节内部RAM、4K 字节的内部ROM、 2 个16 位的定时/计数器、5 个中断源的中断系统、一个全双工的串行口以及看门狗。
2、已知11011011B是一个补码,则其真值为_-37__D;如果01011001B为BCD数,则其转换为十六进制数为3B H。
3、采用ADD指令将十六进制数92H、73H相加后,Cy位为 1 。
4、当程序状态字PSW为(10001001)时,当前工作寄存器组是____1__组,对应的工作寄存器R6的地址是____0E___H。
5、AT89S51单片机外部复位电路有上电自动复位和按钮手动复位两种,单片机复位后其SP的内容为__07_H,P0的内容为0FF H,PC的内容为0000 H。
6、AT89S51单片机扩展程序存储器使用一片具有地址线13根,数据线8根的EPROM,其程序存储器容量为_8_KB,外部程序存储器的读选通信号由单片机PSEN引脚输出。
7、AT89S51单片机中,如CPU能响应外部中断INT1和定时器T1的中断,则对应的中断入口地址分别为0013H 和001BH 。
8、指出以下指令中源操作数的寻址方式MOVC A,@A+DPTR;变址寻址MOV A,@R1;寄存器间接寻址MOV 20H,A;寄存器寻址9、AT89S51单片机三总线包括地址总线、数据总线和控制总线。
10、单片机有两种低功耗方式,即待机(或空闲)方式和掉电(或停机)方式。
11、单片机的时序定时单位包括时钟(或震荡)周期、机器周期和指令周期。
12、ADC0809是_______8___位的模/数转换器。
例2 利用定时/计数器T0的方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms 的方波,采用中断方式,设系统时钟频率为12 MHz。
解:1、计算计数初值X:由于晶振为12 MHz,所以机器周期Tcy为1 s。
所以:N=t/ Tcy =10×10-3 / 1×10-6=10000X=65536-10000=55536=D8F0H即应将D8H送入TH0中,F0H送入TL0中2、求T0的方式控制字TMOD:M1M0=01,GATE=0,C/T=0,可取方式控制字为01H;ORG 0000HLJMP MAIN ;跳转到主程序ORG 000BH ;T0的中断入口地址LJMP DVT0 ;转向中断服务程序ORG 0100HMAIN:MOV TMOD,#01H ;置T0工作于方式1MOV TH0,#0D8H ;装入计数初值MOV TL0,#0F0HSETB ET0 ;T0开中断SETB EA ;CPU开中断SETB TR0 ;启动T0SJMP $ ;等待中断DVT0:CPL P1.0 ;P1.0取反输出MOV TH0,#0D8H ;重新装入计数值MOV TL0,#0F0HRETI ;中断返回END•2、串行口方式1的发送和接收例7-4:89C51串行口按双工方式收发ASCII字符,最高位用来作奇偶校验位,采用奇校验方式,要求传送的波特率为1200b/s。
编写有关的通信程序。
解:7位ASCII码加1位奇校验共8位数据,故可采用串行口方式1。
89C51单片机的奇偶校验位P是当累加器A中1的数目为奇数时,P=1。
如果直接把P 的值放入ASCII码的最高位,恰好成了偶校验,与要求不符。
因此,要把P的值取反以后放入ASCII码最高位,才是要求的奇校验。
•2、串行口方式1的发送和接收•双工通信要求收、发能同时进行。
收、发操作主要是在串行接口进行,CPU只是把数据从接收缓冲器读出和把数据写入发送缓冲器。
单片机模拟试卷001一、选择题(每题1分,共10分)1.8031单片机的( )口的引脚,还具有外中断、串行通信等第二功能。
a)P0 b)P1 c)P2 d)P32.单片机应用程序一般存放在()a) RAM b)ROM c)寄存器 d)CPU3.已知某数的BCD码为0111 0101 0100 0010 则其表示的十进制数值为()a) 7542H b) 7542 c) 75.42H d) 75.424.下列指令中不影响标志位CY的指令有()。
a)ADD A,20H b)CLR c)RRC A d)INC A5.CPU主要的组成部部分为()a)运算器、控制器 b)加法器、寄存器c)运算器、寄存器 d)运算器、指令译码器6.INTEL 8051 CPU是()位的单片机a) 16 b)4 c)8 d)准167.8031复位后,PC与SP的值为()a )0000H,00H b) 0000H,07H c) 0003H,07H d)0800H,00H8.当需要从MCS-51单片机程序存储器取数据时,采用的指令为()。
a)MOV A, @R1 b)MOVC A, @A + DPTRc)MOVX A, @ R0 d)MOVX A, @ DPTR9.8031单片机中既可位寻址又可字节寻址的单元是()a)20H b)30H c)00H d)70H10.下列哪条指令是正确的()a) PUSH R2 b) ADD R0,Ac) MOVX A @DPTR d) MOV @R0,A二、填空题(每空1分,共30分)1.一个完整的微机系统由和两大部分组成。
2.8051 的引脚RST是____(IN脚还是OUT脚),当其端出现____电平时,8051进入复位状态。
8051一直维持这个值,直到RST 脚收到____电平,8051才脱离复位状态,进入程序运行状态,从ROM H单元开始取指令并翻译和执行。
3.半导体存储器分成两大类和,其中具有易失性,常用于存储。
单片机应用技术模拟试卷1 答案一、填空题(每空1分,共20分)1、单片机是由CPU、存储器、I/O接口及定时/计数器集成在一个芯片上组成的。
2、十进制数25=16H(十六进制)=00010110B(二进制)。
3、单片机的三总线可以分为地址总线、数据总线和控制总线。
(或者数据总线、地址总线)4、8051的=1意味着访问前4K是内部程序存储器,超过4K后访问的是外部程序存储器。
5、单片机复位后SP=07H,第一个入栈数据进入08H单元。
6、执行ANL A,#0FH后,累加器A的内容高4位是0000 。
7、8051单片机共有5个中断源,2个优先级。
8、能够加间址符@的寄存器有R0、R1和DPTR 。
9、在伟福仿真软件当中输入调试程序我们都保存成后缀是ASM 的文件。
10、可编程并行I/O接口芯片8155内部功能部件包括256B的静态RAM,3个I/O接口和 1个14位的定时/计数器。
11、A/D转换器是将模拟量转换成数字量,D/A转换器是将数字转换成模拟量。
二、选择题(每小题2分,共20分)1、一个完整的系统通常包括( B )。
A.系统软件和应用软件 B. 硬件系统和软件系统0C. 计算机及外设D.硬件和系统软件2、EPROM是指( D )。
A. 随机存储器B.电擦除的只读存储器C.只读存储器D.紫外线可擦除的只读存储器3、先判断后循环的循环程序结构中,循环体至少被执行( A )次。
A.0 B.1 C.2D.34、MCS-51系列单片机的CPU是(B )位的。
A.4位B.8位 C.16位 D.32位5、8031的内部RAM中,用作位寻址的单元地址是(B )。
A.00H-1FHB.20H-2FHC.30H-4FH D.50H-6FH6、12MHz晶振的单片机在定时方式下,定时器可能实现的最小定时时间是(D ) 。
A.8us B.4us C.2us D.1us7、在单片机扩展系统中,8031地址总线和数据总线分时复用所用端口是( D )。
《单片机应用技术》填空题题库x《单片机应用技术》习题库答案一、填空题第一、二章1.计算机中最常用的字符信息编码是(ASCII码)。
2.MCS-51系列单片机为( 8 )位单片机。
3.计算机三总线分别为:(数据)总线;(地址)总线;(控制)总线。
4.单片机与普通计算机的不同之处在于其将CPU 、存储器和I/O 三部分集成于一块芯片上。
5.能在紫外线照射下擦除和重写的存储器是(EPROM )型存储器,能够直接在线路中快速写入和读出的存储器是(EEPROM)型存储器。
6.8031、8051的主要区别是8051有 4 k内部ROM。
7.MCS-51单片机片内共有128 字节单元的RAM。
8.8031内部有RAM( 128 )字节、8751内部有ROM( 4K )。
9.MCS-51系列单片机8031、8051、89S52在内部存储器的设置上主要区别是:8031内部(无)程序存储器,8051内部( 4K )程序存储器,89C52内部( 8K )程序存储器。
10.8031构成的单片机应用系统必须扩展程序存储器。
11.M CS-51单片机片内RAM区中有128 个可寻址位。
12.8051单片机片内RAM区80H-0FFH属于特殊功能寄存器(SFR)区。
13.M CS-51单片机存储器结构的主要特点是程序存储器与数据存储器的寻址空间是分开的。
14.M CS-51单片机的存储器配置在物理结构上有4 个存储空间。
15.M CS-51单片机的存储器在逻辑上分为 3 个存储器地址空间16.当MCS-51单片机的EA引脚保持低电平时,CPU只访问片外的程序存贮器17.当EA接地时,MCS-51单片机将从外部程序存储器的地址0000H开始执行程序。
18.在只使用外部程序存储器时,51系列单片机的EA 管脚必须接地。
第1页共9页19.在只使用内部程序存储器时,51系列单片机的EA 管脚必须接高电平。
20.当使用8031单片机时,需要扩展外部程序存储器,此时/EA 应接低电平。
单片机原理及应用技能比赛模拟试题(五)一、填空题1、当定时器T0工作在方式3时,要占用定时器T1的 TR1 和 TF1 两个控制位。
2、在定时器T0工作方式3下,TH0溢出时, TF1 标志将被硬件置1去请求中断。
3、在定时器T0工作方式3下,欲使TH0停止工作,应执行一条 CLR TR1 的指令。
4、使用定时器/计数器1设置串行通信的波特率时,应把定时器/计数器1设定作方式 2,即自动重新加载方式。
5、当计数器产生计数溢出时,把定时器/计数器的TF0(TF1)位置“1”。
对计数溢出的处理,在中断方式时,该位作为中断标志位使用;在查询方式时,该位作状态位使用。
6、在定时器工作方式1下,计数器的宽度为16位,如果系统晶振频率为6MHz,则最大定时时间为 131.072ms ,若系统晶振频率为12MHz,则最大定时时间为 65.536ms 。
7、8051单片机内部设有两个16位定时器/计数器,即 T0 和 T1 。
8、T0由两个8位特殊功能寄存器 TH0 和TL0 组成,T1由 TH1 和 TL1 组成。
9、定时时间与定时器的工作方式、计数初值及振荡周期有关。
10、MCS-51的定时器/计数器作计数器时计数脉冲由外部信号通过引脚 P3.4 和 P3.5 提供。
11、MCS-51的定时器/计数器T0的门控信号GATE设置为1时,只有 INT0 引脚为高电平且由软件使 TR0 置1时,才能启动定时器/计数器T0工作。
12、当T0为方式 3 ,T1为方式 2 的时候,8051单片机的定时器可提供3个8位定时器/ 计数器。
1、MCS-51有5个中断源,2个中断优先级,优先级由软件填写特殊功能寄存器 IP 加以选择。
2、外中断请求标志位是 IE0 和 IE1 。
3、 RETI 指令以及任何访问 IE 和 IP 寄存器的指令执行过后,CPU不能马上响应中断。
4、8051单片机响应中断后,产生长调用指令LCALL,执行该指令的过程包括:首先把 PC的内容压入堆栈,以进行断点保护,然后把长调用指令的16位地址送 PC ,使程序执行转向程序存储器中的中断地址区。
/*************************************************************************用定时器T0 或T1 模拟串行口程序。
最高波特率(12 clock):本程序收、发波特率相同。
11.059MHz -- 最高波特率收: 9600, 最低波特率:30030.000MHz -- 最高波特率收: 28800 最低波特率:30040.000MHz -- 最高波特率收: 38400 最低波特率:300...使用说明:1. 本程序使用一个定时器和任意2 个I/O 口模拟一个串行口。
2. 1位起始位,8位数据位,1位停止位。
发数据位时先发低位。
3. 支持半双工通讯。
收、发波特率相同。
4. 应把定时器中断优先级设置为最高级。
5. 本程序每接收一个字节后就把它放到一个队列缓冲区中(也可使用环行缓冲区),待缓冲区满后,将缓冲区中的内容原样发回。
这是为了测试多字节连续收发的能力和简化程序。
实际应用中应防止缓冲区溢出。
6. 由接收转换到发送时要先调用soft_send_enable ();由发送转换到接收时要先调用 soft_receive_enable ()。
7. 发送最后一个字节后如果要立刻转为接收,必须等待最后一个字节后发送完毕 w hile ( rs_f_TI == 0) ; // 等待最后一个字节发送完毕**************************************************************************编程说明:----------------发送:由接收转换到发送时要先调用soft_send_enable (), 它为发送做初始化的工作。
以后就可以调用rs_send_byte () 启动发送一个字节的过程。
发送口平时为高电平,rs_send_byte ()函数使发送口变为低电平开始发送起始位; 同时设置和启动定时器,为发送数据位在预定的时刻产生定时器中断。
发送数据位和停止位都在定时器的中断服务程序中进行。
中断服务程序中处理4 种情况:发送数据位、发送停止位、发送完毕、处理错误。
----------------接收:由发送转换到接收时要先调用soft_receive_enable (), 它为接收做初始化的工作。
定时器以3 到4 倍波特率的频率产生中断(参见rs_TE ST0 的定义)检测P C 机发送的起始位。
一旦检测到起始位,立刻把定时器产生中断的频率调整到与波特率相同,准备在下一个定时器中断中接收第1 个数据位。
中断服务程序中处理以下情况:1. 收到的是P C 机发送的起始位: 调整定时器产生中断的频率与波特率相同。
2. 收到第8 位数据位: 存储接收到的字节。
3. 收到第1--7 位数据位: 存储到收、发移位暂存器。
4. 收到停止位: 调用soft_recei v e_enable(),检测PC 机发出的下一个起始位。
5. 处理出错的情况。
**************************************************************************/#i nclude <reg52.h>sfr16 DP TR = 0x82;typedef unsigned char INT8U;typedef unsigned int INT16U;#define YE S 1#define NO 0//定义使用哪个定时器, 只可定义一个//#define TIMER_0#define TIMER_1//定义串口收、发送管脚。
sbit rs_TXD = P2^1;sbit rs_RXD = P2^0;//根据定时器确定参数#ifdef TIMER_0#define TMOD_AND_WORD 0xF0;#define TMOD_TIME_MODE 0x01;#define TMOD_COUNT_MODE 0x05; //设置计数模式位sbit TCON_ENABLE_TIMER = TCON^4;sbit TCON_TFx = TCON^5; //中断标志位sbit IE_ETx = IE^1; //中断允许位为E T0sbit IP_PTx = IP^1; //中断优先级sfr rs_timerL = 0x8A; //TL0sfr rs_timerH = 0x8C; //TH0#endif#ifdef TIMER_1#define TMOD_AND_WORD 0x0F;#define TMOD_TIME_MODE 0x10;#define TMOD_COUNT_MODE 0x50; //设置计数模式位sbit TCON_ENABLE_TIMER = TCON^6; //sbit TCON_TFx = TCON^7; //中断标志位sbit IE_ETx = IE^3; //中断允许位为E T1sbit IP_PTx = IP^4; //中断优先级sfr rs_timerL = 0x8B; //TL1sfr rs_timerH = 0x8D; //TH1#endifINT8U bdata rs_BUF; //串行收、发时用的移位暂存器。
sbit rs_BUF_bit7 = rs_BUF^7; //移位暂存器的最高位。
INT8U rs_shift_count; //移位计数器。
INT8U bdata rsFlags;sbit rs_f_TI = rsFlags^0; //0:正在发送; 1: 一个字符完毕sbit rs_f_RI_enable = rsFlags^1; //0:禁止接收; 1:允许接收sbit rs_f_TI_enable = rsFlags^2; //0:禁止发送; 1:允许发送//选择以下一个晶体频率//#define Fosc 6000000 //6MHz#define Fosc 11059200 //11.059MHz//#define Fosc 12000000//#define Fosc 18432000//#define Fosc 20000000//#define Fosc 24000000//#define Fosc 30000000//#define Fosc 40000000//选择以下一个波特率://#efine Baud 300 //11.059MHz时,baud 最低为300//#define Baud 1200//#define Baud 2400//#define Baud 4800#define Baud 9600//#define Baud 14400//#define Baud 19200//#define Baud 28800//#define Baud 38400//#define Baud 57600//收、发一位所需定时器计数#define rs_FULL_BIT0 ((Fosc/12) / Baud)#define rs_FULL_BIT (65536 - rs_FULL_BIT0)#define rs_FULL_BIT_H rs_FULL_BIT >> 8 //收、发一位所需定时器计数高位#define rs_FULL_BIT_L (rs_FULL_BIT & 0x00FF) //收、发一位所需定时器计数低位//检测起始位的时间间隔所需定时器计数#define rs_TE ST0 rs_FULL_BIT0 / 4 //波特率较低时可以除以3 或除以2#define rs_TE ST ((~rs_TE ST0))#define rs_TE ST_H rs_TE ST >> 8 //高位#define rs_TE ST_L rs_TE ST & 0x00FF //低位//发送起始位所需定时器总计数#define rs_START_BIT 0xFFFF - (Fosc/12/Baud) + 0x28#define rs_START_BIT_H rs_START_BIT >> 8 //发送起始位所需定时器计数高位#define rs_START_BIT_L rs_START_BIT & 0x00FF //发送起始位所需定时器计数低位#define rs_RE CEIV E_MAX 128 //最大接收长度INT8U idata rs232buffer[rs_RE CEIV E_MAX]; //收、发缓冲区INT16U ReceiveP oint; //接收数据存储指针void soft_rs232_interrupt( void );#ifdef TIMER_0void timer0 (void) interrupt 1 using 3{if (rs_RXD == 0 | rs_shift_count > 0){ soft_rs232_interrupt(); }else{rs_timerH = rs_TE ST_H;rs_timerL = rs_TE ST_L;}}#endif#ifdef TIMER_1void timer1 (void) interrupt 3 using 3{if (rs_RXD == 0 | rs_shift_count > 0){ soft_rs232_interrupt(); }else{rs_timerH = rs_TE ST_H;rs_timerL = rs_TE ST_L;}}#endif/***************************************/void soft_rs232_init (void) //串口初始化{TCON_ENABLE_TIMER = 0; //停止定时器TMOD &= TMOD_AND_WORD;TMOD |= TMOD_TIME_MODE;rs_RXD = 1; //接收脚置成高电平rs_TXD = 1; //发射脚置成高电平IP_PTx = 1; //置中断优先级为高IE_ETx = 1; //允许定时器中断}void soft_receive_init() //监测起始位{TCON_ENABLE_TIMER = 0; //停止定时器rs_timerH = rs_TE ST_H;rs_timerL = rs_TE ST_L;rs_shift_count = 0;TCON_ENABLE_TIMER = 1; //启动定时器}void soft_receive_enable() //允许接收{rs_f_RI_enable = 1; //允许接收rs_f_TI_enable = 0; //禁止发送soft_receive_init(); //监测起始位, RXD 下降沿触发接收字节过程. }void soft_send_enable (void) //允许发送{TCON_ENABLE_TIMER = 0; //停止定时器rs_f_TI_enable = 1; //允许发送rs_f_RI_enable = 0; //禁止接收rs_shift_count = 0; //清移位计数器rs_f_TI = 1; //发送一个字符完毕标志TCON_ENABLE_TIMER = 1; //启动定时器}void soft_rs232_interrupt( void ){/************************ 接收****************************/if (rs_f_RI_enable == 1){if (rs_shi f t_count == 0) //移位计数器==0, 表示检测到起始位的起点{if ( rs_RXD == 1 ){soft_recei v e_enable (); //起始位错, 从新开始}else{//下次中断在数据位或停止位中的某时刻发生rs_timerL += rs_FULL_BIT_L + 0x10;rs_timerH = rs_FULL_BIT_H;rs_shi f t_count++;rs_BUF = 0; //清移位缓冲变量}}else{rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生rs_timerH = rs_FULL_BIT_H;rs_shi f t_count++; //2--9:数据位10:停止位if ( rs_shi f t_count == 9){rs_BUF = rs_BUF >> 1; //接收第8位rs_BUF_bit7 = rs_RXD;if( Recei v eP oint < rs_RECEIVE_MAX){ //保存收到的字节rs232buffer[Recei v eP oint++] = rs_BUF;}else{rs_f_RI_enable = 0; //缓冲区满, 禁止接收}}else{if (rs_shi f t_count < 9 ) //收到的是数据位1 -- 7{rs_BUF = rs_BUF >> 1;rs_BUF_bit7 = rs_RXD;}else{ //收到停止位,继续检测P C 机发出的下一个起始位soft_recei v e_init();}}}TCON_TFx = 0; //清定时器中断标志}else{/************************ 发送****************************/if (rs_f_TI_enable == 1){rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻rs_timerH = rs_FULL_BIT_H;rs_shi f t_count--; //0:停止位末尾时刻到//1:发送停止位//2--9:发送数据位if (rs_shi f t_count > 9) //错误状态{rs_shi f t_count = 9;rs_BUF = 0xFF;}if (rs_shi f t_count > 1) //2--9:发送数据位{ACC = rs_BUF;ACC = ACC >> 1;rs_TXD = CY;rs_BUF = ACC;}else{if (rs_shi f t_count == 0) //0:停止位末尾时刻到{rs_TXD = 1;rs_f_TI = 1; //已发送完毕一个字节}else{rs_TXD = 1; //1:发送停止位}}}}}//由收转到发时,要先调用soft_send_enable ()void rs_send_byte(INT8U SendByte) //发送一个字节{w hile ( rs_f_TI == 0); //等待发送完毕前一个字节rs_TXD = 1;rs_timerL = rs_ST ART_BIT_L; //下次中断在起始位的末尾时刻rs_timerH = rs_START_BIT_H;rs_BUF = SendByte;rs_shift_count = 10;rs_TXD = 0; //发送起始位rs_f_TI = 0; //清已发送完毕一个字节的标志}void initiate_MCU (void) //系统初始化{soft_rs232_init(); //串口初始化E A = 1; //开中断}void main (void){//首先发送128 个字节00H--7FH, 然后等待P C 机发送的数据。