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

    }

    }

  • 相关阅读:
    export,source
    zookeeper安装笔记
    centos修改启动顺序,登录后提示,启动级别,主机名,免密登录
    CentOS卸载系统自带的OpenJDK
    处理有外键约束的数据
    linux iptables
    centos httpd服务做yum本地源,以及安装Mysql
    Linux命令(一)grep查询
    LaTeX符号和图片
    LaTeX文章结构
  • 原文地址:https://www.cnblogs.com/biyeqingfeng/p/2150340.html
Copyright © 2020-2023  润新知