//单片机用 PIC18F25K22 I/SO
//晶振用11.0592MHz
#include <htc.h>
typedef unsigned char UCHAR;
typedef unsigned int UINT;
typedef unsigned long ULONG;
//配置字Page351
//CONFIG1H=8b'1111_0010 //bit7:IESO=1,则bit6:FCMEN必须为1,0010 = HS 振荡器(高功耗 >16 MHz)
//CONFIG2L=8b'---0_0110
//CONFIG2H=8b'---0_0110 ??
//CONFIG3H=8b'1-01_0001
//CONFIG4L=8b'10--_-1-1
//CONFIG5L=8b'----_0000
//CONFIG5H=8b'00--_----
//CONFIG6L=8b'----_0000
//CONFIG6H=8b'000-_----
//CONFIG7L=8b'----_0000
//CONFIG7H=8b'-0--_----
__PROG_CONFIG(1,0xf200);
__PROG_CONFIG(2,0x0606);
__PROG_CONFIG(3,0x9100);
__PROG_CONFIG(4,0x0085);
__PROG_CONFIG(5,0x0000);
__PROG_CONFIG(6,0x0000);
__PROG_CONFIG(7,0x0000);
void F25K22init(void);
void USART1_init(void);
void SPI2_init(void);
void SendAChr1(UCHAR dat);
void delayms(UCHAR cy);
void main(void)
{
//UINT ix;
volatile UCHAR ci;
F25K22init();
USART1_init();
SPI2_init();
ci = 0x37;
for(;;)
{
SendAChr1(ci);
}
}
void F25K22init(void)
{
ANSELA &= 0xd0; //PORTA数字功能
ANSELB &= 0xc0; //PORTB数字功能
ANSELC = 0x03; //PORTC数字功能
PORTA &= 0xfd; //RA1=0
LATA &= 0xfd; //
TRISA &= 0xc0;
PORTB = 0xc1; //
LATB = 0xc1;
TRISB = 0x24;
PORTC = 0x1f; //
LATC = 0x1f;
TRISC = 0xc0;
PMD2 = 0x0f; //CTMUMD CMP2MD CMP1MD ADCMD全禁止
WDTCON = 0x0; //看门狗定时器控制寄存器,0 = WDT 关闭
CTMUCONH = 0x0;
}
void USART1_init(void)
{
UCHAR i;
// TRISCbits.TRISC6 = 1; // TX1,串口1发送 //
// TRISCbits.TRISC7 = 1; // RX1,串口1接收
SPBRGH1 = 0x1; // 波特率9600
SPBRG1 = 0x1f; //
ANSELC = 0x00; //PORTC数字功能
TRISC = 0xc0;
TXSTA1bits.SYNC = 0; // SYNC=0 BRGH16=1 BRGH=1 ,FOSC/[4 (n + 1)]
RCSTA1 = 0x90; //SPEN:串口使能位=1; CREN:连续接收使能位=1
//RCSTA1 = RCSTA1|0x80;// 串口使能
//RCSTA1bits.CREN = 1; // 接收使能
//BAUDCON1bits.BRG16 = 1; //16位异步
BAUDCON1 = 0x48; //BRG16 = 1 16位异步,ABDOVF RCIDL DTRXP CKTXP BRG16 — WUE ABDEN
TXSTA1bits.BRGH = 1;
TXSTA1bits.TX9 = 0; //8 DATA
RCSTA1bits.RX9 = 0;
SSP1CON1bits.SSPEN1 = 0;
TXSTA1bits.TXEN = 1; // 发送使能
PMD0 = 0xbf; //bit 6 UART1MD:UART1 外设模块禁止控制位
i = RCREG1;
PIR1 = 0x0; //bit5: RC1IF,bit4: TX1IF
PIE1bits.RC1IE = 0; // 允许串口1接收使能
//PIE1 bit5: RC1IE, bit4: TX1IE
PIE1bits.TX1IE = 0;
IPR1 = 0x0; //RC1IP TX1IP都为0
}
void SPI2_init(void)
{
ANSELB &= 0xc0; //PORTB数字功能
PORTB = 0xc1; //
LATB = 0xc1;
TRISB = 0x24;
//SPI速率 Fosc/16=11059200/16 =691200
SSP2CON1 = 0x1;
SSP2CON2 = 0x0; //用于IIC
SSP2CON3 = 0x0;
//SSP2STAT = 0x
SSP2STATbits.SMP=0; //0 = 在数据输出时间的中间采样输入数据
SSP2STATbits.CKE=0; //0 = 时钟状态从空闲转换到有效时发送
SSP2CON1bits.SSPEN2=1;
PIR3 &= 0x7f; //bit7 SSP2IF:同步串口中断标志位
PIE3 |= 0x80; //bit7 SSP2IE:同步串口 2 中断允许位
//PIE3 bit6 BCL2IE:MSSP2 总线冲突中断允许位
//MSSP2MD MSSP1MD — CCP5MD CCP4MD CCP3MD CCP2MD CCP1MD
PMD1 = 0x5f; //bit 7 MSSP2MD:MSSP2 外设模块禁止控制位,0 = 使能模块
}
void SendAChr1(UCHAR dat)
{
volatile UCHAR cx;
UINT index;
for (index = 0; index < 1000; index++)//检测发送器是否为空
{
if (TXSTA1bits.TRMT == 1) // 发送移位寄存器状态位 1 = TSR 空 0 = TSR 满
break;
}
TXREG1 = dat; //把数据写入缓冲区
PIR1bits.TX1IF=0; //发送中断清零
cx = RCREG1;
delayms(10); //Dly10us(1);
}
void delayms(UCHAR cy) //延时函数
{
UINT ia;
UCHAR i;
for(i=cy; i>0; i--)
{
for(ia=0x133; ia>0; ia--)
{ asm("NOP"); asm("NOP"); }
}
}
单片机用的是PIC18F25K22 I/SO,晶振用的是11.0592MHz,使用串口1,
波特率9600,串口只发送,现在串口用电脑调试工具只能收到0xff。这程序就是参考网友的啊。我要发0x37,实际只看到0xff,请广大网友帮看看,非常感谢啊 |