集美大学 单片机考试复习资料 (基于飞思卡尔AW60)

合集下载

单片机考试试题和答案

单片机考试试题和答案

单片机考试试题和答案一、选择题(每题2分,共20分)1. 单片机是指()。

A. 单芯片微型计算机B. 单芯片微处理器C. 单芯片微控制器D. 单芯片微电脑答案:C2. 8051单片机的程序存储器和数据存储器的地址空间各是多少?()A. 64KB,64KBB. 64KB,128KBC. 128KB,64KBD. 64KB,256KB答案:C3. 8051单片机的外部中断有()个。

A. 1B. 2C. 3D. 4答案:B4. 8051单片机的定时器/计数器有几个?()A. 1B. 2C. 3D. 4答案:B5. 8051单片机的串行通信可以工作在()种方式。

A. 2B. 3C. 4D. 5答案:C6. 8051单片机的I/O口是()。

A. 准双向口B. 推挽输出C. 漏极开路D. 集电极开路答案:A7. 8051单片机的看门狗定时器是()。

A. 定时器0B. 定时器1C. 定时器2D. 定时器3答案:C8. 8051单片机的外部中断0的中断向量地址是()。

A. 0003HB. 0013HC. 0023HD. 0033H答案:B9. 8051单片机的外部中断1的中断向量地址是()。

A. 0003HB. 0013HC. 0023HD. 0033H答案:D10. 8051单片机的串行通信的波特率可以通过定时器()来设置。

A. 0B. 1C. 2D. 3答案:B二、填空题(每题2分,共20分)1. 8051单片机的内部RAM共有______字节。

答案:1282. 8051单片机的外部中断0的优先级高于外部中断1的优先级。

答案:错误3. 8051单片机的定时器0和定时器1可以工作在______模式。

答案:16位4. 8051单片机的看门狗定时器的溢出时间是______。

答案:1.085秒5. 8051单片机的串行通信可以工作在8位可变波特率模式。

答案:正确6. 8051单片机的I/O口P1.0和P1.1可以作为______使用。

(完整word版)单片机期末复习资料(完全版)

(完整word版)单片机期末复习资料(完全版)

◆单片机期末考试题型:第一题:填空题(30分),总30小空,每空1分第二题:判断题(15分),总15小题,每题1分第三题:简答题(30分),总6小题,每题5分,本题包括程序分析题第四题:编程题(25分),总2小题◆复习资料要点:教材 + 平时作业 + 实验报告(简答题和程序题主要复习课后习题和实验题)◆主要复习知识点:第一章微机计算机系统的基本知识1.单片机就是在一片硅片上集成了中央处理器、随机存储器、只读存储器、中断系统、定时/计数器和多种I/O口的微型计算机系统,该系统不带外部设备。

从组成和功能上看,它已经具备了计算机系统的基本属性,所以也可以称其为单片微型计算机,简称单片机。

2.微型处理器是单片机的核心。

它主要由三部分组成:寄存器阵列、运算器和控制器、3.程序计数器PC,专门用于存放现行指令的16位地址。

CPU就是根据PC中的地址到ROM中读取程序指令。

每当取出现行指令一个字节后,PC就自动加1,PC+1→PC,当遇到转移指令或子程序时,PC内容会被指定的地址取代,实现程序转移。

PC用于存放CPU下一条要执行的指令地址,是一个16位的专用寄存器。

(PC的功能与作用)4.运算器用来完成算术运算和逻辑运算操作,是处理信息的主要部件。

运算器主要由累加器A、状态寄存器PSW、算术运算单元ALU组成。

①累加器A,用来存放参与算术运算和逻辑运算的一个操作数和运算结果。

②状态字寄存器,用来保存ALU操作运算的条件标志,如进位标志、奇偶标志等。

③算术运算单元ALU,由加法器和其他逻辑电路组成,其基本功能是进行加法和移位运算,由此实现其他各种算术和逻辑运算。

5.控制器是分析和执行指令的部件,控制器只要由程序计数器PC、指令寄存器和指令译码器组成。

6.总线是用于传送信息的公共途径。

总线可以分为数据总线、地址总线、控制总线。

7.数据总线DB:数据线D0~D7共8位,由P0提供,分时输送低8位地址(通过地址锁存器锁存)和8位数据信息。

基于AW60的温度采集系统的设计与实现

基于AW60的温度采集系统的设计与实现

第30卷第2期苏 州 大 学 学 报(工 科 版)Vol 130No.22010年4月JOUR NAL OF S UZHOU UN I V ERSITY (ENGI NEER I N G SC I ENCE E D ITI ON )Ap r .2010收稿日期6作者简介孟德军(5),男,硕士研究生,主要研究方向为嵌入式系统应用。

基金项目国家自然科学基金资助项目(编号6636)。

文章编号:1673-047X (2010)-02-0006-06基于A W 60的温度采集系统的设计与实现孟德军1,林志贵2,钟晴晴2(1.天津工业大学信息与通信工程学院,天津300160;2.天津工业大学电气工程与自动化学院,天津300160)摘 要:介绍基于A W 60设计的一个温度采集系统。

该系统由基于PT100铂热电阻的温度采集电路、电桥电路、放大电路及A W 60最小系统组成。

电桥电路的作用是对采集信号进行校正,而基于T L062芯片的放大电路是对校正信号放大,这样可以消除由于PT100引线电阻差所带来的误差,还可以将采集的信号进行放大以克服信号变化范围小的缺点。

本次设计利用A W 60集成的A D 转换接口进行硬件设计,同时也给出软件设计、测试结果及设计过程中的体会,对基于Free scale 公司生产的8位MCU 系列的温度采集系统设计有重要的指导意义。

关键词:PT100;温度采集;A W60;电桥电路中图分类号:TP217 文献标识码:A0 引 言无论在工业、农业、科学研究、国防还是在人们日常生活的各个方面,温度测量和控制都是极为重要的课题[1]。

温度测量系统在单片机系统设计中应用广泛,根据单片机系统设计要求的不同,温度测量系统的设计也有所不同,有采用集成芯片的,也有采用恒流源器件和恒压源器件的[2]。

目前,温度测量系统中,首选PT100铂热电阻作为温度信号采集元件。

该温度传感器测量范围比较广,价格比较低廉,应用简单,在许多工业生产中已经得到了广泛的应用。

集美大学 单片机考试复习资料 (基于飞思卡尔AW60)

集美大学 单片机考试复习资料 (基于飞思卡尔AW60)

集美大学机电专业单片机考试复习资料飞思卡尔A W60单片机复习1. 串口程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void MCUInit(void){SOPT = 0b01100000; //$70 System Options Register(write once)ICGC2 = 0b00110000; //$30 internal clock generation 2ICGC1 = 0b01111000; //$78 internal clock generationwhile(!ICGS1_LOCK); //等待FLL稳定PTBDD=0xff ;PTBD=0xff ;}void SCIInit(){unsigned int ubgs,baud=9600;unsigned char sysclk=20;//1.计算波特率并设置:ubgs = fsys/(波特率*16)(其中fsys=sysclk*1000000)ubgs = sysclk*(10000/(baud/100))/16; //理解参考上一行,此处便于CPU运算SCI1BDH= (unsigned char)((ubgs & 0xFF00) >> 8);SCI1BDL= (unsigned char)(ubgs & 0x00FF);SCI1C1= 0; //无校验,正常模式(开始信号+ 8位数据(先发最低位) + 停止信号)SCI1C2= (0| SCI1C2_TE_MASK | SCI1C2_RE_MASK );//允许发送,允许接收,查询方式收发}void SCISend1(unsigned char ch){while(!(SCI1S1 & SCI1S1_TDRE_MASK));//判断发送缓冲区是否为空SCI1D = ch;}void SCISendN(unsigned char n, unsigned char ch[]){unsigned i;for (i = 0; i < n; i++)SCISend1(ch[i]);}unsigned char SCIRe1(unsigned char *p){unsigned int k;unsigned char i;for (k = 0; k < 0x0b; k++)//有时间限制if((SCI1S1 & SCI1S1_RDRF_MASK) != 0)//判断接收缓冲区是否满{i = SCI1D;*p = 0x00;break;}if (k >= 0x0b) //接收失败{i = 0xff;*p = 0x01;}return i;}unsigned char SCIReN(unsigned n,unsigned char ch[]){unsigned char m;unsigned char fp; //接收标志m = 0;while (m < n){ch[m] = SCIRe1(&fp);if (fp == 1){return 1; //接收失败}m++;}return 0; //接收成功}void main(void){unsigned char SerialBuff[]="Hello! World!"; //初始化存放接收数据的数组DisableInterrupts; //禁止总中断MCUInit();SCIInit();EnableInterrupts; //开放总中断SCISendN(13,SerialBuff); //串口发送"Hello World!"for(;;){if((SCI1S1&SCI1S1_RDRF_MASK)!=0){PTBD=SCI1D ;if((SCI1S1&SCI1S1_TDRE_MASK)!=0)SCI1D=PTBD;}elsePTBD=0x00;}}2.按键程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */ #define uchar unsigned char#define uint unsigned intunsigned char table[]="I love mcu!";unsigned char table1[]=" very much!";#define rsout PTCDD |= (1<<4)#define rsset PTCD |= (1<<4)#define rsclr PTCD &=~(1<<4)#define rwout PTCDD |= (1<<6)#define rwset PTCD |= (1<<6)#define rwclr PTCD &=~(1<<6)#define enout PTFDD |= (1<<6)#define enset PTFD |= (1<<6)#define enclr PTFD &=~(1<<6)void mcu_init(void){PTADD = 0XFF;rsout;rwout;enout;}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void Delayms(uint MS){uint i,j;for( i=0;i<MS;i++)for(j=0;j<1141;j++);}void Delay(uint count){uint i,j;for(j=0; j<count; j++){for(i=0;i<1000; i++);}}void write_com(uchar com){rsclr;rwclr;enclr;PTAD=com;Delayms(5);enset;Delayms(5);enclr;}void write_data(uchar date){rsset;rwclr;PTAD=date;Delayms(5);enset;Delayms(5);enclr;}void initlcd(void){write_com(0x38);Delayms(5);write_com(0x01);Delayms(5);write_com(0x06);Delayms(5);write_com(0x0c);Delayms(5);}void writedate(uint adress,uint date) {write_com(adress);write_data(date);}void KBInit(void){PTDD &= 0b01110011; //键盘口复位PTGD &= 0b11100000;PTDDD &= 0b01110011; //定义列线(7-4位)为输入PTGDD &= 0b11101111;PTDPE |= 0b10001100; //输入引脚(列线)有内部上拉电阻PTGPE |= 0b00010000;PTGDD |= 0b00001111; //行线(3-0位)为输出KBI1SC &=~(1<<1); //屏蔽键盘中断(KBIE = 0)KBI1PE = (0|KBI1PE_KBIPE7_MASK|KBI1PE_KBIPE6_MASK|KBI1PE_KBIPE5_MASK|KBI1PE_KBIPE4_MASK); //允许输入引脚(列线)的中断可进入KBI1SC = (0|KBI1SC_KBACK_MASK); //清除键盘中断请求(KBACK = 1)}const uint KBtable[] ={0xEE,'9',0xDE,'A',0xBE,'B',0x7E,'C',0xED,'6',0xDD,'7',0xBD,'8',0x7D,'D',0xEB,'3',0xDB,'4',0xBB,'5',0x7B,'E',0xE7,'0',0xD7,'1',0xB7,'2',0x77,'F',0x00};uint KBDef(uint valve){uint KeyPress;uint i;i = 0;KeyPress = 0xff;while (KBtable[i] != 0x00) //在键盘定义表中搜索欲转换的键值,直至表尾{if(KBtable[i] == valve) //在表中找到相应的键值{KeyPress = KBtable[i+1];//取出对应的键定义值break;}i += 2; //指向下一个键值,继续判断}return KeyPress;}uint KBScan1(void){uint line,i,tmp,tmp1,tmp2;line=0b11111110; //使第一根行线为0(低电平)for (i = 1; i <= 4; i++) //最多将扫描4根行线{PTGD = line; //输出开始扫描asm("NOP");asm("NOP");tmp1 = PTDD;tmp2 = PTGD;//整合扫描结果,即键盘输入引脚的4位tmp = (tmp1 & 0x80); //输入扫描结果取7位数tmp1 &= 0x0C;//去2\3两位的数tmp1 = (tmp1<<3);//移到高位tmp |= tmp1;tmp |= (tmp2 & 0x1f);//整合所有数值//通过观察4根列线中是否出现低电平来判断当前行有无按键if ((tmp & 0xF0) != 0xF0) //当前行有键按下{break; //退出循环不再扫描}else //当前行无按键,准备扫描下一行line = (line << 1) | 0x01;}if (i == 5) //无按键,以后将返回0xFFtmp = 0xFF;return (tmp);}uint KBScanN(uint KB_count){uint i,KB_value_last,KB_value_now;if (0 == KB_count || 1 == KB_count) //先扫描一次得到的键值,便于下面比较return KBScan1();KB_value_now = KB_value_last = KBScan1();for (i=0; i<KB_count-1; i++) //以下多次扫描消除误差{Delay(15);KB_value_now = KBScan1();if (KB_value_now == KB_value_last)return KB_value_now; //返回扫描的键值elseKB_value_last = KB_value_now;}return 0xFF; //返回出错标志}void main(void){uint num=0;DisableInterrupts;MCUInit();mcu_init();Delayms(30);initlcd();write_com(0x80+0x40);for(num=0;num<11;num++){write_data(table[num]);Delayms(20);}KBInit(); // 键盘初始化KBI1SC |=(1<<1); // 开键盘中断EnableInterrupts; // 开总中断for(;;) ;}interrupt 22 void isrKeyBoard(void){uint value;uint i;static int j=0;for(i=0; i<50000; i++);DisableInterrupts; //关总中断KBI1SC &=~(1<<1); //屏蔽键盘中断KBI1SC|= KBISC_KBACK_MASK; //清中断标志位value = KBScanN(10); //扫描键值,存于value中if(value!=0xff){writedate(0x80+j,KBDef(value));//键值转化为定义值并发送j++;}PTDD&=0b01110011;PTGD&=0b11100000; //键盘初始化键盘中断KBI1SC |=(1<<1); //开放键盘中断EnableInterrupts ; //开总中断}3. 数码管程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */typedef unsigned char uint8;typedef unsigned short int uint16;const uint8 Dtable[10] =// 0 1 2 3 4 5 6 7 8 9 {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; const uint8 CStable[4] =// 0 1 2 3{0xDF,0xEF,0xFD,0xFE};void Delay(uint16 count){uint8 i;uint16 j;for(j=0; j<count; j++)for(i=0; i<200; i++);}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void LEDinit(void){PTBDD = 0xFF; //数据口为输出PTDDD |= 0x33; //位选口为输出}void LEDshow1(uint8 i, uint8 c){PTDD = CStable[i];PTBD = Dtable[c];}void LEDshow(uint8 *Buf){uint8 i,c;for (i = 0;i <= 3;i++){c = Buf[i]-'0';LEDshow1(i,c);Delay(100);}}void main(void){uint8 LEDBUF[4];LEDBUF[0]='2';LEDBUF[1]='0';LEDBUF[2]='1';LEDBUF[3]='2';DisableInterrupts;MCUInit();LEDinit();EnableInterrupts;for(;;){LEDshow(LEDBUF);}}4. 电子钟程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */ #define uchar unsigned char#define uint unsigned intunsigned char table[]=" 2012-5-3";unsigned char table1[]=" 00:00:00";#define rsout PTCDD |= (1<<4)#define rsset PTCD |= (1<<4)#define rsclr PTCD &=~(1<<4)#define rwout PTCDD |= (1<<6)#define rwset PTCD |= (1<<6)#define rwclr PTCD &=~(1<<6)#define enout PTFDD |= (1<<6)#define enset PTFD |= (1<<6)#define enclr PTFD &=~(1<<6)uchar shi=0,fen=0,miao=0;uint Count_200ms=0;void mcu_init(void);void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void Delayms(uint MS){uint i,j;for( i=0;i<MS;i++)for(j=0;j<1141;j++);}void TPM1Init(void){TPM1SC=(0|TPM1SC_TOIE_MASK|TPM1SC_CLKSA_MASK|TPM1SC_PS2_MASK|TPM1SC_PS1_MASK); //TPM1时钟源选择系统时钟(20MHZ), 分频因子64 TPM1MODH=0xF4;TPM1MODL=0x24; //根据时钟源及分频因子,将TPM1的定时时间设定为200msTPM1CNTH=0x00;TPM1CNTL=0x00;}void write_com(uchar com){rsclr;rwclr;enclr;PTAD=com;Delayms(5);enset;Delayms(5);enclr;}void write_data(uchar date){rsset;rwclr;PTAD=date;Delayms(5);enset;Delayms(5);enclr;}void initlcd(void){write_com(0x38);Delayms(5);write_com(0x01);Delayms(5);write_com(0x06);Delayms(5);write_com(0x0c);Delayms(5);}void write_sfm(uchar add,uchar date) {uchar si,ge;si=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+si);write_data(0x30+ge);}void main(void){uint num=0;DisableInterrupts;MCUInit();mcu_init();Delayms(30);initlcd();TPM1Init();PTBDD=0XFF;PTBD=0XFF;EnableInterrupts;write_com(0x80);for(num=0;num<12;num++){write_data(table[num]);Delayms(20);}write_com(0x80+0x40);for(num=0;num<12;num++){write_data(table1[num]);Delayms(20);}for(;;){}}void mcu_init(void){PTADD = 0XFF;rsout;rwout;enout;}interrupt 11 void TPM1_200msover(void){uint temp;DisableInterrupts;Count_200ms++;while(Count_200ms==5){PTBD=~PTBD;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);Count_200ms=0;}temp=TPM1SC;TPM1SC&=~TPM1SC_TOF_MASK;EnableInterrupts;}5. AD转换程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */ typedef unsigned char uint8; // 8 位无符号数typedef unsigned short int uint16; // 16 位无符号数typedef unsigned long int uint32; // 32 位无符号数typedef char int8; // 8 位有符号数typedef short int int16; // 16 位有符号数typedef int int32; // 32 位有符号数uint8 LEDBUF[4];const uint8 Dtable[10] =// 0 1 2 3 4 5 6 7 8 9{0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F};//片选表(电平为低片选)const uint8 CStable[4] =// 0 1 2 3{0xDF,0xEF,0xFD,0xFE};void Delay(uint16 count){uint8 i;uint16 j;for(j=0; j<count; j++)for(i=0; i<200; i++);}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void ADCInit(void){ADC1CFG = 0b11010001; //低功耗,4分频,长采样,8位模式,总线时钟2分频ADC1SC1 = 0b00000000;ADC1SC2 = 0b00000000; //软件触发,禁止比较功能}uint8 ADCV alue(uint8 channel){uint8 SC1_3;uint8 resultH;uint8 result; //1 选取通道号AD0-AD27 = 00000-11011channel &= 0b00011111; //取通道号变量的低五位(实际通道号)SC1_3 =ADC1SC1&(ADC1SC1_COCO_MASK|ADC1SC1_AIEN_MASK|ADC1SC1_AIEN_MASK);// 取ADC1SC1的高三位(取上电复位默认值000)// 单次转换, 禁止中断, 转换未完成ADC1SC1 = SC1_3 | channel; //合并上述8位//2 取A/D转换结果while ((ADC1SC1 & ADC1SC1_COCO_MASK) == 0); //未完成则执行空操作resultH = ADC1RH;result =ADC1RL;return result;}uint8 ADCMid(uint8 channel) //中值滤波{uint8 i,j,k,tmp;//1 取三次A/D转换结果i = ADCV alue(channel);j = ADCV alue(channel);k = ADCV alue(channel);//2 从三次A/D转换结果中取中值tmp = (i > j) ? j : i;tmp = (tmp > k) ? tmp : k;return tmp;}uint8 ADCAve(uint8 channel, uint8 n) //均值滤波{uint16 i;uint32 j;j = 0;for (i = 0; i < n; i++)j += ADCMid(channel);j = j/n;return (uint8)j;}//将AD转换得到的数值量还原为实际的电压值,将电压值的BCD码存储显示缓冲区void ADCV_V ol(uint8 ADC_V,uint8 *p){uint8 V,V1;V=(uint8)(ADC_V/51);V1=ADC_V%51;*p=V;V=(uint8)(V1*10)/51;V1=(V1*10)%51;*(p+1)=V;V=(uint8)(V1*10)/51;V1=(V1*10)%51;*(p+2)=V;V=(uint8)(V1*10)/51;*(p+3)=V;}void LEDinit(void){PTBDD = 0xFF; //数据口为输出PTBPE=0xff; //为B口输出配置上拉电阻PTBDS=0xff;PTDDD |= 0x33; //位选口为输出}void LEDshow1(uint8 i, uint8 c){PTDD = CStable[i];PTBD = Dtable[c];}void LEDshow(uint8 *Buf){uint8 i,c;for (i = 0;i <= 3;i++){c = Buf[i];LEDshow1(3-i,c);Delay(10);}}void main(void){uint8 V1V alue;LEDBUF[0]='0';LEDBUF[1]='0';LEDBUF[2]='0';LEDBUF[3]='0';DisableInterrupts;MCUInit(); //MCU初始化ADCInit(); //AD模块初始化LEDinit(); //LED数码块接口初始化EnableInterrupts;for(;;){V1V alue=ADCAve(15,50); //取得中值滤波法得到的AD转换数值ADCV_V ol(V1V alue,LEDBUF); //将AD转换数值转化为对应的电压值的LEDshow(LEDBUF) ; //LED数码块显示}}6. PWM程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */typedef unsigned char uint8; // 8 位无符号数typedef unsigned short int uint16; // 16 位无符号数typedef unsigned long int uint32; // 32 位无符号数typedef char int8; // 8 位有符号数typedef short int int16; // 16 位有符号数typedef int int32; // 32 位有符号数uint16 T1_Mod=0;void delay(uint16 count){uint8 i;uint16 j;for(j=0; j<count; j++)for(i=0; i<200; i++) ;}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void TPM1Init(uint8 T1_p){uint16 temp;if(T1_p>200) T1_p=200; //(使用20M的总线频率作为时钟源,64分频,//最大定时时间不能超过200ms//设置TPM1禁止溢出中断,时钟源为总线时钟,64分频TPM1SC=0|TPM1SC_CLKSA_MASK|TPM1SC_PS2_MASK|TPM1SC_PS1_MASK;//0b00001110temp=(20000/64)*T1_p;T1_Mod=(uint16)temp;TPM1CNTH=0x00;TPM1CNTL=0x00;TPM1MODL=(uint8)T1_Mod; //设置TPM1的定时周期为50ms(50*1000/3.2=0x3D09)TPM1MODH=(uint8)(T1_Mod>>8);}void TPM1Ch_Init(void){TPM1C0SC=0|TPM1C0SC_MS0B_MASK|TPM1C0SC_MS0A_MASK|TPM1C0SC_ELS0B_MASK; //设置TPM1通道0不允许中断,PWM方式,高电平输出TPM1C0VL=0x00;TPM1C0VH=0x00;}void TPM1CH0_Run(uint8 percent){uint16 duty;uint8 dutyH,dutyL;duty=(T1_Mod/100)*percent;dutyH=duty/256;dutyL=duty%256;TPM1SC&=(~TPM1SC_CLKSA_MASK&~TPM1SC_CLKSB_MASK);TPM1CNTH=0x00;TPM1CNTL=0x00;TPM1MODL=(uint8)T1_Mod;TPM1MODH=(uint8)(T1_Mod>>8);TPM1C0VL=dutyL;TPM1C0VH=dutyH;TPM1SC=0|TPM1SC_CLKSA_MASK|TPM1SC_PS2_MASK|TPM1SC_PS1_MASK; }void main(void){MCUInit(); //MCU初始化DisableInterrupts;TPM1Ch_Init();TPM1Init(20);EnableInterrupts;for(;;){uint8 i;for(i=0;i<200;i++){if(i<=100)TPM1CH0_Run(i); //PWM脉冲输出elseTPM1CH0_Run(200-i);delay(200);}}}。

单片机期末考试复习资料(参考)

单片机期末考试复习资料(参考)

单片机期末考试复习资料(参考)1.单片机的4个并口的功能。

(P10—P11)P0.0—P0.7。

P0端口8位三态双向I/O口线,它分时作为低8位地址线和8位数据线。

在不访问外部存储器时,作为通用I/O口,传送输入输出数据。

P1.0—P1.7。

P1端口8位带内部上拉电阻的准双向I/O口线。

对P1端口写1时,P1端口被内部上拉电阻上拉为高电平,可以用作输入口。

P2.0—P2.7。

P2端口8位带内部上拉电阻的准双向I/O口线。

可作为一般I/O端口,在扩展容量时可作为高8位地址线。

P3.0—P3.7。

P3端口8位带内部上拉电阻的准双向I/O口线。

第一功能是普通的I/O端口,向P3端口写1时,P3端口被内部上拉电阻上拉为高电平,并且用作输入口。

第二功能是作为控制口。

2.单片机的堆栈的概念。

(P16)堆栈是一个特殊的存储区,用来暂存数据和地址,它是按先进后出的原则存取数据的。

堆栈共有两种操作,进栈和出栈。

特点是断点保护和保护现场。

3.单片机的外部中断的申请方式有哪些?(P64)电平(低电平有效)和边沿触发(下降沿有效)两种申请方式。

4.定时器/计数器的工作方式3是什么?(P78)M0、M1位于11时,设置T0、T1工作于方式3。

T0、T1工作于方式3时,T0被分解成两个独立的8位计数器TL0和TH0。

T1处于方式3时停止计数。

5.单片机的寻址空间。

64KB,范围:0000H—0FFFFH.6.单片机的中断源有哪些,优先级如何规定?(P63)(P66表4—5)P89C5X系列单片机有6个中断源,分别为外部中断0请求INT0、外部中断1请求INT1、定时器/计数器0溢出中断请求T0、定时器/计数器1溢出中断请求T1、串行中断请求RX或TX、定时器/计数器2溢出中断请求T2。

在同级的中断和更高级的中断没有产生的情况下,产生的中断将被服务,如果同级的中断或更高级的中断正在服务,新的中断只有等到正在服务的中断结束才能被服务。

集美大学微机期末复习题

集美大学微机期末复习题

第二章问答题1、什么是总线周期?什么是指令周期?题目答案:一个总线周期是指CPU通过总线与外部逻辑(存储器或外部设备)进行一次访问所需要的时间,8086的基本总线周期是由4个时钟周期(T1~T4)所组成。

典型的总线周期有存储器读朋期、存储器写周期、I/0设备的输入周期、I/O设备的输出周期、中断响应周期、空闲周期等。

一个指令周期是由若干个总线周期〔或机器周期)所组成;一个总线周期又是由若干个时钟周期所组成。

2、什么是微型计算机的系统总线?说明数据总线、地址总线、控制总线各自的作用。

题目答案:系统总线是CPU与其它部件之间传送数据、地址和控制信息的公共通道。

(1)数据总线:用来传送数据,主要实现CPU与内存储器或I/O设备之间、内存储器与I/O 设备或外存储器之间的数据传送。

(2)地址总线:用来传送地址。

主要实现从CPU送地址至内存储器和I/O设备。

(3)控制总线:用于传送控制信号、时序信号和状态信息等。

第四章问答题2、试回答:1. 下述程序段的功能是什么?2. 如从键盘输入字符…5‟,执行下列程序后有什么结果?STR DB 'ABCDEFGHIJ'MOV AH,1INT 21HAND AL,OFHDEC ALLEA BX,STRXOR AH,AXADD BX,AXMOV DL,[BX]MOV AL,2INT 21H题目答案:1. 输入数字n,显示字符串的第n个字符2. 输入数字5,则显示字符'E'2.从键盘输入一个字符,若输入的是大写字母则FLAG置1,否则清0。

5、现有程序如下:DA TA SEGMENTBUF DB 0DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DA TAMOV DS,AXMOV AH,1INT 21HCMP AL,61HJB NCMP AL,7AHJA NSUB AL,20HN: MOV BUF,ALMOV AH,4CHINT 21HCODE ENDSEND START请回答:(1)该程序完成什么功能?(2)如果要将“CMP AL,7AH”改为“CMP AL,7BH”,则相应的指令“JA N”应改为什么指令?题目答案:(1)将键盘输入的小写字母(a~z)变为大写字母存放在BUF中,其它字符则不改变,其值存放在BUF中。

单片机期末总复习资料

单片机期末总复习资料

第三章 指令系统
• 寻址方式
立即数寻址,MOV A,#33H
寄存器寻址,MOV A,R0
直接寻址,MOV A,30H
寄存器间接寻址,MOV A,@R0
变址寻址,MOVC A,@A+DPTR
相对寻址,SJMP $
JZ L1
位寻址,MOV C ,07H
• 1、下列数据传送指令是否有问题?如果有问题该如 何改正?
分析: ➢P1.1引脚的输出应每隔500ms取反一次,即定时时间为500ms, 长时间定时。 ➢定时/计数器方式1最大定时65.5ms。可用定时/计数器T1进行 10ms的定时,然后用寄存器R7对10ms定时中断次数计数50次来 实现。
➢定时初值:(216 C) *1us 10000us C D8F0H;TH1 D8H, TL1 F0H
3、中断请求寄存器 (TCON)
TCON 8FH 8EH 8DH 8CH
(88H) TF1
TF0
8BH 8AH 89H 88H
IE1 IT1 IE0 IT0
外部中断举例
要求:每次按键,使外接发光二极管LED改变一次亮灭状态。
解:INT0输入按键信号,P1.0输出改变LED状态。
ORG 0000H
AJMP MAIN
22
【例7-4】用T0作为计数器计数一生产流水线上的工件,每生产 100个工件,发出一包装命令,包装成一箱,并记录其箱数,
100个
包装命令
23
第8章 串行口通信
串行同步通信、异步通信各自的特点。 串行口1的工作方式有哪些?每种工作方式下的波特 率和帧格式是什么样的? 可以做为波特率发生器的是()、()
要注意:读外部引脚状态前,要先输出高电平,读回来的状态才 是正确的。 强推挽输出方式:输入输出都可达到20mA电流,适合需要较大 输出电流的情况。 仅为输入:所有输出均截止,对外是高阻状态,对输入没有影响。 开漏输出:内部上拉电阻断开。做输入输出时需要外加上拉电阻。

单片机复习资料(仅供参考)

单片机复习资料(仅供参考)

1.AT89C52单片机片内数据存储区的分布情况单片机内部数据存储器的地址范围是00H--FFH,内部数据存储器中的高128单元是专用寄存器区,低128单元是用户数据存储区,地址范围是00H-7FH。

其中00H-1FH是通用寄存器区,共32个单元。

20H-2FH是位寻址区,共16个单元128位,可直接位寻址,也可字节寻址。

30H-7FH共80个单元是用户区,只能字节寻址。

2.最小系统:单片机电源、电源滤波电路振荡电路复位电路RST引脚上高电平持续2个机器周期以上的时间。

3.89C52的中断系统有6个中断源,2个中断优先级,各个中断源的优先级是由特殊功能寄存器IP来确定,IP中和各个中断源对应位为1时,此中断源为高优先级,否则为低优先级。

在同一优先级中,各个中断源的优先顺序是由自然优先级来确定的。

各个中断源的入口地址是多少?4.看门狗的工作原理看门狗,又叫WDT(watchdog timer),实质上是一个独立的定时器电路。

在系统启动了看门狗后,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗定时器中的计数寄存器,那么看门狗计数器就会溢出,从而引起看门狗中断,造成系统复位。

所以,在使用看门狗时要注意及时清看门狗,即常说的“喂狗”。

在AT89S52中,WDT 由14位计数器和特殊功能寄存器中的看门狗定时器复位存储器(WDTRST)构成。

5、51单片机的复位电路有上电复位、手动复位电路两种。

(在单片机的9脚RET端至少维持2个机器周期的高电平)复位后,PC值为(0000H),SP值为(07H),通用寄存器的当前寄存器组为(第0)组,该组寄存器的地址范围是从(00H)到(07H)。

5.定时器的有关计算(注意单位换算)(定时/计数器实质是一个16位的可编程加法计数器)1.若8051的晶振频率fosc为12MHz,定时器/计数器T0工作在工作方式1,要求产生10ms定时,写出定时器的方式控制字和计数初值(分别写出TH0与TL0值)。

单片机原理及应用复习资料

单片机原理及应用复习资料

单片机原理及应用期终考试复习资料(样卷、补充题型介绍及试卷情况)一、样卷及部分答案试卷编号:( B )卷单片机原理及应用 课程 课程类别:必考生注意事项:1、本试卷共 7页,总分 100 分,考试时间 120 分钟。

2、考试结束后,考生不得将试卷、答题纸和草稿纸带出考场。

一、填空题(共32分)(每空一分)1.指挥计算机执行某种操作的命令称为( 指令 )。

2.8位二进制补码的为10000111,其真值是(),3.已知位地址为1AH ,则其对应的字节地址是( 23H ),是第(2 )位。

4.89C51单片机扩展数据存储器时用到的控制总线有( WR )和( RD )。

5.已知PSW 中的内容为36H ,则R5的字节地址为( 15H )。

6.若A 中的内容为01H ,那么,P 标志位为( 1 )。

7.内部数据存储器数据传输到外部数据存储器中指令有(MOVX @DPTR,A )和( MOVX @Ri,A )两条。

8.DA A 是( 十进制调整 )指令,对它的使用要求是:必须( 紧跟在加法指令后面 )。

9.89C51单片机的一个机器周期由( 6 )个S 状态组成。

10. 在进行微机系统扩展时,一般用锁存器作为( 输出 )口扩展器件,而用三态门作为( 输入口 )扩展器件。

11. 12根地址线可寻址数据存储空间( 4K )Byte 。

诺:我将严格遵守考场纪律,知道考试违纪、作弊的严重性,还知道请他人代考或代他人考者将被开除学籍和因作弊受记过及以上处分将不授予学士学位,愿承担由此引起的一切后果。

业 自动化 班级:2006- 学号 学生签名:13.外部中断的触发方式有(电平)以及(边沿)两种。

14.指令MOV C,30H的源操作数寻址方式为( 位寻址 )。

15.MOVC指令和MOVX指令的联系:(都是数据传送指令),区别:(前者访问的是程序存储器后者访问的是外部数据存储器)。

16.设指令SJMPrel的地址为2114H,当rel=7EH及rel=9BH时,程序将各跳到(2194H)和(20B1H)( sjmp 2个字节,负数向前跳,负数以补码存放)17.若IP=06H,这时单片机同时收到外部中断0、外部中断1和定时器0的中断申请,则单片机将先响应(T0 )。

集美大学2009至2010学年第一学期单片机原理期末考试试题

集美大学2009至2010学年第一学期单片机原理期末考试试题

集美⼤学2009⾄2010学年第⼀学期单⽚机原理期末考试试题集美⼤学2009⾄2010学年第⼀学期单⽚机原理期末考试试题集美⼤学期末考试试卷 2009—2010学年第⼀学期考试科⽬单⽚机原理考试成绩试卷类型 B 考试形式闭卷考试对象08电信⼀、选择题:本⼤题共15个⼩题,每⼩题1分,共15分,在每⼩题给出的四个选项中,只有⼀项符合题⽬要求,把所选项前的字母填在括号内。

1.单⽚机读写外RAM 数据⽤(1)指令,控制信号是(2)。

【 B 】A.(1)MOV (2)和B. (1)MOVX (2)和C.(1)MOVX(2)和D. (1)MOVC(2)和2. 8051单⽚机的堆栈区是向地址【 D 】的⽅向⽣成的。

A.可变B. 不定C.减⼩D. 增⼤3. 80C51单⽚机地址总线(AB )总线宽度为【 D 】位。

A. 8B. 16C. 15D. 32 4. ⼀个时钟周期等于【 B 】振荡周期。

A.1个B.2个C. 6个D. 12个5. ⼗进制数向⼆进制数进⾏转换时,⼗进制数91相当于⼆进制数【 D 】. A.1101011 B.1101111C.1110001D.10110116.程序计数器PC 是【 A 】位的计数器,能寻址64KB 的程序存储器范围。

A.16B. 8C. 4D. 327.80C51复位的条件是RST 引脚保持(1)个机器周期以上的⾼电平,复位后的状态:PC 值为(2)、SP 值为(3)、P0-P3⼝的值为(4)。

【 B 】A.(1)3(2)0000H(3)06H(4)FEHB.(1)2(2)0000H(3)07H(4)FFHC.(1)1(2)0000H(3)07H(4)FFHD.(1)2(2)0000H(3)60H(4)00H 8. 指令MOV 寻址空间是【 C 】。

A .⽚外ROMB 。

⽚外RAMC 。

⽚内RAMD 。

⽚内ROM 9. 指令MOVX 寻址空间是【 B 】。

A .⽚外ROMB 。

计算机系统结构-集美大学考试内容

计算机系统结构-集美大学考试内容

1-6.从机器(汇编)语言程序员看,以下哪些是透明的?透明的有:指令缓冲器、时标发生器、乘法器、主存地址寄存器、先行进位链、移位器。

1-10.想在系列机中发展一种新型号机器,下列哪些设想是可以考虑的,哪些是不行的?为什么?(1)新增自发数据类型和若干条字符处理指令,以支持事务处理程序的编译。

可以。

虽然它属于计算机系统结构的内容,但新增加的数据类型和指令不会影响到已有指令所写程序的正确运行。

(2)为增强中断处理功能,将中断分级由原来的4级增加到5级,并重新调整中断响应的优先次序。

不可以。

中断分级和终端的响应次序都属于计算机系统结构的内容,中断分级由4级增加到5级应当还是允许的,关键是重新调整了中断响应的优先次序,使原有程序的中断响应次序发生了改变,会影响原有程序工作的正确性。

(3)在CPU和主存之间增设Cache存储器,以克服因主存访问速率过低而造成的系统性能瓶颈。

可以。

Cache存储器属于计算机组成,它不会改变原有的系统程序和应用程序。

(4)为解决计算误差较大的问题,将机器中浮点数的下溢处理方法由原来的恒置“1法”,改为用ROM存放下溢处理结果的查表舍入法。

可以。

浮点数尾数的下溢处理不属于计算机系统结构,而是计算机组成设计所考虑的内容。

2-9.经统计,某机器14条指令的使用频度分别为0.01、0.15、0.12、0.03、0.02、0.04、0.02、0.04、0.01、0.13、0.15、0.14、0.11、0.03。

分别求出用等长码、哈夫曼码、只有两种码长的扩展操作码等三种编码方式的操作码平均码长。

(1)等长码:14条指令的等长操作码的平均码长是[1b41]位,即4位。

(2)哈夫曼遍码:先用哈夫曼算法构造哈夫曼树(P290),计算可得平均码长为3.38位。

(3)只有两种码长的扩展操作码:根据14条指令所给出的使用频度分成两群,较高6种指令的用3位操作码编码表示,留下两个3位码作为长码的扩展标志,扩展出2位,共有8条使用低频的指令的操作码,平均码长计算后(P291)为3.4位。

单片机原理及应用 期末复习资料

单片机原理及应用  期末复习资料

单片机原理及应用期末复习资料【单片机原理及应用】单片机(Microcontroller)是一种集成电路芯片,内部集成有中央处理器(CPU)、内存、输入输出接口和各种外设接口等主要组成部分,广泛应用于各种电子设备和系统中。

本文将围绕单片机的原理和应用展开讨论,为期末复习提供资料。

1. 单片机基本原理1.1 单片机架构单片机的架构可以分为哈佛结构和冯·诺依曼结构。

哈佛结构中,程序存储器和数据存储器分开存放,分别有独立的地址总线和数据总线;冯·诺依曼结构则将程序和数据存储在同一个存储器中,共享地址总线和数据总线。

1.2 单片机的工作原理单片机通过运行预先编写好的程序,完成各种功能。

它的工作原理可以概括为:输入设备通过接口与单片机相连,将输入信号转换为数字信号,单片机处理数字信号后,通过输出接口控制外部设备完成相应的操作。

1.3 单片机的指令集和编程语言单片机的指令集是单片机能够理解和执行的命令集合,不同的单片机拥有不同的指令集。

编程语言可以是汇编语言或高级语言,常用的汇编语言有汇编指令和汇编宏指令,高级语言常用的有C语言。

2. 单片机的应用领域2.1 家用电器单片机在家用电器中广泛应用,如洗衣机、空调、冰箱、微波炉等。

通过单片机控制,这些电器设备能够实现智能控制、定时启动和自动保护等功能。

2.2 工业自动化在工业自动化领域,单片机被广泛应用于生产线控制、工艺过程监控、仪器仪表控制等。

单片机通过各种传感器采集数据,并根据预设的控制策略,控制执行机构完成相应操作。

2.3 通讯设备单片机在通讯设备中扮演重要角色,如手机、无线路由器、通讯基站等。

单片机通过控制和处理通讯信号,实现数据的发送和接收、加密解密、网络连接等功能。

2.4 汽车电子单片机在汽车电子领域有广泛应用,如发动机控制单元(ECU)、车载音响系统、车载导航系统等。

单片机通过精密计算和控制,提高汽车性能、安全性和舒适性。

3. 单片机的开发工具3.1 开发环境单片机的开发环境包括集成开发环境(IDE)、编译器、烧录器等。

集美大学DSP复习提纲

集美大学DSP复习提纲

第一章1、什么是定点DSP 芯片和浮点DSP 芯片?各有什么优缺点?2、数据的定标方法,(16位数的Q 表示法或Qm.n 表示法)。

3、定点数的加/减法、乘法的运算。

第二章1、C54x DSP 的CPU 包括哪些内容?2、TMS320C5402 DSP 芯片的片内外围有哪些?3、TMS320C54x 的总线有何特点,主要包括哪些总线,它们的功能是什么?4、熟练掌握TMS320C5402存储器的配置。

第三章1、以下指令各采用什么寻址方式,以及指令执行的功能是什么:(1)LD #10H ,4,A(2)stl A ,*(1000h )(3) ;CPL=0,DP=20h ,sp=10hAdd @5,a(4) MAC *AR2+,*AR3+,A(5) MVMM AR2,AR72、掌握循环寻址和位码倒序寻址的功能3、’C54x DSP 有哪些重复操作?各有什么优点?4、写出计算201i i y x ==∑的主要汇编程序,并给程序添加注释,画出程序的流程图。

5、编写计算)9.0(*)3.0(6.0*)2.0(8.0*1.0--+-+=y 程序段。

5、本章所有的例题要掌握。

第四章1、简述DSP 汇编程序(汇编器、C 语言编译器)的段 .bss 、data 、sect 、text 、usect 各包含什么内容?2、说明以下C54x 伪指令的作用.end, .word, .ref, .global, .mmregs, .bss, .sect, .def, .usect, .copy, .include, .asg .set3、写出计算∑==71i i i x a y 的主要汇编程序,并给程序添加注释。

4、编写程序,用公式))))981(761(541(321(sin 2222⨯-⨯-⨯-⨯-=x x x x x θ计算45度角的正弦值。

5、FIR滤波器的实现程序:存储器分配如下在程序存储器中设置系数表。

数据存储器程序存储器O1d循环缓冲区系数表80h 88h x(n-4)COFF a0 低地址81h 89h x(n-5)a182h 8Ah x(n-6)a283h 8Bh x(n-7)←AR3 a3 高地址.mmregs.def start.bss y,1x_new .usect "DATA1",8x_o1d .usect "DATA1",8size .set 4PA0 .set 0PAl .set 1.dataCOEF .word 1*32768/10,2*32768/10.word 3*32768/10,4*32768/10.textstart: LD #y,DPSSBX FRCTstm #200,ar6stm #0a0h,ar5stm #200h,ar7STM #x_new,AR2 ;AR2指向新缓冲区第1个单元STM #x_o1d+(size-1),AR3 ;AR3指向老缓冲区最后1个单元STM # size,BK ;循环缓冲区长度=SizeSTM #-1,AR0 ;仿效*ARn-%LD #x_new,DPld *ar5+,astl a,@x_new ;输入X(n)FIR: ADD *AR2+0%,*AR3+0%,A ;AH=x(n)+x(n-7)(第一次) RPTZ B,#(size-1) ;B=0,下条指令执行size次FIRS *AR2+0%,*AR3+0%,COEF;B+=AH*a0,AH=X(n-1)+x(n-6),…STH B,@y ;保存结果sth b,*ar7+MAR *+AR2(2)% ;修正AR2,指向NEW缓冲区最老的数据MAR *AR3+% ;修正AR3,指向OLD缓冲区最老的数据MVDD *AR2,*AR3+0% ;新缓冲区向老缓冲区传送一个数banzd FIR,*ar6-mvdd *ar5+,*ar2nopnopret; PORTR PAl,*AR2 ;输入新数据至新缓冲区.END第五章1、简述流水线操作的基本原理。

(完整版)单片机原理及应用期末考试必考知识点重点总结

(完整版)单片机原理及应用期末考试必考知识点重点总结

单片机概述:单片机是微单片微型计算机的简称,微型计算机的一种。

它把中央处理器(CPU),随机存储器(RAM),只读存储器(ROM),定时器\计数器以及I\O 接口,串并通信等接口电路的功能集成与一块电路芯片的微型计算机。

字长:在计算机中有一组二进制编码表示一个信息,这组编码称为计算机的字,组成字的位数称为“字长”,字长标志着精度,MCS-51是8位的微型计算机。

89c51 是8位(字长)单片机(51系列为8位)单片机硬件系统仍然依照体系结构:包括CPU(进行运算、控制)、RAM(数据存储器)、ROM(程序存储器)、输入设备和输出设备、内部总线等。

由于一块尺寸有限的电路芯片实现多种功能,所以制作上要求单片机的高性能,结构简单,工作可靠稳定。

单片机软件系统包括监控程序,中断、控制、初始化等用户程序。

一般编程语言有汇编语言和C语言,都是通过编译以后得到机器语言(二进制代码)。

1.1单片机的半导体工艺一种是HMOS工艺,高密度短沟道MOS工艺具有高速度、高密度的特点;另一种是CHMOS工艺,互补金属氧化物的HMOS工艺,它兼有HMOS工艺的特点还具有CMOS的低功耗的特点。

例如:8051的功耗是630mW,80C51的功耗只有110mW左右。

1.2开发步5骤:1.设计单片机系统的电路2.利用软件开发工具(如:Keil c51)编辑程序,通过编译得到.hex的机器语言。

3.利用单片机仿真系统(例如:Protus)对单片机最小系统以及设计的外围电路,进行模拟的硬软件联合调试。

4.借助单片机开发工具软件(如:STC_ISP下载软件)读写设备将仿真中调试好的.hex程序拷到单片机的程序存储器里面。

5.根据设计实物搭建单片机系统。

2.1MCS-51单片机的组成:(有两个定时器)CPU(进行运算、控制)、RAM(数据存储器)、ROM(程序存储器)、I/O口(串口、并口)、内部总线和中断系统等。

工作过程框图如下:运算器组成:8位算术逻辑运算单元ALU(Arithmetic Logic Unit)、8位累加器A(Accumulator)、8位寄存器B、程序状态字寄存器PSW(Program Status Word)、8位暂存寄存器TMP1和TMP2等。

单片机技术复习题共34页PPT

单片机技术复习题共34页PPT

谢谢!
36、自己的鞋子,自己知道紧在哪里。——西班牙
37、我们唯一不会改正的缺点是软弱。——拉罗什福科
xiexie! 38、我这个人走得很慢,但是我从不后退。——亚伯拉罕·林肯
39、勿问成功的秘诀为何,且尽题
16、自己选择的路、跪着也要把它走 完。 17、一般情况下)不想三年以后的事, 只想现 在的事 。现在 有成就 ,以后 才能更 辉煌。
18、敢于向黑暗宣战的人,心里必须 充满光 明。 19、学习的关键--重复。
20、懦弱的人只会裹足不前,莽撞的 人只能 引为烧 身,只 有真正 勇敢的 人才能 所向披 靡。
40、学而不思则罔,思而不学则殆。——孔子
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

集美大学机电专业单片机考试复习资料飞思卡尔A W60单片机复习1. 串口程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void MCUInit(void){SOPT = 0b01100000; //$70 System Options Register(write once)ICGC2 = 0b00110000; //$30 internal clock generation 2ICGC1 = 0b01111000; //$78 internal clock generationwhile(!ICGS1_LOCK); //等待FLL稳定PTBDD=0xff ;PTBD=0xff ;}void SCIInit(){unsigned int ubgs,baud=9600;unsigned char sysclk=20;//1.计算波特率并设置:ubgs = fsys/(波特率*16)(其中fsys=sysclk*1000000)ubgs = sysclk*(10000/(baud/100))/16; //理解参考上一行,此处便于CPU运算SCI1BDH= (unsigned char)((ubgs & 0xFF00) >> 8);SCI1BDL= (unsigned char)(ubgs & 0x00FF);SCI1C1= 0; //无校验,正常模式(开始信号+ 8位数据(先发最低位) + 停止信号)SCI1C2= (0| SCI1C2_TE_MASK | SCI1C2_RE_MASK );//允许发送,允许接收,查询方式收发}void SCISend1(unsigned char ch){while(!(SCI1S1 & SCI1S1_TDRE_MASK));//判断发送缓冲区是否为空SCI1D = ch;}void SCISendN(unsigned char n, unsigned char ch[]){unsigned i;for (i = 0; i < n; i++)SCISend1(ch[i]);}unsigned char SCIRe1(unsigned char *p){unsigned int k;unsigned char i;for (k = 0; k < 0x0b; k++)//有时间限制if((SCI1S1 & SCI1S1_RDRF_MASK) != 0)//判断接收缓冲区是否满{i = SCI1D;*p = 0x00;break;}if (k >= 0x0b) //接收失败{i = 0xff;*p = 0x01;}return i;}unsigned char SCIReN(unsigned n,unsigned char ch[]){unsigned char m;unsigned char fp; //接收标志m = 0;while (m < n){ch[m] = SCIRe1(&fp);if (fp == 1){return 1; //接收失败}m++;}return 0; //接收成功}void main(void){unsigned char SerialBuff[]="Hello! World!"; //初始化存放接收数据的数组DisableInterrupts; //禁止总中断MCUInit();SCIInit();EnableInterrupts; //开放总中断SCISendN(13,SerialBuff); //串口发送"Hello World!"for(;;){if((SCI1S1&SCI1S1_RDRF_MASK)!=0){PTBD=SCI1D ;if((SCI1S1&SCI1S1_TDRE_MASK)!=0)SCI1D=PTBD;}elsePTBD=0x00;}}2.按键程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */ #define uchar unsigned char#define uint unsigned intunsigned char table[]="I love mcu!";unsigned char table1[]=" very much!";#define rsout PTCDD |= (1<<4)#define rsset PTCD |= (1<<4)#define rsclr PTCD &=~(1<<4)#define rwout PTCDD |= (1<<6)#define rwset PTCD |= (1<<6)#define rwclr PTCD &=~(1<<6)#define enout PTFDD |= (1<<6)#define enset PTFD |= (1<<6)#define enclr PTFD &=~(1<<6)void mcu_init(void){PTADD = 0XFF;rsout;rwout;enout;}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void Delayms(uint MS){uint i,j;for( i=0;i<MS;i++)for(j=0;j<1141;j++);}void Delay(uint count){uint i,j;for(j=0; j<count; j++){for(i=0;i<1000; i++);}}void write_com(uchar com){rsclr;rwclr;enclr;PTAD=com;Delayms(5);enset;Delayms(5);enclr;}void write_data(uchar date){rsset;rwclr;PTAD=date;Delayms(5);enset;Delayms(5);enclr;}void initlcd(void){write_com(0x38);Delayms(5);write_com(0x01);Delayms(5);write_com(0x06);Delayms(5);write_com(0x0c);Delayms(5);}void writedate(uint adress,uint date) {write_com(adress);write_data(date);}void KBInit(void){PTDD &= 0b01110011; //键盘口复位PTGD &= 0b11100000;PTDDD &= 0b01110011; //定义列线(7-4位)为输入PTGDD &= 0b11101111;PTDPE |= 0b10001100; //输入引脚(列线)有内部上拉电阻PTGPE |= 0b00010000;PTGDD |= 0b00001111; //行线(3-0位)为输出KBI1SC &=~(1<<1); //屏蔽键盘中断(KBIE = 0)KBI1PE = (0|KBI1PE_KBIPE7_MASK|KBI1PE_KBIPE6_MASK|KBI1PE_KBIPE5_MASK|KBI1PE_KBIPE4_MASK); //允许输入引脚(列线)的中断可进入KBI1SC = (0|KBI1SC_KBACK_MASK); //清除键盘中断请求(KBACK = 1)}const uint KBtable[] ={0xEE,'9',0xDE,'A',0xBE,'B',0x7E,'C',0xED,'6',0xDD,'7',0xBD,'8',0x7D,'D',0xEB,'3',0xDB,'4',0xBB,'5',0x7B,'E',0xE7,'0',0xD7,'1',0xB7,'2',0x77,'F',0x00};uint KBDef(uint valve){uint KeyPress;uint i;i = 0;KeyPress = 0xff;while (KBtable[i] != 0x00) //在键盘定义表中搜索欲转换的键值,直至表尾{if(KBtable[i] == valve) //在表中找到相应的键值{KeyPress = KBtable[i+1];//取出对应的键定义值break;}i += 2; //指向下一个键值,继续判断}return KeyPress;}uint KBScan1(void){uint line,i,tmp,tmp1,tmp2;line=0b11111110; //使第一根行线为0(低电平)for (i = 1; i <= 4; i++) //最多将扫描4根行线{PTGD = line; //输出开始扫描asm("NOP");asm("NOP");tmp1 = PTDD;tmp2 = PTGD;//整合扫描结果,即键盘输入引脚的4位tmp = (tmp1 & 0x80); //输入扫描结果取7位数tmp1 &= 0x0C;//去2\3两位的数tmp1 = (tmp1<<3);//移到高位tmp |= tmp1;tmp |= (tmp2 & 0x1f);//整合所有数值//通过观察4根列线中是否出现低电平来判断当前行有无按键if ((tmp & 0xF0) != 0xF0) //当前行有键按下{break; //退出循环不再扫描}else //当前行无按键,准备扫描下一行line = (line << 1) | 0x01;}if (i == 5) //无按键,以后将返回0xFFtmp = 0xFF;return (tmp);}uint KBScanN(uint KB_count){uint i,KB_value_last,KB_value_now;if (0 == KB_count || 1 == KB_count) //先扫描一次得到的键值,便于下面比较return KBScan1();KB_value_now = KB_value_last = KBScan1();for (i=0; i<KB_count-1; i++) //以下多次扫描消除误差{Delay(15);KB_value_now = KBScan1();if (KB_value_now == KB_value_last)return KB_value_now; //返回扫描的键值elseKB_value_last = KB_value_now;}return 0xFF; //返回出错标志}void main(void){uint num=0;DisableInterrupts;MCUInit();mcu_init();Delayms(30);initlcd();write_com(0x80+0x40);for(num=0;num<11;num++){write_data(table[num]);Delayms(20);}KBInit(); // 键盘初始化KBI1SC |=(1<<1); // 开键盘中断EnableInterrupts; // 开总中断for(;;) ;}interrupt 22 void isrKeyBoard(void){uint value;uint i;static int j=0;for(i=0; i<50000; i++);DisableInterrupts; //关总中断KBI1SC &=~(1<<1); //屏蔽键盘中断KBI1SC|= KBISC_KBACK_MASK; //清中断标志位value = KBScanN(10); //扫描键值,存于value中if(value!=0xff){writedate(0x80+j,KBDef(value));//键值转化为定义值并发送j++;}PTDD&=0b01110011;PTGD&=0b11100000; //键盘初始化键盘中断KBI1SC |=(1<<1); //开放键盘中断EnableInterrupts ; //开总中断}3. 数码管程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */typedef unsigned char uint8;typedef unsigned short int uint16;const uint8 Dtable[10] =// 0 1 2 3 4 5 6 7 8 9 {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; const uint8 CStable[4] =// 0 1 2 3{0xDF,0xEF,0xFD,0xFE};void Delay(uint16 count){uint8 i;uint16 j;for(j=0; j<count; j++)for(i=0; i<200; i++);}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void LEDinit(void){PTBDD = 0xFF; //数据口为输出PTDDD |= 0x33; //位选口为输出}void LEDshow1(uint8 i, uint8 c){PTDD = CStable[i];PTBD = Dtable[c];}void LEDshow(uint8 *Buf){uint8 i,c;for (i = 0;i <= 3;i++){c = Buf[i]-'0';LEDshow1(i,c);Delay(100);}}void main(void){uint8 LEDBUF[4];LEDBUF[0]='2';LEDBUF[1]='0';LEDBUF[2]='1';LEDBUF[3]='2';DisableInterrupts;MCUInit();LEDinit();EnableInterrupts;for(;;){LEDshow(LEDBUF);}}4. 电子钟程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */ #define uchar unsigned char#define uint unsigned intunsigned char table[]=" 2012-5-3";unsigned char table1[]=" 00:00:00";#define rsout PTCDD |= (1<<4)#define rsset PTCD |= (1<<4)#define rsclr PTCD &=~(1<<4)#define rwout PTCDD |= (1<<6)#define rwset PTCD |= (1<<6)#define rwclr PTCD &=~(1<<6)#define enout PTFDD |= (1<<6)#define enset PTFD |= (1<<6)#define enclr PTFD &=~(1<<6)uchar shi=0,fen=0,miao=0;uint Count_200ms=0;void mcu_init(void);void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void Delayms(uint MS){uint i,j;for( i=0;i<MS;i++)for(j=0;j<1141;j++);}void TPM1Init(void){TPM1SC=(0|TPM1SC_TOIE_MASK|TPM1SC_CLKSA_MASK|TPM1SC_PS2_MASK|TPM1SC_PS1_MASK); //TPM1时钟源选择系统时钟(20MHZ), 分频因子64 TPM1MODH=0xF4;TPM1MODL=0x24; //根据时钟源及分频因子,将TPM1的定时时间设定为200msTPM1CNTH=0x00;TPM1CNTL=0x00;}void write_com(uchar com){rsclr;rwclr;enclr;PTAD=com;Delayms(5);enset;Delayms(5);enclr;}void write_data(uchar date){rsset;rwclr;PTAD=date;Delayms(5);enset;Delayms(5);enclr;}void initlcd(void){write_com(0x38);Delayms(5);write_com(0x01);Delayms(5);write_com(0x06);Delayms(5);write_com(0x0c);Delayms(5);}void write_sfm(uchar add,uchar date) {uchar si,ge;si=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+si);write_data(0x30+ge);}void main(void){uint num=0;DisableInterrupts;MCUInit();mcu_init();Delayms(30);initlcd();TPM1Init();PTBDD=0XFF;PTBD=0XFF;EnableInterrupts;write_com(0x80);for(num=0;num<12;num++){write_data(table[num]);Delayms(20);}write_com(0x80+0x40);for(num=0;num<12;num++){write_data(table1[num]);Delayms(20);}for(;;){}}void mcu_init(void){PTADD = 0XFF;rsout;rwout;enout;}interrupt 11 void TPM1_200msover(void){uint temp;DisableInterrupts;Count_200ms++;while(Count_200ms==5){PTBD=~PTBD;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);Count_200ms=0;}temp=TPM1SC;TPM1SC&=~TPM1SC_TOF_MASK;EnableInterrupts;}5. AD转换程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */ typedef unsigned char uint8; // 8 位无符号数typedef unsigned short int uint16; // 16 位无符号数typedef unsigned long int uint32; // 32 位无符号数typedef char int8; // 8 位有符号数typedef short int int16; // 16 位有符号数typedef int int32; // 32 位有符号数uint8 LEDBUF[4];const uint8 Dtable[10] =// 0 1 2 3 4 5 6 7 8 9{0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F};//片选表(电平为低片选)const uint8 CStable[4] =// 0 1 2 3{0xDF,0xEF,0xFD,0xFE};void Delay(uint16 count){uint8 i;uint16 j;for(j=0; j<count; j++)for(i=0; i<200; i++);}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void ADCInit(void){ADC1CFG = 0b11010001; //低功耗,4分频,长采样,8位模式,总线时钟2分频ADC1SC1 = 0b00000000;ADC1SC2 = 0b00000000; //软件触发,禁止比较功能}uint8 ADCV alue(uint8 channel){uint8 SC1_3;uint8 resultH;uint8 result; //1 选取通道号AD0-AD27 = 00000-11011channel &= 0b00011111; //取通道号变量的低五位(实际通道号)SC1_3 =ADC1SC1&(ADC1SC1_COCO_MASK|ADC1SC1_AIEN_MASK|ADC1SC1_AIEN_MASK);// 取ADC1SC1的高三位(取上电复位默认值000)// 单次转换, 禁止中断, 转换未完成ADC1SC1 = SC1_3 | channel; //合并上述8位//2 取A/D转换结果while ((ADC1SC1 & ADC1SC1_COCO_MASK) == 0); //未完成则执行空操作resultH = ADC1RH;result =ADC1RL;return result;}uint8 ADCMid(uint8 channel) //中值滤波{uint8 i,j,k,tmp;//1 取三次A/D转换结果i = ADCV alue(channel);j = ADCV alue(channel);k = ADCV alue(channel);//2 从三次A/D转换结果中取中值tmp = (i > j) ? j : i;tmp = (tmp > k) ? tmp : k;return tmp;}uint8 ADCAve(uint8 channel, uint8 n) //均值滤波{uint16 i;uint32 j;j = 0;for (i = 0; i < n; i++)j += ADCMid(channel);j = j/n;return (uint8)j;}//将AD转换得到的数值量还原为实际的电压值,将电压值的BCD码存储显示缓冲区void ADCV_V ol(uint8 ADC_V,uint8 *p){uint8 V,V1;V=(uint8)(ADC_V/51);V1=ADC_V%51;*p=V;V=(uint8)(V1*10)/51;V1=(V1*10)%51;*(p+1)=V;V=(uint8)(V1*10)/51;V1=(V1*10)%51;*(p+2)=V;V=(uint8)(V1*10)/51;*(p+3)=V;}void LEDinit(void){PTBDD = 0xFF; //数据口为输出PTBPE=0xff; //为B口输出配置上拉电阻PTBDS=0xff;PTDDD |= 0x33; //位选口为输出}void LEDshow1(uint8 i, uint8 c){PTDD = CStable[i];PTBD = Dtable[c];}void LEDshow(uint8 *Buf){uint8 i,c;for (i = 0;i <= 3;i++){c = Buf[i];LEDshow1(3-i,c);Delay(10);}}void main(void){uint8 V1V alue;LEDBUF[0]='0';LEDBUF[1]='0';LEDBUF[2]='0';LEDBUF[3]='0';DisableInterrupts;MCUInit(); //MCU初始化ADCInit(); //AD模块初始化LEDinit(); //LED数码块接口初始化EnableInterrupts;for(;;){V1V alue=ADCAve(15,50); //取得中值滤波法得到的AD转换数值ADCV_V ol(V1V alue,LEDBUF); //将AD转换数值转化为对应的电压值的LEDshow(LEDBUF) ; //LED数码块显示}}6. PWM程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */typedef unsigned char uint8; // 8 位无符号数typedef unsigned short int uint16; // 16 位无符号数typedef unsigned long int uint32; // 32 位无符号数typedef char int8; // 8 位有符号数typedef short int int16; // 16 位有符号数typedef int int32; // 32 位有符号数uint16 T1_Mod=0;void delay(uint16 count){uint8 i;uint16 j;for(j=0; j<count; j++)for(i=0; i<200; i++) ;}void MCUInit(void){SOPT = 0b01110000;ICGC2 = 0b00110000;ICGC1 = 0b01111000;while(!ICGS1_LOCK);}void TPM1Init(uint8 T1_p){uint16 temp;if(T1_p>200) T1_p=200; //(使用20M的总线频率作为时钟源,64分频,//最大定时时间不能超过200ms//设置TPM1禁止溢出中断,时钟源为总线时钟,64分频TPM1SC=0|TPM1SC_CLKSA_MASK|TPM1SC_PS2_MASK|TPM1SC_PS1_MASK;//0b00001110temp=(20000/64)*T1_p;T1_Mod=(uint16)temp;TPM1CNTH=0x00;TPM1CNTL=0x00;TPM1MODL=(uint8)T1_Mod; //设置TPM1的定时周期为50ms(50*1000/3.2=0x3D09)TPM1MODH=(uint8)(T1_Mod>>8);}void TPM1Ch_Init(void){TPM1C0SC=0|TPM1C0SC_MS0B_MASK|TPM1C0SC_MS0A_MASK|TPM1C0SC_ELS0B_MASK; //设置TPM1通道0不允许中断,PWM方式,高电平输出TPM1C0VL=0x00;TPM1C0VH=0x00;}void TPM1CH0_Run(uint8 percent){uint16 duty;uint8 dutyH,dutyL;duty=(T1_Mod/100)*percent;dutyH=duty/256;dutyL=duty%256;TPM1SC&=(~TPM1SC_CLKSA_MASK&~TPM1SC_CLKSB_MASK);TPM1CNTH=0x00;TPM1CNTL=0x00;TPM1MODL=(uint8)T1_Mod;TPM1MODH=(uint8)(T1_Mod>>8);TPM1C0VL=dutyL;TPM1C0VH=dutyH;TPM1SC=0|TPM1SC_CLKSA_MASK|TPM1SC_PS2_MASK|TPM1SC_PS1_MASK; }void main(void){MCUInit(); //MCU初始化DisableInterrupts;TPM1Ch_Init();TPM1Init(20);EnableInterrupts;for(;;){uint8 i;for(i=0;i<200;i++){if(i<=100)TPM1CH0_Run(i); //PWM脉冲输出elseTPM1CH0_Run(200-i);delay(200);}}}。

相关文档
最新文档