新闻  |   论坛  |   博客  |   在线研讨会
51IO口模拟串口通讯C源程序
tongxin | 2009-04-13 15:37:37    阅读:792   发布文章

51 IO口模拟串口通讯C源程序
%A #include <reg51.h>
%A
%A
%A
%A sbit BT_SND =P1^0;
%A
%A
%A
%A sbit BT_REC =P1^1;
%A
%A
%A
%A /**********************************************
%A
%A
%A
%A
%A
%A
%A
%A IO 口模拟232通讯程序
%A
%A
%A
%A
%A
%A
%A
%A 使用两种方式的C程序 占用定时器0
%A
%A
%A
%A
%A
%A
%A
%A **********************************************/
%A
%A
%A
%A
%A
%A
%A
%A #define MODE_QUICK
%A
%A
%A
%A
%A
%A
%A
%A #define F_TM F0
%A
%A
%A
%A
%A
%A
%A
%A #define TIMER0_ENABLE  TL0=TH0; TR0=1;
%A
%A
%A
%A #define TIMER0_DISABLE TR0=0;
%A
%A
%A
%A
%A
%A
%A
%A sbit ACC0=   ACC^0;
%A
%A
%A
%A sbit ACC1=   ACC^1;
%A
%A
%A
%A sbit ACC2=   ACC^2;
%A
%A
%A
%A sbit ACC3=   ACC^3;
%A
%A
%A
%A sbit ACC4=   ACC^4;
%A
%A
%A
%A sbit ACC5=   ACC^5;
%A
%A
%A
%A sbit ACC6=   ACC^6;
%A
%A
%A
%A sbit ACC7=   ACC^7;
%A
%A
%A
%A
%A
%A
%A
%A void IntTimer0() interrupt 1
%A
%A
%A
%A {
%A
%A
%A
%A F_TM=1;
%A
%A
%A
%A }
%A
%A
%A
%A //发送一个字符
%A
%A
%A
%A void PSendChar(unsigned char inch)
%A
%A
%A
%A {
%A
%A
%A
%A #ifdef MODE_QUICK
%A
%A
%A
%A ACC=inch;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A BT_SND=0; //start bit
%A
%A
%A
%A TIMER0_ENABLE; //启动
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC0; //先送出低位
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC1;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC2;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC3;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC4;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC5;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC6;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=ACC7;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A BT_SND=1;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A
%A
%A
%A
%A TIMER0_DISABLE; //停止timer
%A
%A
%A
%A #else
%A
%A
%A
%A unsigned char ii;
%A
%A
%A
%A
%A
%A
%A
%A ii=0;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A BT_SND=0; //start bit
%A
%A
%A
%A TIMER0_ENABLE; //启动
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A while(ii<8)
%A
%A
%A
%A {
%A
%A
%A
%A if(inch&1)
%A
%A
%A
%A {
%A
%A
%A
%A BT_SND=1;
%A
%A
%A
%A }
%A
%A
%A
%A else
%A
%A
%A
%A {
%A
%A
%A
%A BT_SND=0;
%A
%A
%A
%A }
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ii++;
%A
%A
%A
%A inch>>=1;
%A
%A
%A
%A }
%A
%A
%A
%A BT_SND=1;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A #endif
%A
%A
%A
%A TIMER0_DISABLE; //停止timer
%A
%A
%A
%A }
%A
%A
%A
%A //接收一个字符
%A
%A
%A
%A unsigned char PGetChar()
%A
%A
%A
%A {
%A
%A
%A
%A #ifdef MODE_QUICK
%A
%A
%A
%A
%A
%A
%A
%A TIMER0_ENABLE;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM); //等过起始位
%A
%A
%A
%A ACC0=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A TL0=TH0;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ACC1=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ACC2=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ACC3=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ACC4=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ACC5=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ACC6=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A ACC7=BT_REC;
%A
%A
%A
%A
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A
%A
%A
%A
%A while(!F_TM)
%A
%A
%A
%A {
%A
%A
%A
%A if(BT_REC)
%A
%A
%A
%A {
%A
%A
%A
%A break;
%A
%A
%A
%A }
%A
%A
%A
%A }
%A
%A
%A
%A TIMER0_DISABLE; //停止timer
%A
%A
%A
%A return ACC;
%A
%A
%A
%A #else
%A
%A
%A
%A unsigned char rch,ii;
%A
%A
%A
%A TIMER0_ENABLE;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A ii=0;
%A
%A
%A
%A rch=0;
%A
%A
%A
%A while(!F_TM); //等过起始位
%A
%A
%A
%A
%A
%A
%A
%A while(ii<8)
%A
%A
%A
%A {
%A
%A
%A
%A rch>>=1;
%A
%A
%A
%A if(BT_REC)
%A
%A
%A
%A {
%A
%A
%A
%A rch|=0x80;
%A
%A
%A
%A }
%A
%A
%A
%A ii++;
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM);
%A
%A
%A
%A
%A
%A
%A
%A }
%A
%A
%A
%A F_TM=0;
%A
%A
%A
%A while(!F_TM)
%A
%A
%A
%A {
%A
%A
%A
%A if(BT_REC)
%A
%A
%A
%A {
%A
%A
%A
%A break;
%A
%A
%A
%A }
%A
%A
%A
%A
%A
%A
%A
%A }
%A
%A
%A
%A TIMER0_DISABLE; //停止timer
%A
%A
%A
%A return rch;
%A
%A
%A
%A
%A
%A
%A
%A #endif
%A
%A
%A
%A
%A
%A
%A
%A }
%A
%A
%A
%A //检查是不是有起始位
%A
%A
%A
%A bit StartBitOn()
%A
%A
%A
%A {
%A
%A
%A
%A return  (BT_REC==0);
%A
%A
%A
%A
%A
%A
%A
%A }
%A
%A
%A
%A void main()
%A
%A
%A
%A {
%A
%A
%A
%A unsigned char gch;
%A
%A
%A
%A
%A
%A
%A
%A TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位
%A
%A
%A
%A 自动重装) */
%A
%A
%A
%A PCON=00;
%A
%A
%A
%A
%A
%A
%A
%A TR0=0; //在发送或接收才开始使用
%A
%A
%A
%A TF0=0;
%A
%A
%A
%A TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的
%A
%A
%A
%A timer是
%A
%A
%A
%A //            
%A
%A
%A
%A 104.167*11.0592/12= 96
%A
%A
%A
%A TL0=TH0;
%A
%A
%A
%A ET0=1;
%A
%A
%A
%A EA=1;
%A
%A
%A
%A
%A
%A
%A
%A PSendChar(0x55);
%A
%A
%A
%A PSendChar(0xaa);
%A
%A
%A
%A PSendChar(0x00);
%A
%A
%A
%A PSendChar(0xff);
%A
%A
%A
%A
%A
%A
%A
%A while(1)
%A
%A
%A
%A {
%A
%A
%A
%A if(StartBitOn())
%A
%A
%A
%A {
%A
%A
%A
%A gch=PGetChar();
%A
%A
%A
%A PSendChar(gch);
%A
%A
%A
%A }
%A
%A
%A
%A }
%A
%A
%A
%A
%A
%A
%A
%A }
%A
%A
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客