S
sidartha
Guest
我试图代码sotware UART和一个8051C410硬件UART ..
硬件UART是同PC上附加传感器的软件UART通信..然而
, 尽管硬件UART的正常工作的软件UART不..
我重视的代码
, 并希望有人能够帮助我在这里..[/代码]
/ /#杂注大
#包括<c8051f410.h>
#包括<stdio.h>
#包括<string.h>
#包括<stdlib.h>#定义系统时钟8分之24500000
#定义波特率9600#定义TIME_COUNT SYSCLK/9600/12 / /主成分分析计数1位的时间。
#定义TH_TIME_COUNT TIME_COUNT * 3 / 2 / / 3 / 2位时,常设仲裁法院/ SWUART//------------------------------------------------ ----------------------------------------------
sbit SW_TX =的P2 ^ 6;
sbit SW_RX =小^ 0;位SM_BUSY;
位斯里兰卡; / / SW_UART接收完整的指标
位性病; / / SW_UART传输完成指标
位STXBSY; / / SW_UART德克萨斯州忙标志
位瑟伦; / / SW_UART Rx启用
位经济局局长; / / SW_UART用户级中断支持
字符贸发报告; / / SW_UART德克萨斯州数据寄存器
字符共和; / / SW_UART收发数据寄存器
//------------------------------------------------ ----------------------------------------------
/ /函数原型
//------------------------------------------------ ----------------------------------------------
无效init_uart0(无效);
无效SYSCLK_Init(无效);
无效PORT_Init(无效);
无效enable_intr(无效);
无效init_swuart(无效);
无效WriteSwuart(字符*指针);//------------------------------------------------ ----------------------------------------------
/ /主例程
//------------------------------------------------ ----------------------------------------------
无效的主要(无效)(
实体数据字符海峡[100];
廉政= 0,ñ = 0;
PCA0MD&=〜0x40; / / WDTE = 0(清除看门狗定时器
PCA0MD = 0X00;
PORT_Init(); / /初始化交叉和GPIO
SYSCLK_Init(); / /初始化系统时钟
init_uart0();
init_swuart();
enable_intr();
工商局局长= 1;
而(1)
(
sprintf(海峡,“你好%d个\ r”开始,格 );
WriteSwuart(海峡);
)
)
//------------------------------------------------ ----------------------------------------------
无效WriteSwuart(字符*指针)(
位传输= 1;
虽然(传输)(
如果(性病)(
工商局局长= 0;
贸发= *指针;
如果(*指针=='\ R')的传输= 0;
CCF1 = 1;
指针 ;
)
)
)
//------------------------------------------------ ----------------------------------------------
无效SYSCLK_Init(无效)
(
OSCICN = 0x84;
)
//------------------------------------------------ ----------------------------------------------
无效PORT_Init(无效)
(
P0SKIP = 0xCF;
XBR0 = 0x01; / / UART0和提供SPI,SMBus选择
XBR1 = 0x41; / /允许交叉开关和弱上拉
P1MDOUT | = 0xFF;
P2MDOUT | = 0xFF;
稀土= 0;
P0MDIN =〜0x08;
)
//------------------------------------------------ ----------------------------------------------
无效init_uart0(无效)
(
SCON0 = 0x10;
TH1 = - (SYSCLK/BAUDRATE/2);
CKCON&=〜0X0B;
CKCON | = 0X08;
TL1 = TH1;
TMOD&=〜0XF0;
TMOD | = 0X20;
TR1的= 1;
TI0 = 1;
)
//------------------------------------------------ ----------------------------------------------
无效enable_intr(无效)(
瑟伦= 0; / /禁用SW_UART接收机
公约与= 1; / /启动PCA计数器。
EIE1 | = 0x10;
EIE1 | = 0x81; / /提供SPI,SMBus中断使能
EIP1 | = 0x01;
EX0 = 1;
IT0 = 1;
ET2 = 1;
ES0 = 1;
鄂A = 1;
)
//------------------------------------------------ ----------------------------------------------
无效init_swuart(无效)(
PCA0CPM0 = 0x10; / /负捕获模式Module0;
/ /模块0中断禁用。
PCA0CPM1 = 0x48; / /模块1在软件定时器模式;
/ / Module1的中断禁用。
PCA0CN = 0; / /给主成分禁用
PCA0MD | = 0x00; / /主成分分析时基=系统时钟/ 4; PCA计数器
/ /中断禁用。
CCF0 = 0; / /清除待主成分分析模块0
CCF1 = 0; / /模块1捕捉/比较中断。
斯里兰卡= 0; / /清除接收完整的标志。
工商局局长= 0; / /清除发送完成标志。
SW_TX = 1; / / TX线初期高。
STXBSY = 0; / /清除SW_UART忙标志
PCA0CPM0 | = 0x01; / /启用模块0(接收)中断。
PCA0CPM1 | = 0x01; / /启用模块1(传输)中断。
)
//------------------------------------------------ ----------------------------------------------
/ /软件UART ////////////////////////////////////////////// //////////////////
//------------------------------------------------ ----------------------------------------------
无效PCA_ISR(无效)中断11(
静态字符SUTXST = 0;
静态字符SURXST = 0;
静态无符号字符RXSHIFT;
无符号整型PCA_TEMP;
如果(CCF0)(
CCF0 = 0;
开关(SURXST)(
案件0:
如果(瑟伦&〜SW_RX)(
PCA_TEMP =(PCA0CPH0“”8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TH_TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 =(PCA_TEMP“”8);
PCA0CPM0 = 0x49;
SURXST ;
)
中断;
例1:例2:例3:例4:例5:例6:例7:例8:
RXSHIFT = RXSHIFT“”1;
如果(SW_RX)
RXSHIFT | = 0x80;
PCA_TEMP =(PCA0CPH0“”8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 =(PCA_TEMP“”8);
SURXST ;
中断;
案例9:
共和= RXSHIFT;
斯里兰卡= 1;
PCA0CPM0 = 0x11;
SURXST = 0;
中断;
)
)
/ /检查发送中断;服务如果CCF1设置。
否则
, 如果(CCF1)(
CCF1 = 0;
开关(SUTXST)(
案件0:
SW_TX = 0;
PCA_TEMP = PCA0L;
PCA_TEMP | =(PCA0H“”8);
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 =(PCA_TEMP“”8);
PCA0CPM1 | = 0x48;
SUTXST ;
中断;
例1:例2:例3:例4:例5:例6:例7:例8:例9:
SW_TX =计(TDR&0x01)后;
贸易和发展报告“”= 1;
贸发报告| = 0x80;
PCA_TEMP =(PCA0CPH1“”8);
PCA_TEMP | = PCA0CPL1;
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 =(PCA_TEMP“”8);
SUTXST ;
中断;
案例10:
工商局局长= 1;
SUTXST = 0;
SW_TX = 1;
PCA0CPM1 = 0x01;STXBSY = 0;
中断;
)
)
)
硬件UART是同PC上附加传感器的软件UART通信..然而
, 尽管硬件UART的正常工作的软件UART不..
我重视的代码
, 并希望有人能够帮助我在这里..[/代码]
/ /#杂注大
#包括<c8051f410.h>
#包括<stdio.h>
#包括<string.h>
#包括<stdlib.h>#定义系统时钟8分之24500000
#定义波特率9600#定义TIME_COUNT SYSCLK/9600/12 / /主成分分析计数1位的时间。
#定义TH_TIME_COUNT TIME_COUNT * 3 / 2 / / 3 / 2位时,常设仲裁法院/ SWUART//------------------------------------------------ ----------------------------------------------
sbit SW_TX =的P2 ^ 6;
sbit SW_RX =小^ 0;位SM_BUSY;
位斯里兰卡; / / SW_UART接收完整的指标
位性病; / / SW_UART传输完成指标
位STXBSY; / / SW_UART德克萨斯州忙标志
位瑟伦; / / SW_UART Rx启用
位经济局局长; / / SW_UART用户级中断支持
字符贸发报告; / / SW_UART德克萨斯州数据寄存器
字符共和; / / SW_UART收发数据寄存器
//------------------------------------------------ ----------------------------------------------
/ /函数原型
//------------------------------------------------ ----------------------------------------------
无效init_uart0(无效);
无效SYSCLK_Init(无效);
无效PORT_Init(无效);
无效enable_intr(无效);
无效init_swuart(无效);
无效WriteSwuart(字符*指针);//------------------------------------------------ ----------------------------------------------
/ /主例程
//------------------------------------------------ ----------------------------------------------
无效的主要(无效)(
实体数据字符海峡[100];
廉政= 0,ñ = 0;
PCA0MD&=〜0x40; / / WDTE = 0(清除看门狗定时器
PCA0MD = 0X00;
PORT_Init(); / /初始化交叉和GPIO
SYSCLK_Init(); / /初始化系统时钟
init_uart0();
init_swuart();
enable_intr();
工商局局长= 1;
而(1)
(
sprintf(海峡,“你好%d个\ r”开始,格 );
WriteSwuart(海峡);
)
)
//------------------------------------------------ ----------------------------------------------
无效WriteSwuart(字符*指针)(
位传输= 1;
虽然(传输)(
如果(性病)(
工商局局长= 0;
贸发= *指针;
如果(*指针=='\ R')的传输= 0;
CCF1 = 1;
指针 ;
)
)
)
//------------------------------------------------ ----------------------------------------------
无效SYSCLK_Init(无效)
(
OSCICN = 0x84;
)
//------------------------------------------------ ----------------------------------------------
无效PORT_Init(无效)
(
P0SKIP = 0xCF;
XBR0 = 0x01; / / UART0和提供SPI,SMBus选择
XBR1 = 0x41; / /允许交叉开关和弱上拉
P1MDOUT | = 0xFF;
P2MDOUT | = 0xFF;
稀土= 0;
P0MDIN =〜0x08;
)
//------------------------------------------------ ----------------------------------------------
无效init_uart0(无效)
(
SCON0 = 0x10;
TH1 = - (SYSCLK/BAUDRATE/2);
CKCON&=〜0X0B;
CKCON | = 0X08;
TL1 = TH1;
TMOD&=〜0XF0;
TMOD | = 0X20;
TR1的= 1;
TI0 = 1;
)
//------------------------------------------------ ----------------------------------------------
无效enable_intr(无效)(
瑟伦= 0; / /禁用SW_UART接收机
公约与= 1; / /启动PCA计数器。
EIE1 | = 0x10;
EIE1 | = 0x81; / /提供SPI,SMBus中断使能
EIP1 | = 0x01;
EX0 = 1;
IT0 = 1;
ET2 = 1;
ES0 = 1;
鄂A = 1;
)
//------------------------------------------------ ----------------------------------------------
无效init_swuart(无效)(
PCA0CPM0 = 0x10; / /负捕获模式Module0;
/ /模块0中断禁用。
PCA0CPM1 = 0x48; / /模块1在软件定时器模式;
/ / Module1的中断禁用。
PCA0CN = 0; / /给主成分禁用
PCA0MD | = 0x00; / /主成分分析时基=系统时钟/ 4; PCA计数器
/ /中断禁用。
CCF0 = 0; / /清除待主成分分析模块0
CCF1 = 0; / /模块1捕捉/比较中断。
斯里兰卡= 0; / /清除接收完整的标志。
工商局局长= 0; / /清除发送完成标志。
SW_TX = 1; / / TX线初期高。
STXBSY = 0; / /清除SW_UART忙标志
PCA0CPM0 | = 0x01; / /启用模块0(接收)中断。
PCA0CPM1 | = 0x01; / /启用模块1(传输)中断。
)
//------------------------------------------------ ----------------------------------------------
/ /软件UART ////////////////////////////////////////////// //////////////////
//------------------------------------------------ ----------------------------------------------
无效PCA_ISR(无效)中断11(
静态字符SUTXST = 0;
静态字符SURXST = 0;
静态无符号字符RXSHIFT;
无符号整型PCA_TEMP;
如果(CCF0)(
CCF0 = 0;
开关(SURXST)(
案件0:
如果(瑟伦&〜SW_RX)(
PCA_TEMP =(PCA0CPH0“”8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TH_TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 =(PCA_TEMP“”8);
PCA0CPM0 = 0x49;
SURXST ;
)
中断;
例1:例2:例3:例4:例5:例6:例7:例8:
RXSHIFT = RXSHIFT“”1;
如果(SW_RX)
RXSHIFT | = 0x80;
PCA_TEMP =(PCA0CPH0“”8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 =(PCA_TEMP“”8);
SURXST ;
中断;
案例9:
共和= RXSHIFT;
斯里兰卡= 1;
PCA0CPM0 = 0x11;
SURXST = 0;
中断;
)
)
/ /检查发送中断;服务如果CCF1设置。
否则
, 如果(CCF1)(
CCF1 = 0;
开关(SUTXST)(
案件0:
SW_TX = 0;
PCA_TEMP = PCA0L;
PCA_TEMP | =(PCA0H“”8);
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 =(PCA_TEMP“”8);
PCA0CPM1 | = 0x48;
SUTXST ;
中断;
例1:例2:例3:例4:例5:例6:例7:例8:例9:
SW_TX =计(TDR&0x01)后;
贸易和发展报告“”= 1;
贸发报告| = 0x80;
PCA_TEMP =(PCA0CPH1“”8);
PCA_TEMP | = PCA0CPL1;
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 =(PCA_TEMP“”8);
SUTXST ;
中断;
案例10:
工商局局长= 1;
SUTXST = 0;
SW_TX = 1;
PCA0CPM1 = 0x01;STXBSY = 0;
中断;
)
)
)