STC16-KeilC251例程-DEMO-CODE-20210112(改PWM例程及头文件定义).zip
更新记录
2021.01.12
1. 修改PWM相关的范例程序及头文件定义(XFR地址不能用int进行定义)
2021.01.06
1. 添加"54-LIN总线主机收发测试"例程
2. 添加"55-LIN总线从机收发测试"例程
3. 修改"52-浮点数运算单元"例程,使程序简单直观
2020.12.30
1. 添加"49-CAN总线扩展帧收发测试"例程,以及CAN总线帧格式说明
2020.12.08
1. 添加"52-浮点数运算单元"例程,以及库函数使用说明
2. 添加"53-UART转LIN总线报文测试程序"例程
2020.11.27
1. 修正部分错误
2. "50-CAN总线收发测试"例程添加CAN总线参考电路图
3. 添加"51-MDU32–乘法和除法单元"例程
2020.11.24
1. 初版发布
=========================
STC16从代码风格与C51兼容,非常相近,有8051基础的人非常容易上手迁移。但是STC16的资源、速度比51丰富及快很多。。。
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.**.com --------------------------------------------*/
/* --- Web: www.***.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/************* 功能说明 **************
本例程基于STC16为主控芯片的实验箱8进行编写测试.
CAN总线扩展帧收发测试用例.
DCAN是一个支持CAN2.0B协议的功能单元。
收到一个扩展帧后, CAN ID加1, 数据原样发送出去.
按一下P32口按键, 发送一帧固定数据.
默认波特率500KHz, 用户可自行修改.
下载时, 默认时钟 24MHz (用户可自行修改频率).
******************************************/
#include "..\comm\STC16f.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
/****************************** 用户定义宏 ***********************************/
//CAN总线波特率=Fclk/((1+(TSG1+1)+(TSG2+1))*(BRP+1)*2)
#define TSG1 2 //0~15
#define TSG2 1 //0~7
#define BRP 3 //0~63
//24000000/((1+3+2)*4*2)=500KHz
#define SJW 1 //重新同步跳跃宽度
/*****************************************************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
u32 CAN_ID;
u8 RX_BUF[8];
u8 TX_BUF[8];
/************* 本地函数声明 **************/
void CANInit();
void CanSendMsg(u32 canid, u8 *pdat);
/********************* 主函数 *************************/
void main(void)
{
WTST = 0;
P0M1 = 0; P0M0 = 0; //设置为准双向口
P1M1 = 0; P1M0 = 0; //设置为准双向口
P2M1 = 0; P2M0 = 0; //设置为准双向口
P3M1 = 0; P3M0 = 0; //设置为准双向口
P4M1 = 0; P4M0 = 0; //设置为准双向口
P5M1 = 0; P5M0 = 0; //设置为准双向口
P6M1 = 0; P6M0 = 0; //设置为准双向口
P7M1 = 0; P7M0 = 0; //设置为准双向口
// P_SW2 |= 0x80;
// CLKDIV = 0;
// P_SW2 &= ~0x80;
CANInit();
EA = 1; //打开总中断
CAN_ID = 0x01234567;
TX_BUF[0] = 0x11;
TX_BUF[1] = 0x22;
TX_BUF[2] = 0x33;
TX_BUF[3] = 0x44;
TX_BUF[4] = 0x55;
TX_BUF[5] = 0x66;
TX_BUF[6] = 0x77;
TX_BUF[7] = 0x88;
while(1)
{
if(!P32)
{
CanSendMsg(CAN_ID,TX_BUF);
while(!P32);
}
}
}
//========================================================================
// 函数: u8 ReadReg(u8 addr)
// 描述: CAN功能寄存器读取函数。
// 参数: CAN功能寄存器地址.
// 返回: CAN功能寄存器数据.
// 版本: VER1.0
// 日期: 2020-11-16
// 备注:
//========================================================================
u8 CanReadReg(u8 addr)
{
u8 dat;
CANAR = addr;
dat = CANDR;
return dat;
}
//========================================================================
// 函数: void WriteReg(u8 addr, u8 dat)
// 描述: CAN功能寄存器配置函数。
// 参数: CAN功能寄存器地址, CAN功能寄存器数据.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-16
// 备注:
//========================================================================
void CanWriteReg(u8 addr, u8 dat)
{
CANAR = addr;
CANDR = dat;
}
//========================================================================
// 函数: void CanReadFifo(u8 *pdat)
// 描述: 读取CAN缓冲区数据函数。
// 参数: *pdat: 存放CAN缓冲区数据.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-16
// 备注:
//========================================================================
void CanReadFifo(u8 *pdat)
{
pdat[0] = CanReadReg(RX_BUF0);
pdat[1] = CanReadReg(RX_BUF1);
pdat[2] = CanReadReg(RX_BUF2);
pdat[3] = CanReadReg(RX_BUF3);
pdat[4] = CanReadReg(RX_BUF0);
pdat[5] = CanReadReg(RX_BUF1);
pdat[6] = CanReadReg(RX_BUF2);
pdat[7] = CanReadReg(RX_BUF3);
pdat[8] = CanReadReg(RX_BUF0);
pdat[9] = CanReadReg(RX_BUF1);
pdat[10] = CanReadReg(RX_BUF2);
pdat[11] = CanReadReg(RX_BUF3);
pdat[12] = CanReadReg(RX_BUF0);
pdat[13] = CanReadReg(RX_BUF1);
pdat[14] = CanReadReg(RX_BUF2);
pdat[15] = CanReadReg(RX_BUF3);
}
//========================================================================
// 函数: u16 CanReadMsg(u8 *pdat)
// 描述: CAN发送数据函数。
// 参数: *pdat: 接收数据缓冲区.
// 返回: CAN ID.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
u32 CanReadMsg(u8 *pdat)
{
u8 i;
u32 CanID;
u8 buffer[16];
CanReadFifo(buffer);
CanID = (((u32)buffer[1] << 24) + ((u32)buffer[2] << 16) + ((u32)buffer[3] << 8) + buffer[4]) >> 3;
for(i=0;i<8;i++)
{
pdat[i] = buffer[i+5];
}
return CanID;
}
//========================================================================
// 函数: void CanSendMsg(u32 canid, u8 *pdat)
// 描述: CAN发送数据函数。
// 参数: canid: CAN ID; *pdat: 发送数据缓冲区.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CanSendMsg(u32 canid, u8 *pdat)
{
u32 CanID;
CanID = canid << 3;
CanWriteReg(TX_BUF0,0x88); //bit7: 标准帧(0)/扩展帧(1), bit6: 数据帧(0)/远程帧(1), bit3~bit0: 数据长度(DLC)
CanWriteReg(TX_BUF1,(u8)(CanID>>24));
CanWriteReg(TX_BUF2,(u8)(CanID>>16));
CanWriteReg(TX_BUF3,(u8)(CanID>>8));
CanWriteReg(TX_BUF0,(u8)CanID);
CanWriteReg(TX_BUF1,pdat[0]);
CanWriteReg(TX_BUF2,pdat[1]);
CanWriteReg(TX_BUF3,pdat[2]);
CanWriteReg(TX_BUF0,pdat[3]);
CanWriteReg(TX_BUF1,pdat[4]);
CanWriteReg(TX_BUF2,pdat[5]);
CanWriteReg(TX_BUF3,pdat[6]);
CanWriteReg(TX_BUF0,pdat[7]);
CanWriteReg(TX_BUF1,0x00);
CanWriteReg(TX_BUF2,0x00);
CanWriteReg(TX_BUF3,0x00);
CanWriteReg(CMR ,0x04); //发起一次帧传输
}
//========================================================================
// 函数: void CANSetBaudrate()
// 描述: CAN总线波特率设置函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANSetBaudrate()
{
CanWriteReg(BTR0,(SJW << 6) + BRP);
CanWriteReg(BTR1,(TSG2 << 4) + TSG1);
}
//========================================================================
// 函数: void CANInit()
// 描述: CAN初始化函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANInit()
{
CANSetBaudrate(); //设置波特率
CanWriteReg(ACR0,0x00); //总线验收代码寄存器
CanWriteReg(ACR1,0x00);
CanWriteReg(ACR2,0x00);
CanWriteReg(ACR3,0x00);
CanWriteReg(AMR0,0xFF); //总线验收屏蔽寄存器
CanWriteReg(AMR1,0xFF);
CanWriteReg(AMR2,0xFF);
CanWriteReg(AMR3,0xFF);
CanWriteReg(IMR ,0xff); //中断寄存器
CanWriteReg(MR ,0x00);
//CanWriteReg(CMR ,0x04); //发起一次帧传输
P_SW1 = 0;
CANICR = 0x02; //CAN中断使能
AUXR2 |= 0x02; //CAN模块被使能
}
//========================================================================
// 函数: void CANBUS_Interrupt(void) interrupt CAN_VECTOR
// 描述: CAN总线中断函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANBUS_Interrupt(void) interrupt CAN_VECTOR
{
u8 isr;
isr = CanReadReg(ISR);
if((isr & 0x04) == 0x04)
{
CANAR = 0x03;
CANDR = 0x04; //CLR FLAG
}
if((isr & 0x08) == 0x08)
{
CANAR = 0x03;
CANDR = 0x08; //CLR FLAG
CAN_ID = CanReadMsg(RX_BUF); //接收CAN总线数据
CanSendMsg(CAN_ID+1,RX_BUF); //发送CAN总线数据
}
}
|
21.02.11 又重新看了此贴,而且这个帖子还上了二姨的百家号什么的。感觉STC公司的对STC16(及以后的STC32M4)宣传、介绍还可以做得更好一点,多些提前介绍。用户也可以多些查看数据手册,善用搜索引擎查找资料。而不是想当然,人云亦云。知识科普任重道远。。。