导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→串口2容易,串口1更难

* 13774: 硬件:请问:77e58中如何配置串口2,如用C写时它的中断向量是多少?望大伙指点。

   huangyan 
huangyan发表的帖子 

 串口2容易,串口1更难
#include "def_lib.h"
#include <reg51.h>
#include "reg320.h"

#ifdef CPU_80C320
unsigned char data ser1_buf_rx[SERIAL_BUF_SIZE];
unsigned char ser1_rx_w,ser1_rx_r;
char verify1;   //0 1 2    无 奇 偶
bit tx1_ok;
#endif

//extern unsigned char data ser1_buf_rx[SERIAL_BUF_SIZE];
//extern unsigned char ser1_rx_w,ser1_rx_r;
//extern char verify1;   //0 1 2    无 奇 偶
//extern bit tx1_ok;    //发送是否完成


/*
设置串口1通讯参数
入口: baud= 0  9600
            1  19200
            2  38400
            3  1200
            4  28800
            5  57600
            6  115200
            7  300
            8  600
            9  2400
            10 4800
返回:   1: 成功
        0: 失败
*/
bit set_ser_port1(char baud, char databit,char stopbit,char ver)
{
  unsigned int baudcap;

/*  SM0=0; SM1=0;       串行口以 f/12的速率作串行同步移位 */
/*  SM0=0; SM1=1;       8位数据 1位停止 正常通讯 */
/*  SM0=1; SM1=0;       8位数据 1位标志 1位停止 用于多机通讯,但波特率不能变,一
般不用 */
/*  SM0=1; SM1=1;       同上 但波特率能变 */

verify1=ver;

if(ver==0)
{
    SM0_1=0; SM1_1=1;         /* 无校验,正常点对点通讯 */
}
else if(ver==1 || ver==2)
{
    SM0_1=1; SM1_1=1;         /* 奇偶校验, 多机通讯 */
    SM2_1=0;
}
REN_1=1;                /* 允许接收 */

    TMOD=TMOD & 0x0f;  /* 把 TMOD 的高字节设为2 */
    TMOD=TMOD | 0x20;  /* 使 T1 工作于模式2 即提供波特率 */
    #ifdef FREQ11
           switch(baud)
           {
                case 0: TL1=TH1=0-3;   WDCON &=0x7F; break;   /* 9600 11M  
DOUBLE */
                case 1: TL1=TH1=0-3;   WDCON |=0x80; break;   /* 19200 11M 
DOUBLE */
                case 2: return 0;  //                    break;   /* 38400 11M 
No */
                case 3: TL1=TH1=0-24;  WDCON &=0x7F; break;   /* 1200 11M 
DOUBLE */
                case 4: TL1=TH1=0-1;   WDCON &=0x7F; break;   /* 28800 11M 
DOUBLE */
                case 5: TL1=TH1=0-1;   WDCON |=0x80; break;   /* 57600 11M 
DOUBLE */
                case 6: return 0;   //                   break;   /* 115200 11M 
No */
                case 7: TL1=TH1=0-96;  WDCON &=0x7F; break;   /* 300 11M DOUBLE 
*/
                case 8: TL1=TH1=0-48;  WDCON &=0x7F; break;   /* 600 11M DOUBLE 
*/
                case 9: TL1=TH1=0-12;  WDCON &=0x7F; break;   /* 2400 11M 
DOUBLE */
                case 10: TL1=TH1=0-6;  WDCON &=0x7F; break;   /* 4800 11M 
DOUBLE */
           }
    #endif
    #ifdef FREQ22
           switch(baud)
           {
                case 0: TL1=TH1=0-12;   WDCON |=0x80; break;   /* 9600 11M  
DOUBLE */
                case 1: TL1=TH1=0-6;   WDCON |=0x80; break;   /* 19200 11M 
DOUBLE */
                case 2: TL1=TH1=0-3;   WDCON |=0x80; break;   /* 38400 11M No */
                case 3: TL1=TH1=0-96;  WDCON |=0x80; break;   /* 1200 11M 
DOUBLE */
                case 4: TL1=TH1=0-4;   WDCON |=0x80; break;   /* 28800 11M 
DOUBLE */
                case 5: TL1=TH1=0-2;   WDCON |=0x80; break;   /* 57600 11M 
DOUBLE */
                case 6: TL1=TH1=0-1;   WDCON |=0x80;  break;   /* 115200 11M No 
*/
                case 7: TL1=TH1=0-192;  WDCON &=0x7f; break;   /* 300 11M 
DOUBLE */
                case 8: TL1=TH1=0-192;  WDCON |=0x80; break;   /* 600 11M 
DOUBLE */
                case 9: TL1=TH1=0-48;  WDCON |=0x80; break;   /* 2400 11M 
DOUBLE */
                case 10: TL1=TH1=0-24;  WDCON |=0x80; break;   /* 4800 11M 
DOUBLE */
           }
    #endif
          TR1=1;

ser1_rx_w = ser1_rx_r =0;
tx1_ok=1;
ES_1=1; EA=1;
return 1;
/*   IE=0;     */   /*  全部中断清0  */
/*   ES =1;    */   /*  串行中断     */
/*   IP=0x10;  */   /* 串行中断优先  */
/*  EA=1;      */
}

void ser1_int() interrupt 7       //串口1中断
{
  char c;
  if(TI_1==1) {TI_1=0; tx1_ok=1; return; }
  RI_1=0;
  ser1_buf_rx[ser1_rx_w++]=SBUF1;
  if(ser1_rx_w==SERIAL_BUF_SIZE)ser1_rx_w--;  //保证程序不会因指针超出而出错
}




发表时间:2002年11月7日17:08:00

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:初学者:请问各位大虾,哪能当到打印机并口的驱动程序。
[下一篇帖子]:初学者:哪位大侠帮帮忙啊!(quartus)老古的quartus全功能license要怎么用啊? B