|
题外话:刚写了一篇软件串口调试手记,其中有一个问题要提出来,那个程序做多机通讯是有问题的,问题在于在多机通讯中,空闲时TX是不能置为输出状态的.....可以将程序改为TX=0,用TRISB来控制高低电平输出,当然,在硬件上需要对TX拉高。
复习一下学到的PIC自带串口的使用方法:
我这有一份从IC37.com下载的PIC18F2455的中文资料(顺便说一下,这个网站上似乎很多中文资料),相当详细!当然,很多东西我是用不到的,现在把重点抄下来:
设置异步发送的操作步骤如下:
1. 选择合适的波特率,对SPBRGH:SPBRG寄存器进行初始化。 按需要将BRGH 和BRG16 位置1或清零,以获得目标波特率。(16C6X系列的似乎没有BRG16)
2. 通过将 SYNC 位清零并将 SPEN 位置 1 使能异步串口。
3. 若要翻转TX 引脚的信号,将TXCKP位置1。(一般情况应该不用翻转)
4. 如果需要中断,将中断允许位TXIE 置1。(发送完成后引发中断(我估计的),如果有多很多数据要发送,你又很忙,那以你可以将一个字节的数据送给TXREG后就可以干别的去了,等中断后再来发一下字节)
5. 若需要发送9 位数据,请将发送位TX9 置1。 发送的第9 位可以是地址位也可以是数据位。(多机通讯的重点,如果不用多机通讯,也就不用理会了)
6. 通过将TXEN 位置 1使能发送,此操作同时也会将TXIF位置 1。
7. 如果选择发送9位数据,将第9位数据装入TX9D位。(同上,如果不用多机通讯也不用理会它)
8. 将数据装入TXREG 寄存器 (启动发送)。(你装进去,它就给你发出去,当然,发送完成是需要一点时间的,一个字节一个字节发,如果要发字符串,自己写程序吧)
9. 若想使用中断,请确保将 INTCON 寄存器中的GIE和 PEIE位(INTCON<7:6>)置 1。(既然是“若想”,那就是说用不用中断随便你咯。)
注意: “不管TXIE的状态如何,只要中断发生,TXIF就会置 1 并且不能用软件清零。 只有在新数据写入TXREG 寄存器时,TXIF才会复位。”
这是DATASHEET上的一段话,当时未看到,写了下面一段程序,结果死 了......
TXREG=x;
while(!TXIF);
TXIF=0; //这是错的,删除这句就对了。TXIF的意思是如果RXREG空了就置1,当你写了数据它自然就是0了,所以不用你清0的。
上面这是不用中断的写法,如果你用中断,就不用这样写了。
看起来好象很复杂,其实写出来很简单:
- #include
- void main(void)
- {
- SPBRG=25; //4MHZ,波特率2400
- SPEN=1;
- TXEN=1;
- TXREG='A';
- while(1);
- }
复制代码 如果下表中没有你要的波特率,可查datasheet
proteus仿真图
连我自己都大吃一惊:如此简单!
这篇文章太长了,标题加个“一”,再写接收部份。
|
|