9S12单片机的模块驱动程序备忘

定时器模块

1:输出比较

#include <hidef.h>      /* common defines and macros */

#include <mc9s12db128.h>     /* derivative information */

//void interrupt 8 aabreak(void);     //此行可以注释掉*******

unsigned int flag=0;

void main(void) {

   EnableInterrupts;

   TFLG1=0x01;                 //清中断标志位

   DDRB=0xff;          

   PORTB=0xff;                  //B口定义为输出,首先输出全0

   TSCR1=0x80;                 //定时器使能,正常工作

   TSCR2=0x01;                 //将定时器进行128分频 最高位不要开********

   TIE=0x01;                   //定时器0的中断使能

   TIOS=0x01;                  //将定时器设置为输出比较状态

   TCTL2=0x00;                 //定时器与引脚断开

   TFLG1=0x01;                 //清中断标志位

   TC0=0x00f0;                 //给定时器赋值

for(;;);

}

#pragma CODE_SEG NON_BANKED

void interrupt 8 aabreak(void)//中断号要正确,是中断8 (从0通道开始算起的)

{

TFLG1=0x01;                 //清中断标志位

if(flag==0) {

PORTB=0xaa;

flag=1;

} else{

PORTB=0x55;

flag=0;

}

TC0=0x00f0;                 //给定时器赋值                       

}

2:输入捕捉

PORTA输出脉冲,有定时器通道0对脉冲进行计数,结果从PORTB输出。

#include <hidef.h>      /* common defines and macros */

#include <mc9s12db128.h>     /* derivative information */

unsigned int number=0;    //脉冲计数初值为0

/***********初始化**********/

void init(){

EnableInterrupts;

DDRA=0xff;               //A口定义为输出,用于输出脉冲

DDRB=0xff;               //B口用于输出脉冲值

PORTB=0xff;               //led灯全暗

TIOS=0x00;               //设置定时器通道0为输入捕捉

TSCR1=0x80;              //定时器使能

TSCR2=0x01;              //设置自由计数器2分频,且禁止定时器溢出中断

TCTL4=0x02;              //捕捉器仅下降沿捕捉

TIE=0x01;                //允许定时器通道0的中断

TFLG1=0x01;               //清除中断标志位

}

/*********用于产生脉冲*******/

void pulse() {

unsigned int i,j;

PORTA=0xff;             //A口输出高电平

for(i=0;i<10000;i++)

   for(j=0;j<100;j++) ;      //延时

PORTA=0x00;             //使A口输出低电平

}

/********主函数*********/

void main(void) {

init();

for(;;)

{

pulse();

}

}

/*******中断子函数******/

#pragma CODE_SEG NON_BANKED

void interrupt 8 count() {

TFLG1=0x01;               //中断标志位清0

number++;                //计数值加1

PORTB=~(number);         //B口输出计数值

}

模数转换模块

(硬件未完成,以后补充。。。。)

PWM模块

#include <hidef.h>      /* common defines and macros */

#include <mc9s12db128.h>     /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12db128b"

void init() {

DDRB=0xff;          //定义B口为输出状态

PORTB=0x00;          //led灯全部为暗

DDRA=0x00;          //定义A口为接受状态

PWME=0x00;          //首先禁止pwm输出

PWMCTL=0x00;        //PWM不级联

PWMPRCLK=0x77;      //CLOCKA,CLOCKB分频

PWMCLK=0xff;        //都选择CLOCKSACLOCKSB作为时钟源

PWMSCLA=0xff;

PWMSCLB=0xff;       //再次分频、

PWMPOL=0xff;        //设置pwm周期开始为高电平

PWMCAE=0x00;        //选择左对齐方式

PWMPER0=0xfe;       //选择周期

PWMDTY0=0xfe;       //占空比

PWME=0x01;          //启动通道0pwm输出

}

void fun() {

if(PORTA_BIT5==1)

{

PORTB=0x00;          //如果此时pwm输出高电平,则点亮led

} else {

PORTB=0xff;          //如果此时pwm输出低电平,则熄灭led

}

}

void main(void) {

DDRB=0xff;

PORTB=0x00;

for(;;)

{

fun();

}

}


SCI模块

#include <hidef.h>    

#include <mc9s12db128.h>

#pragma LINK_INFO DERIVATIVE "mc9s12db128b"

unsigned char pp=0xf0;               //欲发送的数字

/********* 串口初始化*********/

void init() {

DDRB=0xff;   

PORTB=0xff;                        //开始led灯暗,即数据尚未接收

SCI0BD=52;                         //初始化波特率为9600

SCI0CR1=0x00;                      //八位无奇偶校验模式

SCI0CR2=0x2c;                      //接收中断允许

}

/**************写数据***********/

void write(unsigned char n) {

SCI0SR1_TDRE=1;                    //数据传输到输出寄存器

SCI0DRL=n;

while(SCI0SR1_TC==0);              //等待发送完毕

}

/**************读数据***********/

unsigned char read()

{

if(SCI0SR1_RDRF==1) {                 //如果数据有效,那么将读到的数据返回

return(SCI0DRL);

}

}

/*************主函数*************/

void main(void) {

EnableInterrupts;

init();

write(pp);

for(;;);                                  //等待中断

}

/*************中断子程序************/

#pragma CODE_SEG NON_BANKED

void interrupt 20 funck() {

unsigned char k;

k=read();

PORTB=~k;

}


LED驱动

#include <hidef.h>      /* common defines and macros */

#include <mc9s12db128.h>     /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12db128b"

unsigned char num[4]={0xC0,0xF9,0xF8,0xF9}; // 四位显示数字:0171

unsigned char k,kk;

/***************初始化函数**************/

void init() {

DDRB=0xff;

PORTB=0xff;

DDRA=0xff;                                //将A,B口都定义为输出模式

k=0;

kk=0x01;

}

/***************延时程序****************/

void delay() {                          

unsigned int i;

for(i=0;i<500;i++);

}

/****************显示程序***************/

void show() {

PORTB=num[k];                              //输出段码

PORTA=kk;                                  //输出位选

delay();                                    //延时显示

k++;                                       //游标右移

if(k==4) {                                   //看是否到了最后一位

k=0;                                       //如果是的话重头开始

kk=0x01;

}else {

kk=kk<<1;                                 //否则位选左移

}

}

/****************主程序******************/

void main(void)

{

init();

for(;;)

{

show();

}

}

转载于:https://www.cnblogs.com/biyeqingfeng/archive/2011/08/23/2150340.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AD模块的飞思卡尔调试程序全部文件: #include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ int i; unsigned char RX_ID[4],RX_DS[8]; unsigned int r[8]; unsigned int temp[2],s; void setbusclock(void) { CLKSEL=0X00; // disengage PLL to system PLLCTL_PLLON=1; // turn on PLL SYNR=0x01; // VCOFRQ[7:6];SYNDIV[5:0] // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1) // fPLL= fVCO/(2 × POSTDIV) // fBUS= fPLL/2 // VCOCLK Frequency Ranges VCOFRQ[7:6] // 32MHz <= fVCO <= 48MHz 00 // 48MHz < fVCO <= 80MHz 01 // Reserved 10 // 80MHz < fVCO <= 120MHz 11 REFDV=0x01; // REFFRQ[7:6];REFDIV[5:0] // fREF=fOSC/(REFDIV + 1) // REFCLK Frequency Ranges REFFRQ[7:6] // 1MHz <= fREF <= 2MHz 00 // 2MHz < fREF <= 6MHz 01 // 6MHz < fREF <= 12MHz 10 // fREF > 12MHz 11 // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz; POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV) // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one). _asm(nop); // BUS CLOCK=16M _asm(nop); while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system 分频; } //[设置总线时钟频率为16MHZ] ; // void ATDInit(void) { ATD0CTL2=0x42; // ATD启动,禁止外部触发,允许ATD中断; ATD0CTL3=0x88; // 背景调试模式下继续转换,每1次转换一个转换序列,继续转换; ATD0CTL4=0x01; // 采样时间为 2个时钟周期,转化按10位进行,总分频系数为8; ATD0CTL5=0x20; // 数据右对齐,无符号,单通道采集, } //[AD进行初始化];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值