📄 initialization.c
字号:
/*--------------文件信息--------------------------------------------------------------------------------
**文 件 名: c8051f020.c
**创 建 人: 郑仙麟 S-509 电力电子实验室
**创 建 日 期:2008.03.25
**描 述:作为c8051f020单片机实验板的的基层源程序模板。
**说 明:不要在此直接编程,请复制使用
**------------------------------------------------------------------------------------------------------
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订----------------------------------------------------------------------------
** 修改人:
** 日 期:2008.03.25
** 描 述:
**说明:TX0=P0^0 RX0=P0^1 SCK=P0^2 MISO=P0^3 MISO=P0^4 NSS=P0^5 SDA=P0^6 SCK=P0^7
P1口作为AIN1使用
CEX0=P2^0 CEX1=P2^1 CP0=P2^3 T0=P2^4 INT0=P2^5
P2^6P2^7做扩展用(可用于扩展成TX1,RX1,CP1,T1,INT1)
P3口有于LCD的控制(1602用3根320240用5根12864用6根其余的可用于扩展)
P4口做为LCD的数据口
P5口做为电机方向控制引脚(但不可位操作,写一次要数据要把低4位都一次)
P4P5为推挽输出.DIR1A=P5^0; DIR1B=P5^1; DIR1C=P5^2; DIR1D=P5^3; //方向控制管脚
**------------------------------------------------------------------------------------------------------
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订----------------------------------------------------------------------------
** 修改人:
** 日 期:2008.04.04
** 描 述:
**说明:pwm的设置
**------------------------------------------------------------------------------------------------------
**------------------------------------------------------------------------------------------------------*/
#include <c8051f020.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit INT0=P2^5;
sbit lcdrw=P3^0;
sbit lcdcs=P3^1;
sbit lcdrs=P3^2;
/***********************************************************************/
/* 函数的声明 */
/***********************************************************************/
void config (void) ;
void delay1ms(uint time);
void spi_cfg(uchar spi0cfg,uchar spi0ckr,uchar spi0cn);
void SendSPIByte(unsigned char ch);
unsigned char ReceiveSPIByte();
void pcaini(void);
void pca0ini(void);
void pca1ini(void);
void PWM0_set(uchar low0);
void PWM1_set(uchar val1);
void PWM_init(void);
void AmplidyneSteeringWheel(uchar direction);
/***********************************************************************/
/* 初始化配置 */
/***********************************************************************/
void config (void)
{
EA=0;
WDTCN = 0x07; //对WDTCN寄存器复位
WDTCN = 0xDE; //看门狗禁止,写入0XDE后4个系统周期后在写入0XAD可将WDT禁止
WDTCN = 0xAD; //看门狗禁止
EA=1;
XBR0=0xD7; //交叉开关配置的几种配置方案见Text2
XBR1=0x06;
XBR2=0x40;
P1MDIN=0x00;
P0MDOUT = 0xFF;
P1MDOUT = 0x00;
P2MDOUT = 0xFF;
P3MDOUT = 0xFF;
P74OUT = 0x07;
INT0=1;
EMI0CF=0x13; //EMD2(EMI0CF4)=0,非复用方式;
OSCXCN = 0x00;
OSCICN = 0x17; //采用内部晶振,频率为0x17->16MHZ 0x16->8MHZ;
// 0x15->4MHZ;0x14->2MHZ
}
/***********************************************************************/
/* 延时间子程序 */
/***********************************************************************/
void delay1ms(uint time) //延迟子程序,当time=1000时为延时1s;当time=10时为延时10ms(与时钟频率有关)
{
uint i;
uint j;
for (i=0;i<time;i++)
{
for(j=0;j<300;j++);
}
}
void spi_cfg(uchar spi0cfg,uchar spi0ckr,uchar spi0cn) //SPI配置
{
SPI0CFG = spi0cfg; //0x50
SPI0CKR = spi0ckr; //0xFF
SPI0CN = spi0cn; //0x08
EIE1|=0x01; //允许SPIF标志位的中断请求
}
void PWM0_set(uchar low0){ //高电平占空比为val/256
PCA0CPH0=low0;
}
void PWM1_set(uchar low1){ //高电平占空比为val/256
PCA0CPH1=low1;
}
void pcaini(void){
PCA0MD=0x09; //PCA采用系统时钟,且PCA溢出中断禁止
PCA0CN=0x40; //启动PCA计数器
}
void pca0ini(void){ //CEX0为8bit PWM输出模式
PCA0CPM0=0x42;
}
void pca1ini(void){ //CEX1为8bit PWM输出模式
PCA0CPM1=0x42;
}
void PWM_init(void){
pcaini(); //产生PWM脉宽调制
pca0ini();
pca1ini();
}
/***********************************************************************/
/* 电机方向控制 */
/***********************************************************************/
void AmplidyneSteeringWheel(uchar direction){
P5=direction;
}
/***********************************************************************/
/* SPI通信子程序 */
/***********************************************************************/
void SendSPIByte(unsigned char ch) // 通过SPI发送一个字节数据
{
SPIF = 0; // SPIF位清零
SPI0DAT = ch; // 启动一次数据发送
while (SPIF == 0); // 等待数据发送完毕
}
unsigned char ReceiveSPIByte() //通过SPI接收一个字节数据
{
SPIF = 0; // SPIF位清零
SPI0DAT = 0; //启动一次数据接收
while (SPIF == 0); // 等待数据接收完毕
return SPI0DAT; // 读取SPI接收到的数据
}
/***********************************************************************/
/* 主程序 */
/***********************************************************************/
void main()
{
uchar low0set;
uchar low1set;
uchar directionset;
directionset=0x0A; //0x09,0x06,电机转0x00,0x0f电机停
low0set=100;
low1set=20; //占空比设置,高电平占空比为(256-lownset)/256
config();
PWM_init();
//PWM1_set(low1set);
//PWM0_set(low0set);
AmplidyneSteeringWheel(directionset);
while(1)
{
PWM1_set(low1set);
PWM0_set(low0set);
delay1ms(1000);
//low0set+=10;
//low1set-=10;
}
}
/***********************************************************************/
/* 中断服务子程序入口 */
/***********************************************************************/
void INT_0() interrupt 0{
}
void T0() interrupt 1{
}
void T1() interrupt 3{
}
void spi_wr() interrupt 6
{
SPIF=0;
}
void ADC0_OVER() interrupt 15{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -