




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
集美大学机电专业单片机考试复习资料飞思卡尔AW60单片机复习1. 串口程序#include /* 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 2 ICGC1 = 0b01111000; /$78 internal clock generation while(!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(chi);unsigned char SCIRe1(unsigned char *p) unsigned int k; unsigned char i; for (k = 0; 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) chm = 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; else PTBD=0x00; 2.按键程序#include /* 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 |= (14)#define rsset PTCD |= (14)#define rsclr PTCD &=(14)#define rwout PTCDD |= (16)#define rwset PTCD |= (16)#define rwclr PTCD &=(16)#define enout PTFDD |= (16)#define enset PTFD |= (16)#define enclr PTFD &=(16)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;iMS;i+) for(j=0;j1141;j+);void Delay(uint count)uint i,j;for(j=0; jcount; j+) for(i=0;i1000; 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 &=(11); /屏蔽键盘中断(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 (KBtablei != 0x00) /在键盘定义表中搜索欲转换的键值,直至表尾 if(KBtablei = valve) /在表中找到相应的键值 KeyPress = KBtablei+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;/去23两位的数 tmp1 = (tmp13);/移到高位 tmp |= tmp1; tmp |= (tmp2 & 0x1f);/整合所有数值 /通过观察4根列线中是否出现低电平来判断当前行有无按键 if (tmp & 0xF0) != 0xF0) /当前行有键按下 break; /退出循环不再扫描 else /当前行无按键,准备扫描下一行 line = (line 1) | 0x01; if (i = 5) /无按键,以后将返回0xFF tmp = 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; iKB_count-1; i+)/以下多次扫描消除误差 Delay(15); KB_value_now = KBScan1(); if (KB_value_now = KB_value_last) return KB_value_now; /返回扫描的键值 else KB_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;num11;num+)write_data(tablenum);Delayms(20); KBInit(); / 键盘初始化 KBI1SC |=(11); / 开键盘中断 EnableInterrupts; / 开总中断for(;) ;interrupt 22 void isrKeyBoard(void) uint value; uint i; static int j=0; for(i=0; i50000; i+); DisableInterrupts; /关总中断 KBI1SC &=(11); /屏蔽键盘中断 KBI1SC|= KBISC_KBACK_MASK;/清中断标志位 value = KBScanN(10); /扫描键值,存于value中 if(value!=0xff) writedate(0x80+j,KBDef(value);/键值转化为定义值并发送 j+; PTDD&=0b01110011; PTGD&=0b11100000; /键盘初始化键盘中断 KBI1SC |=(11); /开放键盘中断 EnableInterrupts ; /开总中断 3. 数码管程序#include /* for EnableInterrupts macro */#include derivative.h /* include peripheral declarations */typedef unsigned char uint8;typedef unsigned short int uint16;const uint8 Dtable10 =/ 0 1 2 3 4 5 6 7 8 9 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F;const uint8 CStable4 =/ 0 1 2 3 0xDF,0xEF,0xFD,0xFE; void Delay(uint16 count) uint8 i; uint16 j; for(j=0; jcount; j+) for(i=0; i200; 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 = CStablei; PTBD = Dtablec; void LEDshow(uint8 *Buf) uint8 i,c; for (i = 0;i = 3;i+) c = Bufi-0; LEDshow1(i,c); Delay(100); void main(void) uint8 LEDBUF4; LEDBUF0=2; LEDBUF1=0; LEDBUF2=1; LEDBUF3=2; DisableInterrupts; MCUInit(); LEDinit(); EnableInterrupts; for(;) LEDshow(LEDBUF); 4. 电子钟程序#include /* 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 |= (14)#define rsset PTCD |= (14)#define rsclr PTCD &=(14) #define rwout PTCDD |= (16)#define rwset PTCD |= (16)#define rwclr PTCD &=(16)#define enout PTFDD |= (16)#define enset PTFD |= (16)#define enclr PTFD &=(16)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;iMS;i+) for(j=0;j1141;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的定时时间设定为200ms TPM1CNTH=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;num12;num+)write_data(tablenum);Delayms(20);write_com(0x80+0x40);for(num=0;num12;num+)write_data(table1num);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 /* 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 LEDBUF4;const uint8 Dtable10 =/ 0 1 2 3 4 5 6 7 8 9 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F;/片选表 (电平为低片选)const uint8 CStable4 =/ 0 1 2 3 0xDF,0xEF,0xFD,0xFE; void Delay(uint16 count) uint8 i; uint16 j; for(j=0; jcount; j+) for(i=0; 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_Vol(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 = CStablei; PTBD = Dtablec;void LEDshow(uint8 *Buf) uint8 i,c; for (i = 0;i = 3;i+) c = Bufi; LEDshow1(3-i,c); Delay(10); void main(void) uint8 V1Value; LEDBUF0=0; LEDBUF1=0; LEDBUF2=0; LEDBUF3=0; DisableInterrupts; MCUInit(); /MCU初始化 ADCInit(); /AD模块初始化 LEDinit(); /LED数码块接口初始化 EnableInterrupts; for(;) V1Value=ADCAve(15,50); /取得中值滤波法得到的AD转换数值 ADCV_Vol(V1Value,LEDBUF); /将AD转换数值转化为对应的电压值的 LEDshow(LEDBUF) ; /LED数码块显示 6. PWM程序#include /* 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(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年创新药研发靶点发现与验证技术标准化流程研究报告
- 航空航天高精度加工技术在2025年航空器试验设备加工中的应用报告
- 村级公路挡水墙合同协议
- 消防分包合同协议书范本
- 生鲜仓储配送承包协议书
- 电梯除尘垫采购合同范本
- 混凝土废渣处理合同范本
- 独栋写字楼出租合同范本
- 消费扶贫合作合同协议书
- 自动放弃工伤待遇协议书
- 智慧城市建设投标实施方案
- UL4703标准中文版-2020光伏线UL中文版标准
- 设备部班组安全培训
- 2024安置点生活垃圾清运合同书
- VMware双活数据心解决方案详解
- 管理学说课稿
- 办公用品及耗材采购服务投标方案(技术方案)
- 小学三年级数学下册计算题大全(每日一练共25份)
- SHT+3413-2019+石油化工石油气管道阻火器选用检验及验收标准
- 劳务招聘合作伙伴合同模板
- 甄嬛传电子版剧本第01-10集
评论
0/150
提交评论