




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、LED闪烁程序注释#include<reg52.h>sbitLED=P0A0;sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=P1A3;sbitENLED=P1A4;voidmain()/void即函数类型(/以下为声明语句部分unsignedinti=0;/定义一个无符号整型变量i,并赋初值0/以下为执行语句部分ENLED=0;/U3、U4两片74HC138总使能ADDR3=1;/使能U3使之正常输出ADDR2=1;/经U3的丫6输出开启三极管Q16ADDR1=1;ADDR0=0;while(1)(LED=0;/点
2、亮小灯for(i=0;i<30000;i+);/延时一段时间LED=1;/熄灭小灯for(i=0;i<30000;i+);/延时一段时间)2、流水灯的程序注释#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;voidmain()unsignedinti=0;/定义循环变量i,用于软件延时unsignedcharcnt=0;/定义计数变量cnt,用于移位控制ENLED=0;ADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;whil
3、e(1)/主循环,程序无限循环执行该循环体语句P0=(0x01<<cnt);/P0等于1左移cnt位,控制8个LEDfor(i=0;i<20000;i+);/软件延时cnt+;/移位计数变量自加1if(cnt>=8)/移位计数超过7后,再重新从0开始cnt=0;3、数码管的静态显示程序注释#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;/用数组来存储数码管的真值表,数组将在下一章详细介绍unsignedcharcodeLedCh
4、ar=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;voidmain()unsignedcharcnt=0;/记录T0中断次数unsignedcharsec=0;/记录经过的秒数ENLED=0;/使能U3,选择数码管DS1ADDR3=1ADDR2=0ADDR1=0ADDR0=0TMOD=0x01;/设置T0为模式1TH0=0xB8;/为T0赋初值0xB800TL0=0x00;TR0=1;/启动T0while(1)if(TF0=1)/TF0=0;/T0TH0=0xB8;/TL0=0x
5、00;cnt+;/溢出是否达到50次判断T0是否溢出溢出后,清零中断标志并重新赋初值if(cnt>=50)/判断T0cnt=0;/P0=LedCharsec;sec+;/秒数记录自加达到50次后计数值清零/当前秒数对应的真值表中的值送到P0口1if(sec>=16)/当秒数超过0x0F(15)后,重新从0开始sec=0;4、点阵程序读写注释1、#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;voidmain()ENLED=0;/U3、U4两
6、片74HC138总使能ADDR3=0;/使能U4使之正常输出ADDR2=0;/经U4的Y1输出开启三极管Q11ADDR1=0;ADDR0=1;P0=0x00;/向P0写入0来点亮一行while(1);/程序停止在这里2、#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;voidmain()EA=1;/使能总中断ENLED=0;/使能U4,选择LED点阵ADDR3=0;/TMOD=0x01;/TH0=0xFC;/因为需要动态改变ADDR0-2的值,所以不需
7、要再初始化了设置T0为模式1为T0赋初值0xFC67,定时1msTL0=0x67;ET0=1;/使能T0中断TR0=1;/启动T0while;程序停在这里,等待定时器中断/*定时器0中断服务函数*/动态扫描的索引voidInterruptTimer0()interrupt1staticunsignedchari=0;/TH0=0xFC;/重新加载初值TL0=0x67;/以下代码完成LED点阵动态扫描刷新P0=0xFF;/显示消隐switch(i)case0:ADDR2=0;ADDR1=0;ADDR0=0;i+;P0=0x00;break;case1:ADDR2=0;ADDR1=0;ADDR0=
8、1;i+;P0=0x00;break;case2:ADDR2=0;ADDR1=1ADDR0=0;i+;P0=0x00;break;case3:ADDR2=0;ADDR1=1;ADDR0=1;i+;P0=0x00;break;case4:ADDR2=1;ADDR1=0;ADDR0=0;i+;P0=0x00;break;case5:ADDR2=1;ADDR1=0;ADDR0=1;i+;P0=0x00;break;case6:ADDR2=1;ADDR1=1;ADDR0=0;i+;P0=0x00;break;case7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=0x00;break
9、;default:break;5、写程序#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=Pi1;sbitADDR2=Pi2;sbitADDR3=Pi3;sbitENLED=Pi4;unsignedcharcodeimage=/图片的字模表0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0x
10、FF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;voidmain()(EA=1;/使能总中断ENLED=0;/使能U4,选择LED点阵ADDR3=0;TMOD=0x01;/设置T0为模式1TH0=0xFC;/为T0赋初值0xFC67,定时1msTL0=0x67;ET0=1;/使能T0中断TR0=1;/启动T0while(1);/*定时器0中断服务函数*/voidInterruptTimer0()interrupt1staticunsignedchari=0;/动态扫描的索引软件定时器staticunsignedcharindex=0;/static图片刷新
11、索引unsignedchartmr=0;250msTH0=0xFC;/重新加载初值TL0=0x67;/以下代码完成LED点阵动态扫描刷新P0=0xFF;/显示消隐switch(i)case0:ADDR2=0;ADDR1=0;ADDR0=0;i+;P0=imageindex+0;break;case1:ADDR2=0ADDR1=0ADDR0=1;i+;P0=imageindex+1;break;case2:ADDR2=0;ADDR1=1;ADDR0=0;i+;P0=imageindex+2;break;case3:ADDR2=0;ADDR1=1;ADDR0=1;i+;P0=imageindex+
12、3;break;case4:ADDR2=1;ADDR1=0;ADDR0=0;i+;P0=imageindex+4;break;case5:ADDR2=1ADDR1=0;ADDR0=1;i+;P0=imageindex+5;break;case6:ADDR2=1ADDR1=1ADDR0=0;i+;P0=imageindex+6;break;case7:ADDR2=1ADDR1=1;ADDR0=1;i=0;P0=imageindex+7;break;default:break;/以下代码完成每250ms改变一帧图像tmr+;if(tmr>=250)/达到250ms时改变一次图片索引tmr=0
13、;index+;if(index>=32)/图片索引达到32后归零index=0;6、矩阵按键的扫描程序(与注释相对应)#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=P1A3;sbitENLED=P1A4;sbitKEY_IN_1=P2A4;sbitKEY_IN_2=P2A5;sbitKEY_IN_3=P2A6;sbitKEY_IN_4=P2A7;sbitKEY_OUT_=P2A3;sbitKEY_OUT_2=P2A2;sbitKEY_OUT_*P2A1;sbitKEY_OUT_
14、4=P2A0;unsignedcharcodeLedChar=/数码管显示字符转换表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;unsignedcharKeySta44=/全部矩阵按键的当前状态1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1按键值备份,保存前一次;voidmain()unsignedchari,j;unsignedcharbackup44=/的值1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;EA=1;/ENLED=0;/ADDR3
15、=1;ADDR2=0;ADDR1=0;ADDR0=0;TMOD=0x01;/TH0=0xFC;/TL0=0x67;ET0=1;/TR0=1;/选择数码管DS1进行显示能总中断设置T0为模式1为T0赋初值0xFC67,定时1ms使能T0中断启动T0P0=LedChar0;/默认显示0while(1)for(i=0;i<4;i+)/循环检测4*4的矩阵按键for(j=0;j<4;j+)if(backupij!=KeyStaij)/检测按键动作if(backupij!=0)/按键按下时执行动作P0=LedChari*4+j;/将编号显示到数码管backupij=KeyStaij;/更新前
16、一次的备份值/*T0中断服务函数,扫描矩阵按键状态并消抖*/voidInterruptTimer0()interrupt1unsignedchari;staticunsignedcharkeyout=0;/矩阵按键扫描输出索引staticunsignedcharkeybuf44=/矩阵按键扫描缓冲区0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;TH0=0xFC;/重新加载初值TL0=0x67;/将一彳f的4个按键值移入缓冲区keybufkeyout0=(keybufkeyout0&
17、lt;<1)|KEY_IN_1;keybufkeyout1=(keybufkeyout1<<1)|KEY_IN_2;keybufkeyout2=(keybufkeyout2<<1)|KEY_IN_3;keybufkeyout3=(keybufkeyout3<<1)|KEY_IN_4;/消抖后更新按键状态for(i=0;i<4;i+)/每行4个按键,所以循环4次if(keybufkeyouti&0x0F)=0x00)/连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下KeyStakeyouti=0;elseif(key
18、bufkeyouti&0x0F)=0x0F)/连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起KeyStakeyouti=1;/执行下一次的扫描输出keyout+;/输出索引递增keyout=keyout&0x03;/索引值加到4即归零switch(keyout)/根据索引,释放当前输出引脚,拉低下次的输出引脚case0:KEY_OUT_4=1;KEY_OUT_1=0;break;case1:KEY_OUT_1=1;KEY_OUT_2=0;break;case2:KEY_OUT_2=1;KEY_OUT_3=0;break;case3:KEY_OUT_3=
19、1;KEY_OUT_4=0;break;default:break;7、程序注释#include<reg52.h>voidConfigUART(unsignedintbaud);voidmain()EA=1;/使能总中断ConfigUART(9600);配置波特率为9600while(1);/*串口配置函数,baud-通信波特率*/SCON=0x50;/TMOD&=0x0F;/TMOD|=0x20;/voidConfigUART(unsignedintbaud)配置串口为模式1清零T1的控制位配置T1为模式2#include<reg52.h>voidConfig
20、UART(unsignedintbaud);voidmain()EA=1;/使能总中断ConfigUART(9600);/配置波特率为9600while(1);/*串口配置函数,baud-通信波特率*/voidConfigUART(unsignedintbaud)SCON=0x50;/配置串口为模式1TMOD&=0x0F;/清零T1的控制位TMOD|=0x20;/配置T1为模式28、程序注释#include<reg52.h>sbitLED=P0A0;sbitADDR0=Pi0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=P1A3;sbit
21、ENLED=Pi4;voidmain()unsignedcharcnt=0;/定义一个计数变量,记录T0溢出次数ENLED=0;/使能U3,选择独立LEDADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;TMOD=0x01;/设置T0为模式1TH0=0xB8;/为T0赋初值0xB800TL0=0x00;TR0=1;/启动T0while(1)if(TF0=1)/判断T0是否溢出TF0=0;/T0TH0=0xB8;/溢出后,清零中断标志并重新赋初值TL0=0x00;cnt+;/计数值自加1if(cnt>=50)/判断T0溢出是否达到50次cnt=0;/达到50次后计数值清零LE
22、D=LED;/LED取反:0->1、1->09、按键扫描#include<reg52.h>sbitADDR0=Pi0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;sbitKEY1=P2A4;sbitKEY2=P2A5;sbitKEY3=P2A6;sbitKEY4=P2A7;unsignedcharcodeLedChar=/数码管显示字符转换表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;
23、bitKeySta=1;/当前按键状态unsignedvoidmain()bitbackup=1;/按键值备份,保存前一次的扫描值charcnt=0;/EA=1;/按键计数,记录按键按下的次数使能总中断ENLED=0;/选择数码管DS1进行显示ADDR3=1;ADDR2=0;ADDR1=0;ADDR0=0;TMOD=0x01;/TH0=0xF8;/TL0=0xCD;ET0=1;/TR0=1;/设置T0为模式1为T0赋初值0xF8CD,定时2ms使能T0中断启动T0P2=0xF7;/P2.3置0,即KeyOut1输出低电平P0=LedCharcnt;/显示按键次数初值当前值与前次值不相等说明此时
24、按键有动作如果前次值为0,则说明当前是弹起动作只用1个数码管显示,所以加到10就清零重新开始while(1)if(KeySta!=backup)/if(backup=0)/cnt+;/按键次数+1if(cnt>=10)/cnt=0;P0=LedCharcnt;/计数值显示到数码管上backup=KeySta;/更新备份为当前值,以备进行下次比较*/扫描缓冲区,保存一段时间内的扫描值/*T0中断服务函数,用于按键状态的扫描并消抖voidInterruptTimer0()interrupt1staticunsignedcharkeybuf=0xFF;/TH0=0xF8;/重新加载初值TL0=
25、0xCD;(keybufkeybuf=(keybuf<<1)|KEY4;/缓冲区左移一位,并将当前扫描值移入最低位if=0x00)/连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下KeySta=0;elseif(keybuf=0xFF)/连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起KeySta=1;else/其它情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新10、马达转动#include<reg52.h>unsignedlongbeats=0;/电机转动节拍总数voidStartMotor(unsigne
26、dlongangle);voidmain()EA=1;/使能总中断TMOD=0x01;/设置T0为模式1TH0=0xF8;/TL0=0xCD;ET0=1;/TR0=1;/为T0赋初值0xF8CD,定时2ms使能T0中断启动T0StartMotor(360*2+180);/控制电机转动2圈半while(1);)/*步进电机启动函数,angle-需转过的角度*/voidStartMotor(unsignedlongangle)(/在计算前关闭中断,完成后再打开,以避免中断打断计算过程而造成错误EA=0;beats=(angle*4076)/360;/实测为4076拍转动一圈EA=1;)/*T0中断
27、服务函数,用于驱动步进电机旋转voidInterruptTimer0()interrupt1unsignedchartmp;/临时变量staticunsignedcharindex=0;/unsignedcharcodeBeatCode8=/0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6);*/节拍输出索引步进电机节拍对应的IO控制代码TH0=0xF8;/重新加载初值TL0=0xCD;if(beats!=0)/节拍数不为0则产生一个驱动节拍tmp=P1;/用tmp把P1口当前值暂存tmp=tmp&0xF0;/用&®作清零低4位tmp=tmp|BeatC
28、odeindex;/用|操作把节拍代码写到低4位P1=tmp;/index+;/把低4位的节拍代码和高4位的原值送回P1节拍输出索引递增index=index&0x07;/用&操作实现到8归零beats-;/总节拍数-1)else/节拍数为0则关闭电机所有的相P1=P1|0x0F;1 .单片机的三大内部资源是:Flash程序存储空间RAM-数据存储空间。SFR-特殊功能寄存器,Flash以其可重复擦写且容量大成本低的优点成为现在绝大多数单片机的程序存储器。对于单片机来说Flash最大的意义是断电后数据不丢失。RAM是单片机的数据存储空间,用来存储程序运行过程中产生的和需要的数据
29、,关电后数据丢失,读写速度非常快,理论上是可无限次写入的。SFR是特殊功能寄存器,单片机每个功能都会对应一个或多个SFR,我们就是通过对SFR的读写来实现单片机的多种多样的功能的。2 .单片机最小系统的三要素是?其中复位电路有几种?加以介绍。单片机最小系统的三要素就是电源、晶振、复位电路。单片机复位电路分为3种:上电复位、手动复位、程序自动复位。上电复位保证单片机每次都从一个固定的相同的状态开始工作;复位按键让程序重新初始化重新运行,这个过程就叫做手动复位;当程序死机或者跑飞的时候,我们的单片机往往有一套自动复位机制,比如看门狗,如果程序长时间失去响应,单片机看门狗模块会自动复位重启。3 .C
30、19和C10分别起什么作用?C19的作用:缓冲作用。当上电的瞬间,电流从电源处流下来的时候,不稳定,容易冲击电子器件,加个电容可以起到缓冲作用。,稳定作用。我们的一整套电路,后级电子器件的功率大小都不一样,而器件正常工作的时候,所需电流的大小也不是一成不变的。电流猛的增大,电路中的电压(水位)就会直接突然下降,电容会在这个时候把存储在里边的电量释放一下,稳定电压。C10的作用:电容C10,它容值较小,用来滤除高频信号干扰的。4 .如何选取R17,使三极管处于饱和状态三极管都有一个放大倍数0,要想处于饱和状态,b极电流就必须大于e和c之间电流值除以0。这个0,对于常用的三极管大概可以认为是100
31、oe和c之间的电流是3mA,那么b极电流最小就是3mA除以100等于30uA,大概有4.3V电压会落在基极电阻上,那么基极电阻最大值就是4.3V/30uA=143K。电阻值只要比这个值小就可以。5 .在使用定时器的时候,需要哪几个步骤?第一步:设置特殊功能寄存器TMOD配置好工作模式。第二步:设置计数寄存器TH0和TL0的初值。第三步:设置TCON通过TR0置1来让定时器开始计数。第四步:判断TCON寄存器的TF0位,监测定时器溢出情况6 .会计算重载值:(方法,非实际作答时的答案)写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是11.0592M,时钟周期就是1/11059200,机器周期是12/11059200,假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,我们来算一下x*12/11059200=0.02,得到x=18432。16位定时器的溢出值是65536(因65535再加1才是溢出),
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB15-T 1152-2025 黄瓜集约化育苗技术规程
- 还款标准合同
- 基本功大赛现场做课件
- 初三化学健康化学试卷及答案
- 中国钢铁行业并购重组的路径探索与绩效提升-以WG集团公司为例
- WTO框架下中国农产品贸易:现状、挑战与突破路径
- 初二语文文言文阅读专项试卷及答案
- 基层消防知识培训课件活动
- 汽车工程学:汽车纵向动力学 中英文翻译、外文文献翻译、外文翻译
- 培训课件温馨提醒语录简短
- 大数据与人工智能在冶金产业的应用-洞察阐释
- 银行2025反洗钱培训
- 缺血性心脏病护理查房
- 新工科背景下生物工程专业的核心课程体系建设:多模态教学与多维度评价
- 体育场看台座椅施工方案
- 老年人消毒护理与急救技术
- 2025 年艺术新课程标准试题与答案(2022 版)
- 数据中心列头柜基础知识
- 数据中心项目实施计划与时间安排
- 警务应急处突
- 超级动漫IP奶龙-品牌手册
评论
0/150
提交评论