数字录放系统

/******************************************************
**硬件连接: 两片164的CR接PTC0,CP接PTD3,输入口A接高电平,
   第一片的输入口B接PTD2,另一片的输入口B接前一
   片的Q7。将第一片的Q0-Q7接62256的A0-A7,另一片
   的Q0-Q6接62256的A8-A14,62256的I/O的0-7接PTA0-7,
   CS接PTC1,WE接PTC2,OE接PTC3,
**作者:     钱彬丰
**开始时间: 2005/7/12 9:00
**结束时间:2005/7/18 13:00
******************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define HC164_CR PTC_PTC0
#define RAM62256_CS PTC_PTC1
#define RAM62256_WE PTC_PTC2
#define RAM62256_OE PTC_PTC3
#define WR_DAC PTC_PTC4
#define RAM62256_IN_OUT PTA
#define HIGH 1
#define LOW 0
#define PMSH_N 0x01    //频率2.4576MHz
#define PMSL_N 0x2c
#define PMRS_L 0x80
#define PCTL_E 0x21
static word address @0x80;
static byte low_ad @0x82;
static byte high_ad @0x83;
/******************************************************
-------------------74HC164(CMOS)初始化-----------------
******************************************************/
void hc164_init()
{
 byte delay;
 DDRC_DDRC0=1;
 delay=35;
 HC164_CR=0;     //清除74HC164中的数据
 while(delay>0)
 {
  delay=delay-1;
 }       //等待40us
 HC164_CR=1;     //74HC164的转为高电平,开始接收数据
}
/*************************************************
------------------SPI主模式初始化-----------------
*************************************************/
void spi_master_init()
{
 SPCR=0x3a;     //无接收中断,主机方式,空闲时高电平
        //SPSCK第一次跳变为移位开始信号,线或模式
        //无发送中断
 SPSCR=0x00;     //无错误中断,2分频
}
/******************************************************
----------------------SPI发送数据----------------------
功能描述:将data中的值给SPDR,作为将要发送的数据
******************************************************/
void spi_sent_data(byte data)
{
 while(SPSCR_SPTE==0)
 {
 }
 SPDR=data; 
}
/*************************************************
------------------SCI式初始化-----------------
*************************************************/
void sci_init()
{
    SCC1=0x40;          //允许SCI,正常输出,8位数据,无校验
    SCC2=0x0C;          // 不允许发送中断,不允许接受中断,允许发送、接受
    SCBR=0x02;          // 波特率9600
}
/******************************************************
----------------------SCI发送数据----------------------
功能描述:将data中的值给SCDR,作为将要发送的数据
******************************************************/
void sci_sent_data(byte data)
{
    while(SCS1_SCTE==0)
    {
    }
    SCDR=data;
}
/************************************************
------------------AD转换初始化-----------------
*************************************************/
void ADC_init()
{
 ADCLK=0x30;     //2分频,内部时钟
    ADSCR=0x00;     //0通道(PTB(0)),无中断,一次A/D转换
}
/************************************************
------------------定时器初始化-----------------
*************************************************/
void time_init()
{
    T1SC=0x20;         //定时器停止,无中断,1分频
    T1MODH=0x01;       //预置数为0132
    T1MODL=0x32;
}
/*************************************************
-------------------总线频率设置-------------------
**************************************************/
void bus_frequence()
{
 PCTL=0x00;     //P=0,PLLON=0,关闭PLL
 PBWC=0x80;     //auto模式
 PMSH=PMSH_N;    //N高位
 PMSL=PMSL_N;    //N低位
 PMRS=PMRS_L;    //设置L
 PCTL=PCTL_E;    //E=2,PLLON=1,启动PLL
 while(PBWC_LOCK==0)   //等待,直到LOCK=1,频率稳定
 {
 }
 PCTL_BCS=1;     //频率锁定,选择PLL作为时钟源
}
/*********************************************
-------------------硬件延时-------------------
**********************************************/
void delay(byte time)
{
 while(time>0)
 {
  time--;
 }
}
void send_data_62256(byte data)
{
 RAM62256_CS=LOW;
 RAM62256_WE=LOW;
 DDRA=0xff;
 RAM62256_IN_OUT=data;
 RAM62256_CS=HIGH;
}
void get_data_62256()
{
 RAM62256_WE=HIGH;
 RAM62256_OE=LOW;
 RAM62256_CS=LOW;
 DDRA=0x00;
 WR_DAC=0;
}
void read_back()
{
 word temp_ad;
 time_init();
 address=0x0000;
 T1SC_TSTOP=0;       //计时起开始计时
 while(address<0x8000)
 {
  if(T1SC_TOF==1)
  {
   low_ad=address;
   temp_ad=address;
   temp_ad=temp_ad>>8;
  high_ad=temp_ad;
  //--------------------//
  spi_sent_data(high_ad);
  spi_sent_data(low_ad);
  get_data_62256();
  address++;
  WR_DAC=1;
  T1SC_TOF=0;
  }
 }
}
void record()
{
 word temp_ad;
 address=0x0000;
 while(address<0x8000)
 {
  if(T1SC_TOF==1)
  {
   ADC_init();
   low_ad=address;
   temp_ad=address;
   temp_ad=temp_ad>>8;
   high_ad=temp_ad;
   spi_sent_data(high_ad);
   spi_sent_data(low_ad);
 //---------------------------------//
   while(ADSCR_COCO==0)
   {
   }
   send_data_62256(ADR);
   T1SC_TOF=0;
   address++;
  }
 } 
}
void main(void)
{
 CONFIG1_COPD=1;    //禁止看门狗
 bus_frequence();
 while(1)
 {
  time_init();
  DDRC=0xff;
  hc164_init();
  spi_master_init();
  T1SC_TSTOP=0;       //计时起开始计时
  record();
  T1SC_TSTOP=1;       //计时起停止计时
  read_back();
  T1SC_TSTOP=1;       //计时起停止计时
 }
 for(;;);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值