📄 uart0.#1
字号:
#include <main.H>
#include <stdio.h>
//#include <C8051F020.H>
/*修改时钟!!!!*/
/*帧错误和传输错误监测需要吗?查询方式?只是具有发送功能?*/
void UART0_transmit (unsigned int *samples, unsigned int numSample)
{
volatile int i;
// SFRPAGE=0x0F;
// WDTCN = 0xde; // disable watchdog timer
// WDTCN = 0xad;
//Timer1_Init();
//SYSCLK_Init ();
// PORT_Init (); // initialize crossbar and GPIO
UART0_Init (); // initialize UART0
//Timer2_Init (65536-(SYSCLK/SAMPLE_RATE/32/2)); //可选择定时器1或2作为波特率发生器
// Timer1_Init();
//??????????? ES0 =1; // sample rat//允许RI0或TI0产生中断。中断号为4
//EA =1; // Enable global interrupts
//ES0 =1; // sample rat//??RI0?TI0????
// EA =1; // Enable global interrupts
EA=0;
LED = 0;
while (1)
{ // disable interrupts
SFRPAGE=0x0;
for(i=0;i<numSample;i++)
{
TI0=0;
SBUF0=(samples[i]>>8)&0x0F;
while(TI0==0);
TI0=0;
SBUF0=samples[i]&0xFF;
while(TI0==0);
TI0=0;
LED=~LED;
//break;
}
break;
}
TR1=0;//停止定时器1
SCON0 &=0xEF; //禁止接收
TI0=0;
RI0=0;
ES0=0;
EA=0;
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
/*void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}*/
/*//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_UARTO_Init (void)
{
XBR0 = 0x04; // Enable UART0
XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT |= 0x01; // enable TX0 as a push-pull output
P1MDOUT |= 0x40; // enable P1.6 (LED) as push-pull output
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
}
//----------------------------------------------------------------------------
void Timer1_UARTO_Init(void)
{
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK_UART0/BAUDRATE/16); // set Timer1 reload value for baudrate
//TH1 = 70;
//TL1 = 70;
// ET1 = 1;
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x80; // SMOD00 = 1
} */
void PORT_Init (void)
{
SFRPAGE=0x0F;
XBR0 = 0x05; //UART0,SMbus0接到端口引脚
XBR1 = 0x04; //外部中断0接到端口引脚(P0.4)
//XBR0 = 0x04; //使能UART0
//XBR1 = 0x00;
XBR2 = 0x40; // 使能交叉开关和弱上拉
//P0MDOUT |=0x0D;
P0MDOUT |=0x01;
// P0MDOUT |= 0x01; // ??TX0?????
P1MDOUT |= 0x40; // ??P1.6(LED)?????
}
//-----------------------------------------------------------------------------
// UART0初始化
//-----------------------------------------------------------------------------
//
// 配置UART0 使用定时器1为波特率发生器
//
void UART0_Init (void)
{
SFRPAGE=0x0;
SCON0 = 0x50; // SCON0: 模式1(异步方式,数据位8,一个起始位和一个停止位), 8位UART,可变波特率。使能RX
/*修改 */
//TL1 = -(SYSCLK_AD/BAUDRATE/16);
TH1 = -(SYSCLK_AD/BAUDRATE/16); // 根据波特率的值设定定时器1重装值
//TH1 = -(24500000/BAUDRATE/16/8);
CKCON |= 0x10; // 定时器1使用系统时钟作为时基(T1M=1)
//PCON |= 0x80; // SMOD00 = 1
SSTA0 |=0x10;//SMOD00 = 1,禁止系统时钟/2
TL1=TH1;
//TR1 = 1; // 启动定时器1
TMOD = 0x20; // TMOD: 定时器1, 模式2, 8位重装
TR1 = 1; // 启动定时器1
TI0 = 1; // 表示TX0就绪
}
//void UART0_ISR(void) interrupt 4
//{
//for(i=0;i<=numSample;i++)
// {
// SFRPAGE=0x0;
//TI0=0;
//SBUF0=numSample;
//SBUF0=samples[i];
//while(TI0==0);
//TI0=0;
//SBUF0=samples[i]&0xFF;
//SBUF0=0xFF;
//while(TI0==0);
// TI0=0;
// SBUF0=(samples[i]>>8)&0x0F;
// while(TI0==0);
// TI0=0;
// LED=~LED;
// }
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -