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();

}

}

posted @ 2011-08-23 11:11  Orig  阅读(605)  评论(0编辑  收藏  举报