当前位置:首页 >> 信息与通信 >>

飞思卡尔RS08单片机入门程序例子


///////////////////////////////////////////////////////////////////////////////////////// // // Sample for FREESCALE DEMO9RS08KA8 // // This program does the following: // // 1. Press the SW0

push-button. Rotate the potentiometer. LED0 will blink with a // frequency related to the potentiometer value. // // 2. Press the SW1 push-button. LED1 will blink with a frequency related to amount of // light hitting the photoresistor. // // The value of the potentiometer or the light sensor is also sent to the RS-232 port. // // Before to start this program: // // - Verify that all jumpers are in their default position. // See the "Summary of Jumper and Connector Settings" chapter in the user's manual. // - Connect a standard serial cable between the board's RS-232 connector // and a PC's RS232 port. // - Start Windows HyperTerminal with these parameters: // BAUD rate --> 9600 // Data Bits --> 8 // Parity --> None // Stop bits --> 1 // // -------------------------------------------------------------------------------------// // This project has been written for CodeWarrior 6.0 for RS08 // and uses Registers Files mc9rs08ka8.h, version 2.19 // // -------------------------------------------------------------------------------------// Copyright (c) 2007 SofTec Microsystems // http://www.softecmicro.com/ // ///////////////////////////////////////////////////////////////////////////////////////// #include <hidef.h> /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ ///////////////////////////////////////////////////////////////////////////////////////// // Defines and variables ///////////////////////////////////////////////////////////////////////////////////////// char tmp_string[4];

unsigned char task1_slice_time; unsigned char task2_slice_time; unsigned char adc_val; unsigned char selected_led_mask; #define BUS_FREQ #define SCI_BAUDRATE #define SCI_N_BUS_CYCLE #define SCI_X_VALUE #define PTBD_PTBD0_BIT #define PTBD_PTBD1_BIT 8000000 9600

// can also be 57600, 19200 or 9600

(((BUS_FREQ*10/SCI_BAUDRATE)+5)/10) (((((SCI_N_BUS_CYCLE - 24)*10)/7)+5)/10) 0 1

//////////////////////////////////////////////////////////////////////////////// // SCI_putchr // Sends the Accumulator to the RS-232. // The TX pin of the RS-232 transceiver is tied to the microcontroller's PTB1 pin. // Since the microcontroller doesn't have a SCI peripheral, the timings are reconstructed. // The values in brackets are the execution cycles. //////////////////////////////////////////////////////////////////////////////// void SCI_putchr(unsigned char ch) { unsigned char tmp0; PTBD |=PTBD_PTBD1_MASK; PTBDD |=PTBDD_PTBDD1_MASK; asm{ lda ch SCI_SendByte: mov #9,tmp0 clc SCI_SendNextBit: bcs SCI_Bit1 SCI_Bit0: bclr PTBD_PTBD1_BIT,PTBD bra SCI_IsLastBit SCI_Bit1: bset PTBD_PTBD1_BIT,PTBD bra SCI_IsLastBit // Idle state (TX = 1) // Configures PTB1 as output

;// Clears Carry to send the start bit

;// [3]

;// [5] TX=0 ;// [3] ;// [5] TX=1 ;// [3]

SCI_IsLastBit: ldx #SCI_X_VALUE SCI_IsLastBit_Loop: dbnzx SCI_IsLastBit_Loop dec tmp0 beq SCI_StopBit lsra bra SCI_SendNextBit SCI_StopBit: bset PTBD_PTBD1_BIT,PTBD ldx #SCI_X_VALUE SCI_StopBit_Loop: dbnzx SCI_StopBit_Loop bset PTBD_PTBD1_BIT,PTBD ldx #SCI_X_VALUE SCI_LastBit_Loop: dbnzx SCI_LastBit_Loop SCI_Exit: rts } }

;// [4] ;// [7*X] ;// [5] ;// [3] ;// [1] ;// [3]

From LSb to MSb

;// First Stop bit

;// Second Stop bit

//////////////////////////////////////////////////////////////////////////////// // SCI_puts //////////////////////////////////////////////////////////////////////////////// void SCI_puts(char *__far buf) { while(*buf != '\0') { SCI_putchr(*buf++); } SCI_putchr('\r'); } //////////////////////////////////////////////////////////////////////////////// // HEX_to_ASCII //////////////////////////////////////////////////////////////////////////////// char HEX_to_ASCII(unsigned char data){ if(data > 9){ return(data + 'A' - 10); }else { return(data + '0');

} } //////////////////////////////////////////////////////////////////////////////// // HEX_to_STRING //////////////////////////////////////////////////////////////////////////////// void HEX_to_STRING(unsigned char data, char string[4]) { string[0] = '$'; string[1] = HEX_to_ASCII(data >> 4); string[2] = HEX_to_ASCII(data & 0x0F); string[3] = '\0'; } //////////////////////////////////////////////////////////////////////////////// // Interrupt service routines //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // ISR_Dummy //////////////////////////////////////////////////////////////////////////////// void ISR_Dummy(void) { } //////////////////////////////////////////////////////////////////////////////// // ISR_ADC //////////////////////////////////////////////////////////////////////////////// void ISR_ADC(void) { while(!(ADCSC1 & ADCSC1_COCO_MASK)) ; adc_val = ADCRL; } //////////////////////////////////////////////////////////////////////////////// // ISR_RTC //////////////////////////////////////////////////////////////////////////////// void ISR_RTC(void) { SRTISC |= SRTISC_RTIACK_MASK;

if(task1_slice_time == 0) { HEX_to_STRING(adc_val, tmp_string); SCI_puts(tmp_string); task1_slice_time = 50; } else { task1_slice_time--; } if(task2_slice_time == 0) { PTCD ^= selected_led_mask ; task2_slice_time = (adc_val>>2); } else { task2_slice_time--; } }

// Every "task1_slice_time" times // the "adc_value" will be sent to // the host via RS-232

// Every "task2_slice_time" times // toggles the currently // selected LED

//////////////////////////////////////////////////////////////////////////////// // ISR_KBI /////////////////////////////////////////////////////////////////////////////// void ISR_KBI(void) { unsigned char ptad_sampled; ptad_sampled = PTAD; KBISC |= KBISC_KBACK_MASK; if(!(ptad_sampled & PTAD_PTAD2_MASK)) { // SW0 pressed ADCSC1 = ADCSC1_AIEN_MASK | ADCSC1_ADCO_MASK | 0x00; // Potentiometer enabled PTCD = PTCD_PTCD0_MASK; // Output to LED0 selected_led_mask = PTCD_PTCD0_MASK; } else if (!(ptad_sampled & PTAD_PTAD3_MASK)){ // SW1 pressed ADCSC1 = ADCSC1_AIEN_MASK | ADCSC1_ADCO_MASK | 0x01; // Light sensor enabled PTCD = PTCD_PTCD1_MASK; // Output to LED1 selected_led_mask = PTCD_PTCD1_MASK; } } #define _DEBUG //////////////////////////////////////////////////////////////////////////////// // Init_Peripheral // Reads PTAD

//////////////////////////////////////////////////////////////////////////////// void Init_Peripheral(void) { // CONFIGURES SYSTEM CONTROL #ifdef _DEBUG // Disables COP and enables BKGD (PTA4) and RESET (PTA5) pins SOPT = SOPT_BKGDPE_MASK | SOPT_RSTPE_MASK; #else // Disables COP and enables RESET (PTA5) pins SOPT = SOPT_RSTPE_MASK; #endif // CONFIGURES CLOCK (FEI Operation Mode) // Sets trimming value from the NV location ICSTRM = NVICSTRM_TRIM; // Selects FLL as clock source and disables it in stop mode ICSC1 = ICSC1_IREFS_MASK | ICSC1_IRCLKEN_MASK; // ICSOUT = DCO output frequency ICSC2 = 0; // Waits until FLL is engaged while(ICSSC & ICSSC_OSCINIT_MASK) ; // CONFIGURES RTI // SRTISC_RTIE_MASK = Real-time interrupts enabled // SRTISC_RTIS[1..0] = 001 8ms SRTISC = SRTISC_RTIE_MASK | SRTISC_RTIS0_MASK;

// CONFIGURES I/O PORT #ifndef _DEBUG PTAPE = PTAPE_PTAPE5_MASK; #endif PTCD = 0; // Output driver enable for LED0 and LED1 PTCDD = PTCDD_PTCDD0_MASK | PTCDD_PTCDD1_MASK; // CONFIGURES ADC

// The input clock source to generate the internal clock ADCK is th bus clock // The divide ratio used by the ADC to generate the internal clock ADCK is bus clock ÷ 2 ADCCFG = ADCCFG_ADIV0_MASK; // Mantains reset value ADCSC2 = 0x00; // Enables ADC control on pins ADP0 and ADP1 APCTL1 = APCTL1_ADPC1_MASK | APCTL1_ADPC0_MASK; // Enables ADC interrupt and continuous conversions on channel ADP0 (Potentiometer) ADCSC1 = ADCSC1_AIEN_MASK | ADCSC1_ADCO_MASK; // CONFIGURES KBI // Enables the SW0 and SW1 keyboard interrupt pin KBIPE = KBIPE_KBIPE3_MASK | KBIPE_KBIPE2_MASK; // Write to KBACK in KBISC to clear any false interrupts KBISC = KBISC_KBACK_MASK; // Enables keyboard interrupt requests KBISC = KBISC_KBIE_MASK; } //////////////////////////////////////////////////////////////////////////////// // main //////////////////////////////////////////////////////////////////////////////// void main(void) { Init_Peripheral(); task1_slice_time = 0; task2_slice_time = 0; selected_led_mask = PTCD_PTCD0_MASK; EnableInterrupts; for(;;){ if(SIP1 & SIP1_RTI_MASK) ISR_RTC(); if(SIP1 & SIP1_MTIM1_MASK) ISR_Dummy(); if(SIP1 & SIP1_MTIM2_MASK) ISR_Dummy(); if(SIP1 & SIP1_TPM_MASK) ISR_Dummy();

if(SIP1 & SIP1_ADC_MASK) ISR_ADC(); if(SIP1 & SIP1_ACMP_MASK) ISR_Dummy(); if(SIP1 & SIP1_KBI_MASK) ISR_KBI(); if(SIP1 & SIP1_IIC_MASK) ISR_Dummy(); SCI_putchr(0x28); } }


相关文章:
飞思卡尔单片机各种功能程序
飞思卡尔单片机各种功能程序_工学_高等教育_教育专区。流水灯四种效果: #include...飞思卡尔8位单片机MC9S0... 32页 免费 飞思卡尔RS08单片机入门... 8页 免费...
飞思卡尔单片机的程序
飞思卡尔单片机程序_电子/电路_工程科技_专业资料。...公共基础知识辅导 全国计算机等级考试三级笔试网络技术...飞思卡尔MC9S08及MC9S12... 11页 免费 ...
飞思卡尔单片机LED控制例程详解
飞思卡尔单片机LED控制例程详解_电子/电路_工程科技_专业资料。基于飞思卡尔单片机...我的第一个 LED 程序准备工作: 硬件:Freescale MC9S08JM60 型单片机一块; ...
飞思卡尔单片机烧写程序步骤
飞思卡尔单片机烧写程序步骤_信息与通信_工程科技_专业资料。freescale智能车制作 ...飞思卡尔单片机控制LCD1... 5页 免费 飞思卡尔RS08单片机入门... 8页 免费...
飞思卡尔单片机的FLASH操作
飞思卡尔单片机的FLASH操作_电子/电路_工程科技_专业资料。在对飞思卡尔单片机的 FLASH 进行擦除操作的时候, 必须把对此操作的程序代码搬运到 RAM 中, 因为在多 ...
飞思卡尔单片机编程
关于Codewarrior 中的 .prm 文件 网上广泛流传的一篇文章讲述的是 8 位飞思卡尔单片机的内 存映射,这几天,研究了一下 Codewarrior 5.0 prm 文件, 基于 16 位...
飞思卡尔单片机控制LCD1602程序范例
飞思卡尔单片机控制 LCD1602 程序范例(2008-11-19 09:24:27)标签:杂谈 分类:...LCD1602_RS #define LCD1602_RW #define LCD1602_EN #define LCDIO #define...
飞思卡尔单片机SCI通信程序
飞思卡尔单片机SCI通信程序_计算机软件及应用_IT/计算机_专业资料。针对初接触飞思...无奇偶校验 SCI1C2 = 0x08; //允许发送数据,禁止中断功能 while(1) { ...
飞思卡尔程序
飞思卡尔程序 2页 1财富值 飞思卡尔智能汽车程序 12页 2财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
Freescale8位单片机入门与实践
Freescale8位单片机入门与实践_工学_高等教育_教育专区...飞思卡尔(前身为摩托罗拉公司半导体产品事业部)在微...在 8 位单片机中,目前应用最多的就是 MC68HC08 ...
更多相关标签:
飞思卡尔单片机官网 | 飞思卡尔单片机 | 飞思卡尔单片机教程 | 飞思卡尔单片机选型 | 飞思卡尔16位单片机 | 飞思卡尔32位单片机 | 飞思卡尔k60单片机 | 飞思卡尔单片机型号 |