jin_jinchi
发表于 2007-9-27 10:43
强帖留名
真是仰慕啊,什么时候才能有此等水平<br />我也希望看到楼主的原理图,jinchi@eyou.com<br />先谢谢了<br />继续关注中~~~
suwei123
发表于 2007-9-28 00:45
可否提供原理图~~~
suweibus@163.com<br />谢谢!
suwei123
发表于 2007-9-30 10:14
谢谢
收到原理图了~,呵呵,谢谢~<br />
jxc827
发表于 2007-10-1 08:57
楼主,能否给我也发一份原理图!
谢谢,以前看都贴出来,现在没有了。<br />jxc827@126.com
maxing
发表于 2007-10-7 18:28
实在是精彩!!!
要多多学习才行~~!
xiaoing
发表于 2007-10-12 08:18
顶
ocon
发表于 2007-10-15 01:07
hehe,没玩过DSP,不过楼主的板子很漂亮,看着舒服。
hotpower
发表于 2007-10-15 01:30
哈哈~~~不错~~~俺玩不起6系列
谢谢~~~<br /><br />
pbxywyq
发表于 2007-10-15 19:39
让大家久等了!
在医院“躺”了一个多月才真切地感受到健康的体魄是人生最宝贵的财富!万望各位同仁在繁重、枯燥的工作中勤于锻炼,珍视身体健康。<br /> 刚上班这几天,前面积压的工作太多这个工程只好暂时停顿一段时间了。<br /> 上周末写了一个单片机IO口模拟多串口的通信程序(目前已实现两个UART@9600bps稳定的实时数据通信),如果大家感兴趣,明天我贴出来,希望对起到抛砖引砖的作用。
zhengrf
发表于 2007-10-16 17:14
好帖
斑竹真是有心人啊。<br />我也很想看看这个设计的原理图,不知是否可以发到这个邮箱zheng_rf@163.com<br />不胜感激!
pbxywyq
发表于 2007-10-17 16:43
虚拟串口程序源码
#include <REG2051.H><br />#include "SimUART.h"<br /><br />sbit SimPortA_TX =P1^1;<br />sbit SimPortA_RX =P1^2;<br />sbit SimPortB_TX =P3^3;<br />sbit SimPortB_RX =P3^4;<br /><br />static unsigned char guSimPortA_Count =1;<br />static unsigned char guSimPortB_Count =1;<br /><br />static unsigned char bdata gSimUART_Status =0xcc;<br />sbit gbSimPortA_Sending =gSimUART_Status^0;<br />sbit gbSimPortA_Receiving =gSimUART_Status^1;<br />sbit gbSimPortA_Txd =gSimUART_Status^2;<br />sbit gbSimPortA_Rxd =gSimUART_Status^3;<br />sbit gbSimPortB_Sending =gSimUART_Status^4;<br />sbit gbSimPortB_Receiving =gSimUART_Status^5;<br />sbit gbSimPortB_Txd =gSimUART_Status^6;<br />sbit gbSimPortB_Rxd =gSimUART_Status^7;<br /><br />static bit fTimeOverflow_A =FALSE;<br />static bit fTimeOverflow_B =FALSE;<br /><br />unsigned char code BitCtrl[] ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};<br /><br />unsigned char SimUART_BaudSet(unsigned char PortID,unsigned char BaudRate)<br />{<br /> unsigned char divrate,state;<br /><br /> state =!0;<br /> switch(BaudRate)<br /> {<br /> case BAUD9600:<br /> divrate =1;<br /> break;<br /> case BAUD4800:<br /> divrate =2;<br /> break;<br /> case BAUD2400:<br /> divrate =4;<br /> break;<br /> case BAUD1200:<br /> divrate =8;<br /> break;<br /> default:<br /> state =0; //0 for fail<br /> break;<br /> }<br /><br /> if(state)<br /> {<br /> switch(PortID)<br /> {<br /> case SIMPORTA:<br /> guSimPortA_Count =(divrate *COUNT_MULTIPLE);<br /> state =0x01;<br /> break;<br /> case SIMPORTB:<br /> guSimPortB_Count =(divrate *COUNT_MULTIPLE);<br /> state =0x10;<br /> break;<br /> case SIMPORTAB:<br /> guSimPortA_Count =(divrate *COUNT_MULTIPLE);<br /> guSimPortB_Count =(divrate *COUNT_MULTIPLE);<br /> state =0x11;<br /> break;<br /> default:<br /> state =0;<br /> }<br /> }<br /><br /> return(state);<br />}<br /><br />void SimUARTs_Send(unsigned char CtrlWord)<br />{<br /> unsigned char count;<br /><br /> if((gSimUART_Status &0x33) ==0)<br /> {<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /> gbSimPortA_Txd =0;<br /> gbSimPortB_Txd =0;<br /> gbSimPortA_Sending =TRUE;<br /> gbSimPortB_Sending =TRUE;<br /><br /> while(!fTimeOverflow_A) //waiting for sending start-bit<br /> ;<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /><br /> for(count =0;count <8;count++)<br /> {<br /> gbSimPortA_Txd =gbSimPortB_Txd =(bit)(CtrlWord &BitCtrl);<br /> while(!fTimeOverflow_A) //waiting for sending a data-bit<br /> ;<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /> }<br /><br /> gbSimPortA_Txd =1;<br /> gbSimPortB_Txd =1;<br /> while(!fTimeOverflow_A) //waiting for sending stop-bit<br /> ;<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /><br /> gbSimPortA_Sending =FALSE;<br /> gbSimPortB_Sending =FALSE;<br /> }<br />}<br /><br />bit SimUARTA_Receive(unsigned char *ptr)<br />{<br /> static unsigned char BitCount =0;<br /> static unsigned char ReceivedByte =0;<br /><br /> if(gbSimPortA_Receiving)<br /> {<br /> if(fTimeOverflow_A)<br /> {<br /> fTimeOverflow_A =FALSE;<br /> if(BitCount >=8)<br /> {<br /> BitCount =0;<br /> gbSimPortA_Receiving =FALSE;<br /> if(gbSimPortA_Rxd) //Check for stop-bit<br /> {<br /> *ptr =ReceivedByte;<br /> return(TRUE);<br /> }<br /> }<br /> else<br /> {<br /> if(gbSimPortA_Rxd)<br /> ReceivedByte |=BitCtrl;<br /> else<br /> ReceivedByte &=(~(BitCtrl));<br /> BitCount++;<br /> }<br /> }<br /> }<br /> else<br /> BitCount =0;<br /> return(FALSE);<br />}<br /><br />bit SimUARTB_Receive(unsigned char *ptr)<br />{<br /> static unsigned char BitCount =0;<br /> static unsigned char ReceivedByte =0;<br /><br /> if(gbSimPortB_Receiving)<br /> {<br /> if(fTimeOverflow_B)<br /> {<br /> fTimeOverflow_B =FALSE;<br /> if(BitCount >=8)<br /> {<br /> BitCount =0;<br /> gbSimPortB_Receiving =FALSE;<br /> if(gbSimPortB_Rxd) //Check for stop-bit<br /> {<br /> *ptr =ReceivedByte;<br /> return(TRUE);<br /> }<br /> }<br /> else<br /> {<br /> if(gbSimPortB_Rxd)<br /> ReceivedByte |=BitCtrl;<br /> else<br /> ReceivedByte &=(~(BitCtrl));<br /> BitCount++;<br /> }<br /> }<br /> }<br /> else<br /> BitCount =0;<br /> return(FALSE);<br />}<br /><br />//Timer0 interrupt routine<br />void Timer0(void) interrupt TF0_VECTOR using 1<br />{<br /> static unsigned char data SimPortA_SampleCount =0;<br /> static unsigned char data SimPortB_SampleCount =0;<br /> bit RxdPin_A,RxdPin_B;<br /><br /> RxdPin_A =SimPortA_RX;<br /> RxdPin_B =SimPortB_RX;<br />// SimPortA_TX =gbSimPortA_Txd;<br />// SimPortB_TX =gbSimPortB_Txd;<br /> <br /> //Port A<br /> if((gSimUART_Status &0x03) ==0)<br /> {<br /> if(RxdPin_A ==0) //find out receive start-bit<br /> {<br /> SimPortA_SampleCount++;<br /> if(SimPortA_SampleCount >=2)<br /> {<br /> if(!gbSimPortA_Sending) //working as simplex-system<br /> gbSimPortA_Receiving =TRUE; //start receive<br /> SimPortA_SampleCount =0;<br /> }<br /> }<br /> else<br /> SimPortA_SampleCount =0;<br /> }<br /> else<br /> {<br /> SimPortA_SampleCount++;<br /> if(SimPortA_SampleCount >=guSimPortA_Count)<br /> {<br /> fTimeOverflow_A =TRUE;<br /> if(gSimUART_Status &0x01) //Sending<br /> SimPortA_TX =gbSimPortA_Txd;<br /> if(gSimUART_Status &0x02) //Receiving<br /> gbSimPortA_Rxd =RxdPin_A;<br /> SimPortA_SampleCount =0;<br /> }<br /> }<br /><br /> //Port B<br /> if((gSimUART_Status &0x30) ==0)<br /> {<br /> if(RxdPin_B ==0) //find out receive start-bit<br /> {<br /> SimPortB_SampleCount++;<br /> if(SimPortB_SampleCount >=2)<br /> {<br /> if(!gbSimPortB_Sending) //working as simplex-system<br /> gbSimPortB_Receiving =TRUE; //start receive<br /> SimPortB_SampleCount =0;<br /> }<br /> }<br /> else<br /> SimPortB_SampleCount =0;<br /> }<br /> else<br /> {<br /> SimPortB_SampleCount++;<br /> if(SimPortB_SampleCount >=guSimPortB_Count)<br /> {<br /> fTimeOverflow_B =TRUE;<br /> if(gSimUART_Status &0x10) //Sending<br /> SimPortB_TX =gbSimPortB_Txd;<br /> if(gSimUART_Status &0x20) //Receiving<br /> gbSimPortB_Rxd =RxdPin_B;<br /> SimPortB_SampleCount =0;<br /> }<br /> }<br />}
pbxywyq
发表于 2007-10-17 17:07
程序的设计思路
这个工程完成的比较仓促,之前也曾参考过网络上其他前辈的源码,但都不是太适合工程需求。我这段代码的设计思路是这样的:首先,利用Timer0产生时基信号(启用多个中断时,务必将Timer0的中断优先级设置为最高,如此方可保证定时的准确性),再以这一时基信号作为最低时间分辨率对UART的输入端口进行采样,当达2个连续的低电平采样时则任务启动了一次串行接收操作,然后按波特率设置作等间隔的端口采样,并将获取端口状态存储到一全局bit类型变量中,而UART发送操作在Timer0中断服务程序中只提供定时服务;其次,主程序不断检查UART的工作状态,当检测到UART处于接收或发送状态时,便开始监测Timer0是否有超时事件发生,有超时事件则说明有1位数据成果地接收或发送,然后作相应的处理直到完成整个Byte的接收或发送操作。<br /> 由于接收函数采用非阻塞运行方式,因此该程序可实现对多个UART的同步操作。<br /> 事实上,如果采用可产生软件中断的单片机,那么虚拟UART的操作会变得更简便。<br />
chxuan2004
发表于 2007-10-21 17:09
楼主,能发一份原理图吗~~
小弟先谢谢啦,多多学习哈:0<br /><br />我的邮箱是:chengxuan2002@163.com
2_1_I_C
发表于 2007-10-22 11:05
希望得到一份详细资料
LZ辛苦<br />希望得到一份详细资料<br />qjchappy # 126_com
hughpro
发表于 2007-10-25 07:48
赞
赞啊
xiaoing
发表于 2007-10-25 13:28
学习中
好贴,不顶对不起楼主,
tjsheep
发表于 2007-10-25 23:28
楼主多保重身体啊:)
邓裕文
发表于 2007-10-30 09:51
1111
注意身体啊!!
bios51
发表于 2007-10-30 20:15
羡慕
artillery1
发表于 2007-11-4 20:52
板子设计的很好啊。
板子设计的很好,布线很漂亮。不知道板主要实现什么功能?