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; //都选择CLOCKSA和CLOCKSB作为时钟源
PWMSCLA=0xff;
PWMSCLB=0xff; //再次分频、
PWMPOL=0xff; //设置pwm周期开始为高电平
PWMCAE=0x00; //选择左对齐方式
PWMPER0=0xfe; //选择周期
PWMDTY0=0xfe; //占空比
PWME=0x01; //启动通道0的pwm输出
}
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();
}
}