搜索
bottom↓
回复: 9

一个定时器实现全双功模拟串口

[复制链接]

出0入0汤圆

发表于 2010-3-16 09:48:17 | 显示全部楼层 |阅读模式
转载
设计原理:
本文通信波特率为9600bps,使用一个定时器(频率38400Hz)
通过3次分频为TX和RX二个通道同时提供准确的时钟驱动。RX不需要使
用外部中断,直接由定时器进行IO扫描。
设计模式:
异步操作模式。
试验环境:
ATMEGA16(L),16MHz外部晶振。
试验结果:
经过24小时不间断随机数据测试无一错误。
后期扩展:
提供更高的时钟支持更多的串口同时扫描。
#include <API/TYPEDEF.H> //类型定义
//IO
定义
#define GPRS_SET_TX() PORTD |= (1<<1)
#define GPRS_CLR_TX() PORTD &= ~(1<<1)
#define GPRS_PIN_RX (PIND & 1)
//38400Hz
时钟
#define TIMEBASE 0xFE0D
//
为RX
提供32
字节的FIFO
支持
#define MAX_FIFO 32
static BYTE ReceiveFIFO[
MAX_FIFO];
static BYTE FIFOI,
FIFOT;
extern WORD TIMEBASE;
extern BYTE TX_TIME;
static BYTE RXBIT,
RXCOUNT,
RXBUF;
static BYTE TXBIT,
TXBUF;
//
初始化
void UartInit(
void)
{
////////////////////////////////////////////////////////////////////
RXBIT =
0;
RXCOUNT =
1;
FIFOI =
0;
FIFOT =
0;
////////////////////////////////////////////////////////////////////
//配置IO模式
DDRD |=
(
1<<
1);
//TX PD1
DDRD &=
~
1;
//RX PD0
AVR 模拟串口林珍文
}
//
发送一个字节
void WriteByte(
BYTE value)
{
TXBUF =
value;
TXBIT =
0;
while ((
TXBIT &
0x80)
==
0);
}
//
发送一个字符串
void WriteStr(
char *
str)
{
while (*
str)
GPRS_WriteByte(*
str++);
}
//
获取RX
FIFO
收到的长度
BYTE GetFIFOCount(
void)
{
if (
FIFOI ==
FIFOT)
return 0;
if (
FIFOI >
FIFOT)
return FIFOI -
FIFOT;
return (
MAX_FIFO -
FIFOT)
+
FIFOI;
}
//
从RX
FIFO
中获取一个字节
BYTE ReadByte(
void)
{
BYTE RET =
ReceiveFIFO[
FIFOT++];
if (
FIFOT>
MAX_FIFO-
1)
FIFOT =
0;
return RET;
}
//AVR
Time
中断函数
//
注意为了保证代码在限定的时间下顺利执行完成,应尽量减少使用乘除法.
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(
void)
{
char RXB =
GPRS_PIN_RX;
TCNT1H =
TIMEBASE/
256;
//setup
TCNT1L =
TIMEBASE%
256;
////////////////////////////////////////////////////////////////////
//接收部分
if (
RXBIT &
0x80)
{
//判断是否接收完成
if (
RXB)
RXBIT =
0;
}
else
if (
RXBIT==
0 &&
RXB==
0)
{
//接收起始位
RXBIT =
RXCOUNT;
RXBUF =
0;
}
else
if ((
RXCOUNT ==
(
RXBIT &
3))
&&
(
RXBIT))
{
//接收8位数据
BYTE rxbitpos =
(
RXBIT>>
2);
switch (
rxbitpos)
AVR 模拟串口林珍文
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
RXBUF>>=
1;
if (
RXB)
RXBUF |=
0x80;
RXBIT =
(
RXBIT &
3)
|
((
rxbitpos+
1)<<
2);
break;
case 7:
//接收第8位,并直接处理结束位。
RXBUF>>=
1;
if (
RXB)
{
RXBUF |=
0x80;
RXBIT =
0;
}
else RXBIT =
0x80;
////////////////////////////////////////////////////////////////////
//接数据存放入FIFO
ReceiveFIFO[
FIFOI++]
=
RXBUF;
if (
FIFOI >
MAX_FIFO-
1)
FIFOI =
0;
break;
}
}
if (
RXCOUNT==
3)
RXCOUNT =
1;
else RXCOUNT++;
////////////////////////////////////////////////////////////////////
//发送部分
if (
TX_TIME==
2)
{
if ((
TXBIT &
0x80)==
0)
{
switch (
TXBIT)
{
case 0:
GPRS_CLR_TX();
//发送起始位
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
if (
TXBUF &
1)
GPRS_SET_TX();
else GPRS_CLR_TX();
TXBUF>>=
1;
break;
case 9:
GPRS_SET_TX();
//发送结束位
break;
case 10:
//为每个字节增一个发送间隙
TXBIT |=
0x80;
break;
}
TXBIT++;
AVR 模拟串口林珍文
}
PORTD |=
(
1<<
2);
TX_TIME =
0;
}
else
{
PORTD &=
~(
1<<
2);
TX_TIME++;
}
}
点击此处下载 ourdev_538600.pdf(文件大小:128K) (原文件名:模拟串口.pdf)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-8-13 11:37:42 | 显示全部楼层

出0入0汤圆

发表于 2011-1-22 12:16:09 | 显示全部楼层
顶!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2011-6-5 15:49:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-9-7 19:53:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-9-17 13:44:04 | 显示全部楼层
好样的!

出0入0汤圆

发表于 2013-3-4 10:36:44 | 显示全部楼层
顶起来mark!

出0入0汤圆

发表于 2013-3-4 10:50:02 来自手机 | 显示全部楼层
如果处理器足够快,软解can都行,只是现在多串口的片子多去,这个做法效率太低了,不值得

出0入0汤圆

发表于 2013-3-7 11:43:12 | 显示全部楼层
楼主这个里面       
        PORTD |=(1<<2);
                TX_TIME =0;
        }
        else
        {
                PORTD &=~(1<<2);
                TX_TIME++;

PORTD |=(1<<2);
PORTD &=~(1<<2);是做什么用的?

出0入0汤圆

发表于 2013-3-7 11:56:48 来自手机 | 显示全部楼层
正好要用双串口
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表