单片机实训,点阵,矩阵键盘,电子时钟,LED灯_第1页
单片机实训,点阵,矩阵键盘,电子时钟,LED灯_第2页
单片机实训,点阵,矩阵键盘,电子时钟,LED灯_第3页
单片机实训,点阵,矩阵键盘,电子时钟,LED灯_第4页
单片机实训,点阵,矩阵键盘,电子时钟,LED灯_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、 微型计算机及控制技术实训 班级: 1220331 姓名: 李帅 学号: 44 实验一:LED流水灯设计1、 设计目的1. 通过此次涉及、熟悉并掌握实验系统原理和方法2. 掌握流水灯原理和使用方法2、 设计过程(1) 设计内容1. 了解LED发光二极管的顺序灭2. 了解LED的使用原理和引脚接法3. 掌握实用Keil环境编程4. 掌握下载Keil编译好的称序列AT89C51单片机中(2) 实验步骤1. 掌握AT89C51单片机与外设LED的引脚接法和使用原理2. 使用Keil编译环境,编写LED发光二极管顺序灭的程序3. 在Keil编译好的程序下载到AT89c51单片机中,实现LED发光二极管

2、顺序灭(3) 电路及程序设计1. 电路设计2. 编程如下org 0sjmp startorg 30hstart:mov P1,#1;P1.0为1,不亮mov P1,#2;P1.1为1,不亮mov P1,#4;以下原理同上mov P1,#8mov P1,#10hmov P1,#20hmov P1,#40hmov P1,#80hsjmp startdelay:nopnopnopnopretend(4) 设计结果如上图:D7亮了。如上图:D3亮了。实验二8*8点阵的设计一、实验目的:1. 了解点阵式LED显示原理。2.掌握单片机与8×8点阵块之间接口电路设计及编程。3.掌握8155工作原理

3、及与单片机的接口电路设计。二、实验要求:利用8×8点阵显示屏,自己设计并调试电路板,实现在单片机的控制下,点阵显示屏显示数字。3、 实验步骤: 1、实验电路图 2、编码程序: #include<reg52.h>#include <intrins.h> #define uchar unsigned char#define uint unsigned intuchar i=0,n,k;uchar code Table8=0x00,0x00,0x3C,0x42,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,0x22,0x7E,0x02,0x0

4、0,0x00,0x00,0x00,0x22,0x46,0x4A,0x32,0x00,0x00,0x00,0x00,0x22,0x49,0x49,0x36,0x00,0x00,0x00,0x00,0x18,0x28,0x7E,0x08,0x00,0x00,0x00,0x00,0x7A,0x29,0x29,0x2E,0x00,0x00,0x00,0x00,0x3E,0x49,0x49,0x26,0x00,0x00,0x00,0x00,0x40,0x4F,0x50,0x60,0x00,0x00,0x00,0x00,0x36,0x49,0x49,0x36,0x00,0x00,0x00,0x00,0x3

5、2,0x49,0x49,0x3E,0x00,0x00,0x91,0x52,0x00,0xA4,0xF5,0xBF,0xF4,0xA4, 0x11,0x13,0x55,0x51,0x55,0x12,0x11,0x00, ;uchar code Tab=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; void delay(uint i); void main()TMOD=0x00;TH0=(8192-3000)/32;TL0=(8192-3000)%32;TR0=1;EA=1;ET0=1;while(1)n=4; void T0_ISP(void) interru

6、pt 1 TH0=(8192-3000)/32; TL0=(8192-3000)%32;P3 =Tabk+;if(k=8)k=0;P0 = Tableni; if(+i = 8) i = 0;void delay(uint i)while(i-); 3、实验结果:实验三:矩阵键盘的设计一、实验目的:1、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。2、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。3、复习利用Keil51软件对程序进行编译。4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。 二、实验要求  通过实训,学生应达到以下几方面的要

7、求: (1)素质要求 1.以积极认真的态度对待本次实训,遵章守纪、团结协作。 2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立工作能力。   (2)能力要求 1.模拟电路的理论知识 2.脉冲与数字电路的理念知识 3.通过模拟、数字电路实验有一定的动手能力 4.能熟练的编写8951单片机汇编程序 5.能够熟练的运用仿真软件进行仿真三、实训基本步骤      1、用Proteus绘制“矩阵键盘扫描”电路原理图。 2、编写程序使数码管显示当前闭

8、合按键的键值。(代码)#include<reg51.h>#define uchar unsigned char#define uint unsigned int ucharcodedis= 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E;uchar code tab=0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee;void delay(uint x) uchar

9、i;while(x-)for(i=0;i<120;i+); uchar scan() uchar a,b,c,i;P2=0XF0; delay(10);P2=0X0F; for(i=0;i<16;i+)if(c=tabi)return i; void main()ucharkey;while(1)key=scan();if(key!=-1) P0=diskey;delay(100); 3、 利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状态和按键开关的对应关系。(实验结束)如上图:当K7被按下时,数码管上显示出数字7了。实验四:电子时钟设计一、设计目的通过此次设

10、计,熟悉并掌握实验系统的原理和方法。掌握电子时钟的原理和使用方法。二、设计要求1、设计一个电子时钟,并且能够实现分秒实现的和调节。2、设计出硬件电路、3、设计出软件编程方法,并写出程序。4、用汇编语言实现程序设计5、利用查表,中断等方式实现目的三、电路程序设计1、电路设计2、 编码程序#include <REG51.H>#include <intrins.h>/#include "LCD1602.h"/#include "DS1302.h"#define uint unsigned int#define uchar unsigne

11、d charsbit DS1302_CLK = P17; /实时时钟时钟线引脚 sbit DS1302_IO = P16; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位线引脚sbit ACC0 = ACC0;sbit ACC7 = ACC7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit Set = P20; /模式切换键sbit Up = P21; /加法按钮sbit Down = P22; /减法按钮sbit

12、out = P23; /立刻跳出调整模式按钮char done,count,temp,flag,up_flag,down_flag;uchar TempBuffer5,week_value2;void show_time(); /液晶显示程序/*1602液晶显示部分子程序*/Port Definitions*sbit LcdRs= P25;sbit LcdRw= P26;sbit LcdEn = P27;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs

13、=0;LcdRw=1;_nop_();LcdEn=1;_nop_();LcdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序Lcd

14、En=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关 #define LCD_CURSOR0x02 /显示光标#define LCD_NO_CURSOR0x00 /无光标 #define LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|Displ

15、ayMode);/设置输入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Writ

16、e(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/液晶字符输入的位置*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);/将

17、字符输出到液晶显示void Print(unsigned char *str)while(*str!='0')LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟部分子程序*/typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString11

18、;unsigned char TimeString9;SYSTEMTIME;/定义的时间类型SYSTEMTIME CurrentTime;#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80 /时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void

19、 DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i;ACC = d; for(i=8; i>0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i>0; i-) ACC = ACC >>1; /相当于汇

20、编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1;DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST

21、 = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /

22、获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR)

23、;Time->Hour = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Re

24、ad1302(DS1302_MONTH);Time->Month = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString if(hide_year<2) /这里的i

25、f,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22 Time->DateString0 = '2' Time->DateString1 = '0' Time->DateString2 = Time->Year/10 + '0' Time->DateString3 = Time->Year%10 + '0' else Time->DateString0 = ' ' Time->DateString1 = '

26、 ' Time->DateString2 = ' ' Time->DateString3 = ' 'Time->DateString4 = '/'if(hide_month<2)Time->DateString5 = Time->Month/10 + '0' Time->DateString6 = Time->Month%10 + '0' else Time->DateString5 = ' ' Time->DateString6

27、= ' 'Time->DateString7 = '/'if(hide_day<2)Time->DateString8 = Time->Day/10 + '0' Time->DateString9 = Time->Day%10 + '0' elseTime->DateString8 = ' 'Time->DateString9 = ' ' if(hide_week<2) week_value0 = Time->Week%10 + '

28、0' /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ' ' week_value1 = '0'Time->DateString10 = '0' /字符串末尾加 '0' ,判断结束字符void TimeToStr(SYSTEMTIME *Time) /将时,分,秒数据转换成液晶显示字符放到数组 TimeString; if(hide_hour<2) Time->TimeString0 = Time->Hour/1

29、0 + '0' Time->TimeString1 = Time->Hour%10 + '0' else Time->TimeString0 = ' 'Time->TimeString1 = ' 'Time->TimeString2 = ':'if(hide_min<2) Time->TimeString3 = Time->Minute/10 + '0' Time->TimeString4 = Time->Minute%10 + '

30、0' else Time->TimeString3 = ' 'Time->TimeString4 = ' ' Time->TimeString5 = ':' if(hide_sec<2) Time->TimeString6 = Time->Second/10 + '0' Time->TimeString7 = Time->Second%10 + '0' elseTime->TimeString6 = ' 'Time->TimeStr

31、ing7 = ' ' Time->DateString8 = '0'void Initial_DS1302(void) /时钟芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) /判断时钟芯片是否关闭 Write1302(0x8e,0x00); /写入允许Write1302(0x8c,0x07); /以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55Write1302(0x88,0x07);Write1302(0x86,0x25);Wr

32、ite1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); /禁止写入void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;i<count;i+)for(j=0;j<120;j+);/*延时子程序*/void mdelay(uint delay)uint i;for(;delay>0;delay-)for(i=0;i<62;i+) /1ms延时.;void out

33、key() /跳出调整模式,返回默认显示 uchar Second;if(out=0) mdelay(8); count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND); Write1302(0x8e,0x00); /写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); /禁止写入done=0; while(out=0); /void Upkey()/升

34、序按键 Up=1;if(Up=0) mdelay(8);switch(count)case 1: temp=Read1302(DS1302_SECOND); /读取秒数 temp=temp+1; /秒数加1 up_flag=1; /数据调整后更新标志 if(temp&0x7f)>0x59) /超过59秒,清零 temp=0; break; case 2:temp=Read1302(DS1302_MINUTE); /读取分数 temp=temp+1; /分数加1up_flag=1;if(temp>0x59) /超过59分,清零temp=0;break;case 3: temp

35、=Read1302(DS1302_HOUR); /读取小时数temp=temp+1; /小时数加1up_flag=1;if(temp>0x23) /超过23小时,清零 temp=0; break; case 4: temp=Read1302(DS1302_WEEK); /读取星期数 temp=temp+1; /星期数加1 up_flag=1; if(temp>0x7) temp=1; break; case 5: temp=Read1302(DS1302_DAY); /读取日数 temp=temp+1; /日数加1 up_flag=1; if(temp>0x31) temp=

36、1; break; case 6: temp=Read1302(DS1302_MONTH); /读取月数 temp=temp+1; /月数加1 up_flag=1; if(temp>0x12) temp=1; break; case 7: temp=Read1302(DS1302_YEAR); /读取年数 temp=temp+1; /年数加1 up_flag=1; if(temp>0x85) temp=0; break; default:break;while(Up=0); /void Downkey()/降序按键 Down=1;if(Down=0) mdelay(8); swit

37、ch(count) case 1: temp=Read1302(DS1302_SECOND); /读取秒数 temp=temp-1; /秒数减1 down_flag=1; /数据调整后更新标志 if(temp=0x7f) /小于0秒,返回59秒 temp=0x59; break; case 2: temp=Read1302(DS1302_MINUTE); /读取分数 temp=temp-1; /分数减1 down_flag=1; if(temp=-1) temp=0x59; /小于0秒,返回59秒 break; case 3: temp=Read1302(DS1302_HOUR); /读取小时

38、数 temp=temp-1; /小时数减1 down_flag=1; if(temp=-1) temp=0x23; break; case 4: temp=Read1302(DS1302_WEEK); /读取星期数 temp=temp-1; /星期数减1 down_flag=1; if(temp=0) temp=0x7; break; case 5: temp=Read1302(DS1302_DAY); /读取日数 temp=temp-1; /日数减1 down_flag=1; if(temp=0) temp=31; break; case 6: temp=Read1302(DS1302_MO

39、NTH); /读取月数 temp=temp-1; /月数减1 down_flag=1; if(temp=0) temp=12; break; case 7: temp=Read1302(DS1302_YEAR); /读取年数 temp=temp-1; /年数减1 down_flag=1; if(temp=-1) temp=0x85; break; default:break;while(Down=0); void Setkey()/模式选择按键Set=1;if(Set=0) mdelay(8); count=count+1; /Setkey按一次,count就加1 done=1; /进入调整模

40、式 while(Set=0); void keydone()/按键功能执行 uchar Second; if(flag=0) /关闭时钟,停止计时 Write1302(0x8e,0x00); /写入允许 temp=Read1302(0x80); Write1302(0x80,temp|0x80); Write1302(0x8e,0x80); /禁止写入 flag=1; Setkey(); /扫描模式切换按键 switch(count) case 1:do /count=1,调整秒 outkey(); /扫描跳出按钮 Upkey(); /扫描加按钮 Downkey(); /扫描减按钮 if(up

41、_flag=1|down_flag=1) /数据更新,重新写入新的数据 Write1302(0x8e,0x00); /写入允许 Write1302(0x80,temp|0x80); /写入新的秒数 Write1302(0x8e,0x80); /禁止写入 up_flag=0; down_flag=0; hide_sec+; /位闪计数 if(hide_sec>3) hide_sec=0; show_time(); /液晶显示数据 while(count=2);break; case 2:do /count=2,调整分 hide_sec=0; outkey(); Upkey(); Downk

42、ey(); if(temp>0x60) temp=0; if(up_flag=1|down_flag=1) Write1302(0x8e,0x00); /写入允许 Write1302(0x82,temp); /写入新的分数 Write1302(0x8e,0x80); /禁止写入 up_flag=0; down_flag=0; hide_min+; if(hide_min>3) hide_min=0; show_time(); while(count=3);break; case 3:do /count=3,调整小时 hide_min=0; outkey(); Upkey(); Do

43、wnkey(); if(up_flag=1|down_flag=1) Write1302(0x8e,0x00); /写入允许 Write1302(0x84,temp); /写入新的小时数 Write1302(0x8e,0x80); /禁止写入 up_flag=0; down_flag=0; hide_hour+; if(hide_hour>3) hide_hour=0; show_time(); while(count=4);break; case 4:do /count=4,调整星期 hide_hour=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0x8e,0x00); /写入允许 Write1302(0x8a,temp); /写入新的星期数 Write1302(0x8e,0x80); /禁止写入 up_flag=0; down_flag=0; hide_week+; if(hide_week>3) hide_week=0; show_time(); while(count=5);break; case 5:do /count=5,调整日 hide_week=0; outkey(); Upkey(); Downkey(); if(up_flag=

温馨提示

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

评论

0/150

提交评论