📄 c8051f340uart1中断接收.c
字号:
#include <c8051f340.h>
#include <intrins.h>
#include <ABSACC.h>
#define uchar unsigned char
#define uint unsigned int
void UART1_Init (void);
void Port_IO_Init(void);
uchar fshc;
/////////////////////////////////////////////////////////////////////
bit uart0bz; //串口0标志
bit uart1bz; //串口1标志
uint uart0js;//串口0接收计数
uint uart1js;//串口1接收计数
uint tim0js;//timer0计数
uint tim2js;//timer2计数
uchar xdata rxbuf1[20];
uchar xdata rxbuf0[20];
////////////////////////////////////////////////////////////////////
sfr16 TMR2RL = 0xCA; // Timer2 Reload Register
sfr16 TMR2 = 0xCC; // Timer2 Register
#define SYSCLK 12000000 // SYSCLK in Hz (12 MHz internal
#define TIMER_PRESCALER 12 // Based on Timer2 CKCON and TMR2CN
#define LED_TOGGLE_RATE 50 // LED toggle rate in milliseconds
#define TIMER_TICKS_PER_MS SYSCLK/TIMER_PRESCALER/1000
#define AUX1 TIMER_TICKS_PER_MS*LED_TOGGLE_RATE
#define AUX2 -AUX1
#define TIMER2_RELOAD AUX2 // Reload value for Timer2
sbit LED=P2^1;
sbit DYKG=P2^3; //0开 1关
sbit PWG=P2^2; //1关,0开
/*****************************************************************
*
*初始化计数器0
*****************************************************************/
void timer0_init(void)
{
CKCON &=0xf7; //定时器0的计数源选择系统脉冲的12分频
TMOD =0X01; //定时器0,方式1
TH0 =0X3C;
TL0 =0XB0;
IE |=0x82;
TCON |=0X10; //启动定时器0
TR0 =1;
}
/*****************************************************************
*
*初始化计数器2
*****************************************************************/
void Timer2_Init(void)
{
CKCON &= ~0x60; // Timer2 uses SYSCLK/12
TMR2CN &= ~0x01;
TMR2RL = TIMER2_RELOAD; // Reload value to be used in Timer2
TMR2 = TMR2RL; // Init the Timer2 register
TMR2CN = 0x04; // Enable Timer2 in auto-reload mode
ET2 = 1; // Timer2 interrupt enabled
}
/****************************************************************
*
*UART0初始化程序
*****************************************************************/
void UART0_Init (void)
{
SCON0 |= 0x10; //8位 UART,允许接收
CKCON = 0x01; //系统时钟的/12
TH1 = 0x64; //波特率为9600
TL1 = TH1;
TMOD = 0x20;
TR1 = 1;
ES0 = 1;
EA = 1;
}
/****************************************************************
*
*UART1初始化
*****************************************************************/
void UART1_Init (void)
{
SBRLL1 =0XCC;
SBRLH1 =0XFf; //波特率 9600 内部12M 晶振
SCON1 =0X30; //允许接收,准备好接收
SMOD1 =0X6C; //8位数据位,无奇偶校验,一位停止位;
SBCON1 =0X43; //使能UART1,1分频
EIE2 =0x02; //不允许中断
}
void System_Init(void)
{
EMI0CF = 0x43;
PCA0MD &= ~0x40; //关闭看门狗定时器
OSCICN |= 0x03; //内部高频振荡器使能且振荡器按编程频率来运行
Port_IO_Init();
timer0_init();
Timer2_Init();
UART1_Init ();
UART0_Init ();
}
/*****************************************************************
*
*端口初始化函数
*****************************************************************/
void Port_IO_Init(void)
{
P0SKIP = 0xCF;
P1SKIP = 0xFF;
P2SKIP = 0xFF;
XBR2 = 0x01; //uart1 使能 p3.0,p3.1
XBR0 = 0x01; //P0.4 P0.5接到串口0上uart0
XBR1 = 0x40; //交叉开关 XBARE 使能
P2MDOUT=0xff;
}
/*****************************************************************
*功能:定时器0 中断服务函数
*资源:寄存器组2
*****************************************************************/
void T0_Interrupt(void) interrupt 1 using 1 ///2ms
{
TH0=0X3C;
TL0=0XB0;
TR0=1;
}
/*****************************************************************
*功能:定时器2 中断服务函数
*资源:寄存器组2
*****************************************************************/
void Timer2_ISR (void) interrupt 5
{
TF2H = 0; // Reset Interrupt
}
/*****************************************************************
*功能:串行接收 uart0中断服务函数
*资源:寄存器组2
*****************************************************************/
void UART0_Interrupt(void) interrupt 4 using 2
{
if(RI0){
ES0=0;
RI0=0;
rxbuf0[uart0js]=SBUF0;
uart0js++;
uart0bz=1;
ES0=1;
}
}
/*****************************************************************
*功能:串行接收 uart1中断服务函数
*资源:寄存器组3
*出口:Interput_Char
*****************************************************************/
void UART1_Interrupt(void) interrupt 16 using 3
{
if (SCON1&0x01){
SCON1 = 0x30; //RI1、TI1=0
EIE2 &= 0xfD;
uart1js++;
rxbuf1[uart1js]=SBUF1;
if (uart1js==10){
uart1js=0;
uart1bz=1;
}
}
EIE2|= 0x02;
}
/***************************************************************///UART0单字节发送
void UART0TX(uchar com){
ES0=0;
SBUF0=com;
while(TI0==0);
TI0=0;
ES0=1;
}
void main(void){
System_Init();
uart1bz=0;
while(1){
if(uart0bz){
UART0TX(rxbuf0[0]);
uart0js=0;
uart0bz=0;
}
if (uart1bz){
uart1js=0;
uart1bz=0;
SBUF1 = rxbuf1[9];
while (!(SCON1 & 0x02)); // wait until UART1 is ready to transmit
SCON1 &= ~0x02; // clear TI1 interrupt flag
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -