如何对串口SCI编程.pdf
哈工大嵌入式开发 相关知识讲解:相关知识讲解:你肯定见过台式机箱后面的九针插头你肯定见过台式机箱后面的九针插头,以前计算机和外设都是通过它通信的,现在,以前计算机和外设都是通过它通信的,现在逐步被逐步被 usb 取代,但是串口也是有自己的优势的,一是咱们上位机编程容易,而是传输距取代,但是串口也是有自己的优势的,一是咱们上位机编程容易,而是传输距离远,你很少见过离远,你很少见过 usb 有很长的线吧。有很长的线吧。SCI 是 serial communication interface 的缩写,也就是串行通信接口的意思。所谓串行,就是数据在发送和接受的时候,是一位一位进行的,当然对于我们编程来说,这些对我们没有影响。先说说串口通信的硬件设计吧,单片机出来的 SCITX 和 SCIRX 都是 0V 或 5v 而电脑的串口电平我原来测试过,是+10V 或-10V,他们两个不能直接连接,所以需要一个电平转换芯片,通常我们采用 MAX232.TXD0 接到单片机串口发送端,RXD0 接到单片机接收端,DB_TX 接到九针插头的 2 脚,DBRX 接 3 脚,GND 接 5 脚,九针插头和电脑连接,这样单片机和计算机就能通信啦。怎么在电脑上看串口接收到的数据呢,这时就需要一款串口调试软件,我在资料里面给了。好了下面将单片机编程。好了下面将单片机编程。要实现串口通信,最关键的就是实现波特率的匹配,也就是传输速度要一致,电脑设置串口波特率为 9600,你单片机就要设成 9600 才能通信,当然你设成 9601 也问哈工大嵌入式开发 题不大,不是 100%精确才能通信的,尽量吧!手册 420 页中给出了串口波特率设置公式:SCI bus clock 就是以前提到的 fBUS,在前面定时器和 PLL 实验中都讲过,PLL 实验中我们将 fBUS 设置成了 40M。SCIBR12:0由 SCIBDH 和 SCIBDL 决定(手册中 406 页),这 SCIBDH 设置12:8,SCIBDL 设置7:0,一共 13 位。假如我们现在要设置波特率为假如我们现在要设置波特率为 9600,怎么设置呢?,怎么设置呢?9600=40 000 000/(16*SCIBR12:0)SCIBR12:0=40 000 000/16/9600=260 260的十六进制是104H,也就是SCIBDH=0 x01,SCIBDL=0 x04.除了波特率寄存器外,还有两个寄存器比较重要,除了波特率寄存器外,还有两个寄存器比较重要,SCI0CR1和SCI0CR2 LOOPS置1:SCI的发送端在内部直接接到SCI的发送端,也就是自发自收,这主要用来编程期间对程序进行测试。清0就进入正常模式。M=0:SCI总线发送了1个起始位 8个数据位和一个结束位 M=1:SCI总线发送了1个起始位 9个数据位和一个结束位 PE=1:启用奇偶校验 PE=0:禁止奇偶校验 PT用来选择是采用奇校验还是偶校验。关于奇偶校验您可以百度一下,这里不做阐述了。哈工大嵌入式开发 TIE=1:使能发送数据为空中断,也就是现在发送数据寄存器可以接收新数据了,你可以发送新数据了。TCIE=1:使能发送完成中断,告诉你发送结束啦 RIE=1:使能接收中断 TE=1:发送使能 RE=1:接收使能 最后一个重要的寄存器就是状态寄存器SCI0SR1 TDRE=1:标志着可以进行新的数据收发了 RDRF=1:标志着接收到了新数据 实际实际应用:应用:利用单片机每隔 400ms 向电脑发送一次“hitele”,每次接收到 PC 发送来的数据时,改变 led 状态。每隔 400ms,利用前面讲过的定时器,回顾一下吧。串口发送编程:1.先对 SCI 初始化 SCI0BDH=0 x01;SCI0BDL=0 x04;/将波特率设置为 9600,注意这是在 fBUS为 40M 的情况下设定的 SCI0CR1=0 x64;/设置串口接收端连接到外部;SCI0CR2=0 x2C;/启用接收中断;发送使能和接收使能 2.发送函数 void Sci0SendByte(unsigned char data)while(!(SCI0SR1&0X80);/等待 TDRE 为置 1,也就是等待什么时候可以发送新数据 SCI0DRL=data;/向数据寄存器写入要发送的数据,这样就发送出去了 3.接收函数 查询式接收:查询式接收:哈工大嵌入式开发 unsigned char Sci0Read()while(!SCI0SR1_RDRF);/一直等待接收数据,直到接收到 SCI0SR1_RDRF=1;/读取数据寄存器会将 RDRF 清除 重新置位 return SCI0DRL;/返回数据寄存器的数据 中断方式接收数据:中断方式接收数据:#pragma CODE_SEG NON_BANKED void interrupt 20 SCI0_RE(void)SCI0SR1_RDRF=1;SCI0DRL;/这两步是为了清除中断标志 DDRE|=0 x60;/*0 xC0=0110 0000,即将 PE5、PE6 设置成输出模式*/PORTE=PORTE;/*改变 led 状态*/