单片机各个模块程序代码

  • 格式:docx
  • 大小:11.56 KB
  • 文档页数:11

12C5A12C5A12C5A12C5A12C5A12C5A12M6M3M1.5M12C5A12C5A闲模式,低速模式
12C5A0f12C5A2
A12C5A12C5A12C5A0c12C5A12C5A12C5A0L0L7f0a0L0L0L0L0L0L0L0L0L12C5A12C5A12 C5A12C5A12C5A速.同步的通信总线,有两种操作模式:主模式和从模式。

12C5A12C5A12C5A速.同步的通信总线,有两种操作模式:主模式和从模式。

//
// 涉及寄存器:SPCTL(SPI控制寄存器)、SPSTAT(SPI状态寄存器)、SPDAT(数据寄存器)
// AUXR1(辅助寄存器)
// //
// 程序说明:本程序为SPI的从机程序,从机通过SPI接收主机发送过来的数据,并通过串口
// 显示到PC端,
//
//********************************************************************* *******//
#include <12C5A>
#include <>
#define uchar unsigned char
#define uint unsigned int
/************对SPCTL寄存器的设置位宏定义*************/
#define SSIG 0x80 //SS引脚忽略
#define SPEN 0x40 //SPI使能位
#define DORD 0x20 //SPI数据发送LSB最先发送
#define MSTR 0x10 //主从模式选择
#define CPOL 0x08 //SPICLK空闲时为高电平
#define CPHA 0x04 //数据在SPICLK的前时钟沿驱动,并在后时钟沿采样#define SP_CLK0 0x00 //SPI时钟频率为CPU_CLK/4
#define SP_CLK1 0x01 //SPI时钟频率为CPU_CLK/16
#define SP_CLK2 0x02 //SPI时钟频率为CPU_CLK/64
#define SP_CLK3 0x03 //SPI时钟频率为CPU_CLK/128
/************对SPSTAT寄存器的设置位宏定义************/
#define SPIF 0x80 //传输完成标志
#define WCOL 0x40 //SPI写冲突标志
/************SPI口切换宏定义***************/
#define SPI_P4 0x20 //SPI从P1口切换到P4口
/************波特率选择********************/
#define BTL 9600 //若要更改波特率直接更改此处,当波特率大于9600时需修改相应的接收程序,
//可选波特率有以下: 否则有可能出现乱码
//波特率为2400 //波特率为28800
//波特率为4800 //波特率为38400
//波特率为9600 //波特率为57600
//波特率为14400 //波特率为115200
//波特率为19200
void UART_init(void);
uchar Receive(void);
void Printf( uchar *p );
void Init_SPI(void);
void Send_byte( uchar byte );
//****************************************//
// 串口初始化 // //****************************************//
void UART_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; //开总中断
}
//************************************************//
// 发送一个字节数据 //
//************************************************//
void Send_byte( uchar byte )
{
SBUF = byte;
while(!TI);
TI = 0;
}
//************************************************//
// 打印字符 // //************************************************//
void Printf( uchar *p )
{
while( *p != '\0' )
{
Send_byte(*p);
p++;
}
}
//************************************************// // 接收函数 // //************************************************// uchar Receive( void )
{
uchar byte;
_nop_();
_nop_();
_nop_();
_nop_();
if( RI == 1 )
{
RI = 0;
byte = SBUF;
}
return byte;
}
//***********************************// //* 名称:Init_SPI()
//* 功能: 对SPI进行初始化
//* 输入:无
//* 输出:无
//***********************************// void Init_SPI(void)
{
SPDAT = 0; //清空数据寄存器
SPSTAT = SPIF|WCOL; //清空SPI状态寄存器 SPCTL =SPEN; //SPI设置为从机模式 IE2 = 0x02; //允许SPI中断
}
//***********************************//
//* 名称:main
//* 功能:
//* 输入:无
//* 输出:无
//***********************************//
void main()
{
uchar flag = 0;
UART_init();
Init_SPI();
EA = 1; //开总中断
while(1)
{
flag = Receive();
if(flag) //当PC端有给从机发送数据时把从机当前的SPDAT 值发送出来
{
Send_byte(SPDAT);
flag = 0;
}
}
}
//***********************************//
//* 名称:SPI_ISR()
//* 功能: SPI中断服务
单片机各个模块程序代码
//* 输入:无
//* 输出:无
//***********************************//
void SPI_ISR(void) interrupt 9 using 1 //使用工作寄存器组1 {
SPSTAT = SPIF|WCOL; //清标志
Printf("Receive_Data:");
P2 = P2+1; //LED灯表示接收的次数
Send_byte(SPDAT); //读出主机发送过来的数据
SPDAT = SPDAT; //把上一次接收到的值传回主机
Send_byte('\t');
}。