单片机各个模块程序代码.docx
《单片机各个模块程序代码.docx》由会员分享,可在线阅读,更多相关《单片机各个模块程序代码.docx(7页珍藏版)》请在冰豆网上搜索。
单片机各个模块程序代码
12C5A12C5A12C5A12C5A12C5A12C5A12M6M3M1.5M12C5A12C5A闲模式,低速模式
12C5A0f12C5A2A12C5A12C5A12C5A0c12C5A12C5A12C5A0L0L7f0a0L0L0L0L0L0L0L0L0L12C5A12C5A12C5A12C5A12C5A速.同步的通信总线,有两种操作模式:
主模式和从模式。
12C5A12C5A12C5A速.同步的通信总线,有两种操作模式:
主模式和从模式。
//
//涉及寄存器:
SPCTL(SPI控制寄存器)、SPSTAT(SPI状态寄存器)、SPDAT(数据寄存器)
//AUXR1(辅助寄存器)
////
//程序说明:
本程序为SPI的从机程序,从机通过SPI接收主机发送过来的数据,并通过串口
//显示到PC端,
//
//****************************************************************************//
#include<12C5A>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
/************对SPCTL寄存器的设置位宏定义*************/
#defineSSIG0x80//SS引脚忽略
#defineSPEN0x40//SPI使能位
#defineDORD0x20//SPI数据发送LSB最先发送
#defineMSTR0x10//主从模式选择
#defineCPOL0x08//SPICLK空闲时为高电平
#defineCPHA0x04//数据在SPICLK的前时钟沿驱动,并在后时钟沿采样
#defineSP_CLK00x00//SPI时钟频率为CPU_CLK/4
#defineSP_CLK10x01//SPI时钟频率为CPU_CLK/16
#defineSP_CLK20x02//SPI时钟频率为CPU_CLK/64
#defineSP_CLK30x03//SPI时钟频率为CPU_CLK/128
/************对SPSTAT寄存器的设置位宏定义************/
#defineSPIF0x80//传输完成标志
#defineWCOL0x40//SPI写冲突标志
/************SPI口切换宏定义***************/
#defineSPI_P40x20//SPI从P1口切换到P4口
/************波特率选择********************/
#defineBTL9600//若要更改波特率直接更改此处,当波特率大于9600时需修改相应的接收程序,
//可选波特率有以下:
否则有可能出现乱码
//波特率为2400//波特率为28800
//波特率为4800//波特率为38400
//波特率为9600//波特率为57600
//波特率为14400//波特率为115200
//波特率为19200
voidUART_init(void);
ucharReceive(void);
voidPrintf(uchar*p);
voidInit_SPI(void);
voidSend_byte(ucharbyte);
//****************************************//
//串口初始化//
//****************************************//
voidUART_init(void)
{
//SM0=0;//选择串口为方式1工作
//SM1=1;//8位数据波特率可变
//REN=1;//允许串口接收
SCON=0x50;
#if(BTL==2400)
BRT=0x70;//波特率设置为9600
#elif(BTL==4800)
BRT=0xB8;
#elif(BTL==9600)
BRT=0xDC;
#elif(BTL==14400)
BRT=0xE8;
#elif(BTL==19200)
BRT=0xEE;
#elif(BTL==28800)
BRT=0xF4;
#elif(BTL==38400)
BRT=0xF7;
#elif(BTL==57600)
BRT=0xFA;
#elif(BTL==115200)
BRT=0xFD;
#endif
AUXR=0x15;//选择独立波特率发生器为串行
//口的波特率发生器,模式为1T
//ES=1;//允许串口中断
//IPH=0X10;//PSH=1;
//IP=0X10;//PS=1;串口1中断为最高优先级中断
//EA=1;//开总中断
}
//************************************************//
//发送一个字节数据//
//************************************************//
voidSend_byte(ucharbyte)
{
SBUF=byte;
while(!
TI);
TI=0;
}
//************************************************//
//打印字符//
//************************************************//
voidPrintf(uchar*p)
{
while(*p!
='\0')
{
Send_byte(*p);
p++;
}
}
//************************************************//
//接收函数//
//************************************************//
ucharReceive(void)
{
ucharbyte;
_nop_();
_nop_();
_nop_();
_nop_();
if(RI==1)
{
RI=0;
byte=SBUF;
}
returnbyte;
}
//***********************************//
//*名称:
Init_SPI()
//*功能:
对SPI进行初始化
//*输入:
无
//*输出:
无
//***********************************//
voidInit_SPI(void)
{
SPDAT=0;//清空数据寄存器
SPSTAT=SPIF|WCOL;//清空SPI状态寄存器
SPCTL=SPEN;//SPI设置为从机模式
IE2=0x02;//允许SPI中断
}
//***********************************//
//*名称:
main
//*功能:
//*输入:
无
//*输出:
无
//***********************************//
voidmain()
{
ucharflag=0;
UART_init();
Init_SPI();
EA=1;//开总中断
while
(1)
{
flag=Receive();
if(flag)//当PC端有给从机发送数据时把从机当前的SPDAT值发送出来
{
Send_byte(SPDAT);
flag=0;
}
}
}
//***********************************//
//*名称:
SPI_ISR()
//*功能:
SPI中断服务
//*输入:
无
//*输出:
无
//***********************************//
voidSPI_ISR(void)interrupt9using1//使用工作寄存器组1
{
SPSTAT=SPIF|WCOL;//清标志
Printf("Receive_Data:
");
P2=P2+1;//LED灯表示接收的次数
Send_byte(SPDAT);//读出主机发送过来的数据
SPDAT=SPDAT;//把上一次接收到的值传回主机
Send_byte('\t');
}