如何对串口SCI编程

如题所述

  你肯定见过台式机箱后面的九针插头,以前计算机和外设都是通过它通信的,现在 逐步被 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 也问 哈工大嵌入式开发 hitele.taobao.com 题不大,不是 100%精确才能通信的,尽量吧! 手册 420 页中给出了串口波特率设置公式: SCI bus clock 就是以前提到的 f BUS ,在前面定时器和 PLL 实验中都讲过,PLL 实 验中我们将 f BUS 设置成了 40M。 SCIBR[12:0]由 SCIBDH 和 SCIBDL 决定(手册中 406 页),这 SCIBDH 设置 [12:8],SCIBDL 设置[7:0],一共 13 位。 假如我们现在要设置波特率为9600,怎么设置呢? 9600=40 000 000 /(16*SCIBR[12:0]) SCIBR[12:0]= 40 000 000 /16/9600 =260 260的十六进制是104H,也就是SCIBDH=0x01,SCIBDL=0x04. 除了波特率寄存器外,还有两个寄存器比较重要,SCI0CR1和SCI0CR2 LOOPS置1:SCI的发送端在内部直接接到SCI的发送端,也就是自发自收,这主要用来编程 期间对程序进行测试。清0就进入正常模式。 M=0: SCI总线发送了1个起始位 8个数据位和一个结束位 M=1: SCI总线发送了1个起始位 9个数据位和一个结束位 PE=1:启用奇偶校验 PE=0:禁止奇偶校验 PT用来选择是采用奇校验还是偶校验。 关于奇偶校验您可以百度一下,这里不做阐述了。 哈工大嵌入式开发 hitele.taobao.com TIE=1:使能发送数据为空中断,也就是现在发送数据寄存器可以接收新数据了,你可以发 送新数据了。 TCIE=1:使能发送完成中断,告诉你发送结束啦 RIE=1:使能接收中断 TE=1:发送使能 RE=1:接收使能 最后一个重要的寄存器就是状态寄存器SCI0SR1 TDRE=1:标志着可以进行新的数据收发了 RDRF=1: 标志着接收到了新数据 实际应用: 利用单片机每隔400ms 向电脑发送一次“hitele”,每次接收到PC 发送来的数据时,改 变led 状态。 每隔400ms,利用前面讲过的定时器,回顾一下吧。 串口发送编程: 1. 先对SCI 初始化 SCI0BDH =0x01; SCI0BDL =0x04; //将波特率设置为9600,注意这是在f BUS 为40M的情况下设 定的 SCI0CR1 = 0x64; //设置串口接收端连接到外部; SCI0CR2 = 0x2C;//启用接收中断;发送使能和接收使能 2. 发送函数 void Sci0SendByte(unsigned char data) { while(!(SCI0SR1&0X80)); //等待 TDRE 为置 1,也就是等待什么时候可以发送 新数据 SCI0DRL = data; //向数据寄存器写入要发送的数据,这样就发送出去了 } 3. 接收函数 查询式接收: 哈工大嵌入式开发 hitele.taobao.com 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 |=0x60; /*0xC0=0110 0000,即将PE5、PE6 设置成输出模式*/ PORTE =~PORTE; /*改变led 状态*/ }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-27
那款mcu,就找那款mcu的例子,一般芯片开发包都附带。
第2个回答  2014-12-27
关注这个问题!