📄 mc68hc908gp32_ad.c
字号:
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define ReSendStatusR SCS1 //SCI状态寄存器
#define ReTestBit 5 //接收缓冲区满标志位
#define SendTestBit 7 //发送缓冲区空标志位
#define ReSendDataR SCDR //数据寄存器
#define PRDS *(volatile unsigned char *)0x3b //PLL分频选择寄存器;头文件里没定义
//串行接收与发送函数声明
unsigned char trn_reg[10];
unsigned char trn_num;
unsigned char rev_reg[10];
unsigned char rev_num;
unsigned char SCIRe1(unsigned char *p); //接收1字节
unsigned char ADBUF[7]; //存放A/D转换结果的变量
void SCISend1(unsigned char o); //发送1字节
void HC08Setup(void);
void Delay_ms(unsigned char i)
{ unsigned char j;
unsigned char u;
for(j=0;j<i;j++)
for(u=0;u<=250;u++) ;
}
/*SCIInit:串行口初始化子程序---------------------------*
*功 能:对串行口进行初始化,默认为允许SCI,正常码输出,8位 *
* 数据,无校验等,允许发送器允许接收器.查询方式收发,*
* 波特率为9600(设fBUS=2.4576MHz) *
*参 数:无 *
*返 回:无 *
*-----------------------------------------------------*/
void SCIInit(void)
{
//总线频率fBUS=2.4576MHz时,定义波特率Bt=9600
// SCBR=0b00000010;//设置允许SCI,正常码输出、8位数据、无校验
//总线频率fBUS=4.9152M时,定义波特率Bt=9600
SCBR=0b00000011;
SCC1=0b01000000; //设置允许发送、允许接收,查询方式收发
SCC2=0b00001100;
}
/*
函数名:AtoD(int channel)
功能:A/D转换函数
入口参数含义:channel 选择的通道(0-7)
返回值:转换结果:字节型数据(0-255)
*/
unsigned char AtoD(int channel)
{
unsigned char tmp;
tmp=ADSCR & 0xe0;
tmp=tmp | channel;
ADSCR=tmp; //选取通道ADCH4-ADCH0=00000-00111:AD0 pin-AD7 pin
tmp=ADSCR;
while(tmp>>7==0)
tmp=ADSCR;
return ADR;
}
void main()
{
unsigned char i;
HC08Setup();
SCIInit();
ADCLK=0b01011111; //初始化A/D转换为4分频,内部总线
ADSCR=0b00000000; //选择通道0
DDRA=0xff; //定义A口为输出
DDRB=0x00; //定义B口为输入
DDRC=0x00; //定义C口为输入
PTA=0xf0;
while(1)
{
for(i=0;i<8;i++) //获得并发送8个A/D转换的结果
{
ADBUF[i]=AtoD(i); //获得8个通道的数值
SCISend1(ADBUF[i]);
}
SCISend1(0x66);
Delay_ms(250); Delay_ms(250); Delay_ms(250); Delay_ms(250);
}
}
/*SCISend1:串行发送1个字节-----------------------------*
*功 能:串行发送1个字节 *
*参 数:要发送的数据 *
*返 回:无 *
*-----------------------------------------------------*/
void SCISend1(unsigned char o)
{//判断ReStatusR的第SendTestBit位是否为1,是1可以发送
while(1)
if ((ReSendStatusR & (1<<SendTestBit)) != 0)
{ ReSendDataR=o;
break;}
}
void HC08Setup(void)
{
//初始化CONFIG2
CONFIG2=0b00000001; //SCIBDSRC=1内部总线时钟用作SCI
//时钟;OSCSTOPENB=0在stop模式下
//禁止振荡器工作
//初始化CONFIG1
CONFIG1=0b00111101; //COPD=1 禁止COP模块
//STOP=0 禁止STOP指令
//SSREC=1 32个CGMXCLK周期退出
//STOP模式
//LVI5OR3=1 LVI工作在5V
//LVIPWRD=1 禁止LVI模块电源
//LVIRSTD=1 允许LVI复位信号
//LVISTOP=0 在stop模式下禁止LVI
//COPRS=0 COP溢出范围使用长的时间
PCTL=0x00; //①禁止PLL:清零PLL控制寄存器PCTL
/*
//设置为2.4576M
PCTL=0x01; //②将P、E写入PTCL,置VCO的参考频率
// 为2
PMSH=0x01; //③将N写入PMSH、PMSL,置VCO的倍
// 频因子为$12C
PMSL=0x2C;
*/
//设置为4.9152M
PCTL=0x02;
PMSH=0x02; //③将N写入PMSH、PMSL,置VCO的倍
// 频因子为$12C
PMSL=0x58;
PMRS=0b10000000; //④将L写入PMRS,置VCO的输出频率范
// 围系数为$80
PRDS=0x01; //⑤将R写入PRDS
PCTL|=(1<<5); //⑥置PCTL.PLLON=1,启动PLL电路
PBWC|=(1<<7); //⑦PBWC自动带宽控制位=1,选择自动
// 控制方式
PCTL|=(1<<4); //⑧PCTL.BCS=1,选择PLL电路为时钟源
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -