智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2687|回复: 8
打印 上一主题 下一主题

[咨询] mc9s12xs128程序

[复制链接]

7

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
QQ
威望
230
贡献
127
兑换币
138
注册时间
2013-3-13
在线时间
36 小时
跳转到指定楼层
1#
发表于 2013-3-14 16:15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哪位好心的大神,给我发几个有关mc9s12xs128芯片的程序,什么程序都行,谢谢啦
1048069427@qq.com

38

主题

1651

帖子

0

精华

功勋会员

Rank: 10Rank: 10Rank: 10

积分
8770
威望
4444
贡献
2638
兑换币
1818
注册时间
2010-12-29
在线时间
844 小时
2#
发表于 2013-3-14 17:11:48 | 只看该作者
这种帖子就该删了。
回复 支持 反对

使用道具 举报

68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

活跃会员奖章优秀会员奖章论坛元老奖章论坛骨干奖章在线王奖章

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
3#
发表于 2013-3-14 17:13:38 | 只看该作者
SCI程序
  串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。
  无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化。初始化主要包括波特率设置、通信格式的设置、发送接收数据方式的设置等。
  对SCI进行初始化,需要设置如下几部分:
定义波特率
    一般选内部总线时钟为串行通信的时钟源。通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR[12:0],来选择合适的分频系数。
写控制字到SCI控制寄存器1(SCI0CR1)
    设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等。
写控制字到SCI控制寄存器2(SCI0CR2)
  设置是否允许发送与接收、是中断接收还是查询接收等。

串行通信程序如下:

/** write in “Init.h” **/
#include <hidef.h>          /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

//void InitBusClk(void);      //可以不使用锁相环
void InitSci(void);

/** write in “Init.c” **/
//初始化程序
#include "Init.h"
/*
//------------初始化Bus Clock------------//
void InitBusClk(void) {
  DisableInterrupts;
  
  CLKSEL=0X00;               //PLLSEL  1 : Bus Clock=PLLCLK/2
                            //        0 : Bus Clock=OSCCLK/2
  PLLCTL_PLLON=1;            //开启PLL
  
  SYNR=0;                    //OSCCLK=16MHz
  REFDV=0X0F;                //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/16=2MHz
                                                                                             
  while(!(CRGFLG_LOCK==1));    //直到LOCK=1,when PLL is ready,退出循环
  
  CLKSEL_PLLSEL=1;           //PLLSEL  1 : Bus Clock=PLLCLK/2=2MHz/2=1MHz
                           //        0 : Bus Clock=OSCCLK/2=16M/2=8MHz
}
*/

//---------------初始化SCI---------------//
void InitSci(void){
   SCI0BD=4545;        //设波特率为110
            //SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD)
                      //           = 8MHz/(16*4545)=500kHz/4545=110bps
                      //SCIBD : SBR12-SBR0,Value from 1 to 8191
   SCI0CR1=0;
   
   SCI0CR2=0X2C;            // 0010 1100  RIE=1,TE=1,RE=1
                           // RIE=1  RDRF and OR interrupt requests enabled
                           // TE=1   Transmitter enabled
                           // RE=1   Receiver enabled
}

/** write in “SCI.h” **/
//函数声明

unsigned char SciRead();

void SciWrite(byte);

/** write in “SCI.c” **/
//串行通信程序
#include "Init.h"
#include "SCI.h"

//---------------读SCI数据---------------//
unsigned char SciRead(){
  if(SCI0SR1_RDRF==1){
         //数据从移位寄存器传送到SCI数据寄存器SCIDRL
                  //SCI0SR1_RDRF==1表明数据寄存器SCI0DRL为满,可以接收新的数据
    SCI0SR1_RDRF=1;       //读取SCI数据寄存器会将RDRF清除,重新置位
   
    return SCI0DRL;        //返回数据寄存器的数值
  }
}
//---------------写SCI数据---------------//
void SciWrite(byte sci_value){
  while(!(SCI0SR1&0X80));   
         //SCI0SR1_TDRE==1表明数据寄存器SCI0DRL为空,可以发送新的数据
  SCI0DRH=0;
  SCI0DRL=sci_value;         //发送新的数据至数据寄存器SCI0DR
}
//---------------中断程序-----------------//
#pragma CODE_SEG NON_BANKED
interrupt 20 void Sci_Intrrupt(void){       //SCI的中断向量号为20
  byte text;
  DisableInterrupts;     //关中断
  text=SciRead();       //接收数据寄存器SCI0DRL中的数据
  asm nop;
  asm nop;
         
  SciWrite(text);       //发送数据至数据寄存器SCI0DRL

  DDRA=0XFF;        //设A口为输出,用来显示是否执行中断,可以不用
  PORTA_PA6=!PORTA_PA6;
  
  EnableInterrupts;    //开中断
}
#pragma CODE_SEG DEFAULT

/** write in “main.c”” **/
#include "Init.h"
#include "SCI.h"

void main(void) {
  /* put your own code here */
  _DISABLE_COP();              //关看门狗
  DisableInterrupts;             //关中断
  
  //InitBusClk();
  InitSci();
  
 EnableInterrupts;             //开中断

  for(;;) {
   
   // _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

A/D转换应用实例
要让 ATD 开始转换工作,必须经过以下三个步骤:
1.将 ADPU 置 1,使 ATD 启动;
2.按照要求对转换位数、扫描方式、采样时间、时钟频率及标志检查等方式 进行设置;
3.发出启动命令;
  如果上电默认状态即能满足工作要求,那么只要将 ADPU 置 1,然后通过控制寄存器发出转换命令,即可实现转换。
&nbsp;
程序描述:由通道ATD0进行单通道A/D转换,转换值在B口显示。

程序如下:
程序一:

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

byte  ad_value;          //AD转换结果

void Delay(int i) {         //延时程序
  int j;
  for(;i>0;i--)
    for(j=500;j>0;j--)
    ;
}

/***---------------初始化程序---------------***/
void InitBusClk(void) {
  CLKSEL=0X80;                  //PLLSEL  1 : Bus Clock=PLLCLK/2
                               //        0 : Bus Clock=OSCCLK/2
  PLLCTL_PLLON=1;              //开启PLL
  SYNR=0;
  REFDV=0X03;                 //OSCCLK=16MHz
                              //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz
  
  while(!(CRGFLG_LOCK==1));      //直到LOCK=1,when PLL is ready,退出循环
  
  CLKSEL_PLLSEL=1;           
               //PLLSEL  1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz
                             //       0 : Bus Clock=OSCCLK/2=16M/2=8MHz
}

void InitAD(void){
     
   ATD0CTL2 = 0XC0;            // 1100 0000    启动A/D, 快速清除标志位
                              //      无等待模式, 外部触发禁止(bit2=0),
                                     中断禁止(bit1=0)
   
   ATD0CTL3 = 0X0C;         

        // 0 0001 1 00  转换序列为 1 、 FIFO模式启动,冻结模式下继续转换

   ATD0CTL4 = 0XE1;            // 1 11 00001   8位精度, 16AD采样时间
                             //   总线(1+1)*2 = 4 分频,AD时钟 = 1MHz

   ATD0CTL5 = 0X27;
      
       // 0 0 1 0  0 111    右对齐,无符号,连续转换,单通道, 起始通道 ATD7
         // DJM DSGN SCAN MULT  0 CC CB CA
         // DJM :1-Right justified  0-Left justified
         // DSGN:1-Signed data      0-Unsigned data
         // SCAN:1-Continuous       0-Single conversion
         // CC CB CA : Analog Input Channel Select Code

   ATD0DIEN = 0X00;          // 数字输入 disabled
}
/***---------------主程序---------------***/
void main(void) {
  /* put your own code here */
   
   _DISABLE_COP();           // 关看门狗
  
   InitBusClk();
   InitAD();
   
   DDRB=0XFF;               // 设PORTB为输出口
   PORTB=0x00;
   
   EnableInterrupts;          // 开放总中断

  for(;;) {
     while(!ATD0STAT2L_CCF7);     //等待转换结束,退出循环

     ad_value=(byte)ATD0DR7H;     

   //左对齐,右对齐时转换结果都先存储在ATD0DRxH,后存储在ATD0DRxL.

   Delay(200);                    //延时
     PORTB=ad_value;              
           //PORTB输出AD转换结果,并用8个LED发光二极管显示
  
    //_FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

程序二:(用指针实现AD转换)

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

byte AD_Value;            //AD转换结果

void Delay(int i) {          //延时程序
  int j;
  for(;i>0;i--)
    for(j=500;j>0;j--)
    ;
}

/***---------------初始化程序---------------***/

(初始化程序与上述相同)

/***---------------读取AD转换结果---------------***/
void AD_GetValue(word *AD_Value){
  *AD_Value=ATD0DR0;
}
  
void main(void) {
  /* put your own code here */
   _DISABLE_COP();     //关看门狗
  
   InitBusClk();
   InitAD();
   
   DDRB=0XFF;        //设PORTB为输出口
   PORTB=0x00;
  
   EnableInterrupts;
   
         for(;;) {
           while(!ATD0STAT2L_CCF7);     //等待转换结束,退出循环
          
           AD_GetValue(&AD_Value);      //读取转换结果
          
           Delay(400);
           PORTB=AD_Value;            //转换结果在B口显示
         
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}&nbsp;

程序三:(用中断实现AD转换)

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <mc9s12xs128.h>

byte AD_Data=0;
//*
void Delay(int i) {
  int j;
  for(;i>0;i--)
    for(j=500;j>0;j--)
    ;
}
//*/
/***---------------初始化程序---------------***/
void InitBusClk(void) {
  CLKSEL=0X80;                 //PLLSEL  1 : Bus Clock=PLLCLK/2
                              //        0 : Bus Clock=OSCCLK/2
  PLLCTL_PLLON=1;             //开启PLL
  SYNR=0;
  REFDV=0X03;                //OSCCLK=16MHz
                             //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz

  while(!(CRGFLG_LOCK==1));    //直到LOCK=1,when PLL is ready,退出循环
  
  CLKSEL_PLLSEL=1;            //PLLSEL  1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz
                            //        0 : Bus Clock=OSCCLK/2=16M/2=8MHz
}

void InitAD(void){
     
   ATD0CTL2 = 0XC3;         

   //  110 000 11   启动A/D, 快速清除标志位,无等待模式, 外部触发禁止(bit2=0)
      //  中断开放(bit1=1,bit0=1)         
      //  bit1 :ATD Sequence Complete Interrupt Enable            
      //  bit0 :ATD Sequence Complete Interrupt Flag
   
 ATD0CTL3 = 0X0C;         
          // 0 0001 1 00  转换序列为 1 、 FIFO模式启动,冻结模式下继续转换

ATD0CTL4 = 0XE1;           // 1 11 00001   8位精度, 16AD采样时间
                          //             总线(1+1)*2 = 4 分频,AD时钟 = 1M

ATD0CTL5 = 0XA7;         
          // 1010 0111    右对齐,无符号,连续转换,单通道, 起始通道 ATD7

   ATD0DIEN = 0X00;       // 数字输入 disabled
}

/***---------------主程序---------------***/
void main(void) {
  /* put your own code here */
  DisableInterrupts;            //关中断
  
  InitBusClk();
  InitAD();
              
  DDRB=0XFF;                //设B口为输出口
  PORTB=0X00;
  
        EnableInterrupts;          //开中断

        for(;;){        
       
           //while(!ATD0STAT2L_CCF7);
           PORTB=(byte)AD_Data;        //B口显示转换结构
        }
}

/***---------------中断服务程序---------------***/

#pragma CODE_SEG NON_BANKED

void  interrupt  22  IntAD(void){             // AD转换的中断向量号为33
  
  DisableInterrupts;                         //关中断
  //while(!ATD0STAT2L_CCF7);
  AD_Data=ATD0DR0H;                      //读取AD转换结果
  
  EnableInterrupts;                         //开中断
}
#pragma CODE_SEG DEFAULT

PWM例程
//---------------------------------------------------------------------------------------------------//
//功能说明:MC9S12XS128--PWM例程
//使用说明:实现通道0(PTP0)输出频率为1Hz,占空比为50%的方波,可以用发光二极管显示,每秒钟放光二极管亮一次
//--------------------------------------------------------------------------------------------------//
#include <hidef.h>          /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

void Delay(int i)
{
  int j ;
  for(;i>0;i--)
    for(j=500;j>0;j--)
    ;
}

void InitPWM(void)
{
    PWME =0x00;                     //clear PWM Enable register   关闭PWM输出

    PWMPOL = 0XFF;                  //初始极性 高电平

    PWMCAE =0x00;                  // left allign  左对齐

    //PWMCTL = 0x50;                //二进制:0101 0000 十进制80   CON01  CON45

    PWMCLK = 0x01;                 // 0000 0001   con0 uses Clock SA
                                         
                                  // SA Clock A is the clock source for PWM channel 0
                                  // SA Clock SA is the clock source for PWM channel 1
                                  // SA Clock B is the clock source for PWM channel 2                                   // SA Clock B is the clock source for PWM channel 3
                                  // SA Clock A is the clock source for PWM channel 4
                                  // SA Clock A is the clock source for PWM channel 5
                                  // SA Clock B is the clock source for PWM channel 6
                                  // SA Clock B is the clock source for PWM channel 7
   
  PWMPRCLK=0x07;        
        // 0000 0111   时钟A 128分频 clockA=bus colck/128=8MHz/128=1/16 MHz
                                       
   
  PWMSCLA=0XFA;                     
        // 1111 1010 时钟SA为1/16MHz/(250*2)=1/8000MHz=1/8kHz=1000/8Hz=125Hz

    PWMPER0=125;                      // Period = 1s      *** (0.008)*125=1s ***
    PWMDTY0=60;                        
                             
    PWME = 0x01;                       // 0000 0001 开启通道0的 PWM 输出
   
}

void main(void)
{
  /* put your own code here */  
  
  InitPWM();
  
 EnableInterrupts;

  for(;;)
 {
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

希望对你能起到帮助
回复 支持 反对

使用道具 举报

4

主题

73

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2741
威望
1365
贡献
898
兑换币
602
注册时间
2012-12-20
在线时间
239 小时
4#
发表于 2013-3-14 17:59:34 | 只看该作者
楼上好人
回复 支持 反对

使用道具 举报

7

主题

220

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2145
威望
900
贡献
497
兑换币
607
注册时间
2012-11-18
在线时间
374 小时
5#
发表于 2013-3-14 20:51:06 | 只看该作者
论坛里有很多教学资源的!应该好好利用 自己去找吧!
回复 支持 反对

使用道具 举报

7

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
QQ
威望
230
贡献
127
兑换币
138
注册时间
2013-3-13
在线时间
36 小时
6#
 楼主| 发表于 2013-3-16 09:18:49 | 只看该作者
可欣 发表于 2013-3-14 17:13
SCI程序
  串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。
  无论用查询方式还是 ...

谢谢啦,
回复 支持 反对

使用道具 举报

0

主题

33

帖子

0

精华

注册会员

Rank: 2

积分
122
威望
66
贡献
6
兑换币
48
注册时间
2013-3-24
在线时间
25 小时
毕业学校
昆明理工
7#
发表于 2013-4-10 22:00:50 | 只看该作者
转角over 发表于 2013-3-16 09:18
谢谢啦,

技术报告里不是都有的嘛。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
43
威望
25
贡献
18
兑换币
4
注册时间
2013-4-17
在线时间
0 小时
毕业学校
华北水电大学
8#
发表于 2013-4-17 16:47:19 | 只看该作者
可欣 发表于 2013-3-14 17:13
SCI程序
  串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。
  无论用查询方式还是 ...


回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
威望
120
贡献
62
兑换币
78
注册时间
2013-9-5
在线时间
17 小时
9#
发表于 2013-10-24 21:04:29 | 只看该作者
在SCI中断程序中为什么要加:开中断,与关中断呀??
求大神详解
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-28 12:21 , Processed in 0.057516 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表