嘉应学院单片机考试程序.doc_第1页
嘉应学院单片机考试程序.doc_第2页
嘉应学院单片机考试程序.doc_第3页
嘉应学院单片机考试程序.doc_第4页
嘉应学院单片机考试程序.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章实例1:独立按键识别#includevoid main() char key = 0; P2=0; while(1) key = P0 & 0x0f; /读取按键状态,高4位清零 if (key != 0) P2 = key; /有按键动作时,P0状态值送P2 实例2:键控流水灯#includeunsigned char led =0x01,0x02,0x04,0x08;void delay(unsigned char time)unsigned char j=225;for(;time0;time- -)for(;j0;j- -);void main()bit dir=0,run=0;unsigned char i;while(1)switch (P0 & 0x0f)case 0x0e:run=1;break;case 0x0d:run=0,dir=1;break;case 0x0b:dir=1;break;case 0x07:dir=0;break;if(run)if(dir)for(i=0.i=0;i- -)P2=ledi;delay(200);else P2=0;实例4:LED数码管显示#includechar led_mod=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;void delay(unsigned int time)unsigned int j=0;for(;time0;time- -)for(j=0;j125;j+);void main(void)char i=0;while(1)for(i=0;i=9;i+);delay(500);实例5:#includesbit P3_7=P37;unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char count;void delay(unsigned int time)unsigned int j=0;for(;time0;time-) for(j=0;j125;j+);void main(void) count=0;P0=tablecount/10;P2=tablecount%10;while(1) if(P3_7=0)delay(10);if(P3_7=0)count+;if(count=100) count=0; P0=tablecount/10; P2=tablecount%10; while(P3_7=0);实例7:行列式键盘编程 #include char led_mod = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71 ;char key_buf = 0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77;void getKey(void)char key_scan=0xef,0xdf,0xbf,0x7f;char i=0,j=0;for(i=0;i4;i+)P3= key_scani;if(P3!=0xff) for(j=0;j16;j+)if(key_bufj=P3) return j;return=-1; void main(void)char key=0; P2=0x00;while(1) key=getKey(); if(key!=-1)P2=led_modkey; 第五章实例1 单片机开关状态检测在单片机的INT0端口接一开关,P1.0口接一发光二极管。每次开关闭合(接地)时,发光二极管改变一次状态。程序如下#includesbit P1_0=P10;int0_srv()interrupt 0P1_0=!P1_0;void main()IT0=1;EX0=1;EA=1;while(1);实例2 中断扫描法行列式键盘#include char led_mod = 0x3f,0x06,0x5b,;char key_buf = 0x11, ;void getKey() interrupt 0char key_scan=0xef,0xdf,0xbf,0x7f;char i=0,j=0;for(i=0;i4;i+)P1= key_scani;for(j=0;j16;j+)if(key_bufj=P1)P2=led_modj;break;void main(void)P2=0x00;IT0=1;EX0=1;EA=1;while(1)P1=0x0f;实例3:中断方式的键控流水灯#includechar led =0x01,0x02,0x04,0x08;bit dir=0,run=0;void delay(unsigned char time);key() interrupt 0switch (P0 & 0x0f)case 0x0e:run=1;break;case 0x0d:run=0,dir=1;break;case 0x0b:dir=1;break;case 0x07:dir=0;break;void main()char i;IT=1;EX0=1;EA=1;while(1)if(run)if(dir)for(i=0.i=0;i- -)P2=ledi;delay(200);else P2=0;void delay(unsigned char time)unsigned int j=0;for(;time0;time- -)for(j=0;j125;j+);实例4:根据电路图编程验证两级外部中断嵌套效果#includechar led_mod=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;sbit D1=P30;void delay(unsigned int time)unsigned char j=0;for(j=255;time0;time- -)for(;j0;j- -);key0() interrupt 0unsigned char i;D1=IE0;for(i=0.i=9;i+)P2=led_modi;delay(35000);P2=0x40;Key1() interrupt 2unsigned char i;D1=IE0;for(i=0.i=9;i+)P1=led_modi;delay(35000);P2=0x40;void main () unsigned char i;TCON=0x05;PX0=0;PX1=1;D1=0;P1=P2=0x40;IE=0x85;while(1)for(i=0.i=9;i+)P2=led_modi;delay(35000);第六章实例1:单片机晶振频率12MHz,应用定时器/计数器0方式1产生1ms 的定时,并使P1.0输出周期为2ms的方波。(此题可分为用中断方式和查询方式)。查询方式#include sbit P1_0 = P10;main () TMOD = 0x01; /设置T0定时方式1(0000 0001B) TR0=1; /启动T0 for(;) TH0 = -(1000/256); /装载计数初值 TL0 = -(1000%256); do while(!TF0); /查询等待TF0复位 P1_0 =!P1_0; /定时时间到P1.0反相 TF0 = 0; /TF0标志清0(b)中断方式#include sbit P1_0=P10;void timer0 (void) interrupt 1 using 1 P1_0 = !P1_0; /P1.0取反 TH0 = -(1000/256); /装载计数初值 TL0 = -(1000%256);void main (void) TMOD = 0x01; /T0定时方式1 P1_0-0; TH0 = -(1000/256);/装载计数初值 TL0 = -(1000%256); EA=1; /开总中断 ET0=1; /开T0中断 TR0=1; /启动T0do while(1);实例3:设计一个波形展宽程序。设由P3.4输入一个低频窄脉冲信号。当P3.4波形发生负跳变时,由P3.0口输出一个500s宽的同步脉冲(设系统频率为6MHz)。:#include sbit P3_0=P30;void main () TMOD = 0x06; /设置为T0计数方式2 TL0 = 255;/初值0xff可使1个外来脉冲即产生溢出 TR0 = 1;/启动计数器 while (1) while (!TF0);/等待首次溢出 TF0 = 0;/清TF0溢出标志 TMOD = 0x02; /设置为T0定时方式2 TH0 = -250;/6MHz频率500ms定时初值 TL0 = -250; P3_0 = 0; while (!TF0);/等待再次溢出 TF0 = 0;/清TF0溢出标志 P3_0 = 1; TMOD = 0x06;/设置为T0计数方式2 TL0 = 255;/重新置初值 实例4 采用10MHz晶振,在P1.0脚上输出周期为2.5s,占空比为20%的脉冲信号。该题电路图与实例1相同。10毫秒10MHz的计数初值为:a = - tfosc/12 = -1000010/12=-8333 #include #defineucharunsignedchar uchar time; uchar period=250; uchar high=50;timer0 (void) interrupt 1 using 1 TH0= -8333/256; /重载计数初值 TL0= -8333%256; if (+time= =high) P1=0; /高电平时间到变低 else if (time= =period) /周期时间到变高 time=0; P1=1;main ( ) TMOD=0x01; /T0方式1 TH0= -8333/256; /计数初值 TL0= -8333%256; EA=1; ET0=1; TR0=1; do while (1);实例5:采用定时中断方式,实现下图跑马灯控制功能。要求跑马灯的闪烁速率为每秒1次。#define uchar unsigned char /定义下一个方便后面使用#include /包括一个51标准内核的头文件bit ldelay-0; /长定时溢出标志Uchar t=0; /定时溢出次数void main(void) /主程序uchar code ledp8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /跑马灯工作状态uchar ledi; /用来指示显示顺序TOMD=0x01; /定义T0,方式1TH0=0x3c; /T0初值,溢出20次为1s(按12MHz晶振计算)TL0=0xb0;TR0=1; /启动定时器ET0=1; /打开定时器0中断EA=1; /打开总中断While(1) /主程序循环If(ldelay) /发现有时间溢出,进入处理ldelay=0; /清除标志P2=ledpledi; /读出一个值送到P2口Ledi+; /指向下一个If(ledi=8)ledi=0; /到了最后一个灯就换到第一个/定时器0中断函数timer0 () interrupt 1t+;if(t=20)t=0;ldelay=1; /每次溢出一个标志,以便主程序处理TH0=0x3c; /重置T0初值TL0=0xb0;实例6 通过T0对虚拟脉冲信号发生器的脉冲进行计数,并在共阳型LED数码管上动态显示出来。解: 程序如下。#include #define uchar unsigned char#define uint unsigned int uchar BitTab=0x20,0x10,0x08,0x04,0x02,0x01 ;/LED位驱动码uchar DispTab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF;/LED字形码uchar DispBuf6; /显示缓冲区/-定时器0中断处理程序-void Timer1(void) interrupt 3 uchar tmp; uchar Count; /计数器,显示程序通过它得知现正显示哪个数码管 TH1=(65536-3000)/256; TL1=(65536-3000)%256; /重置初值 tmp=BitTabCount; /取位值 P2=P2|0xfc; /P2与11111100B相或 P2=P2&tmp; /P2与取出的位值相与 tmp=DispBufCount;/取出待显示的数 tmp=DispTabtmp;/取字形码 P0=tmp; Count+; if(Count=6) Count=0; void main () uint tmp; P1=0xf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论