单片机最终完整版

合集下载

单片机完整 ppt课件

单片机完整 ppt课件

1
5
Intel MCS-52 子系列
8032 8052 80C32 80C52
8752
87C52
256 字节
(8K字节) (8K字节)
3x16
4x8位
1
6
ATEML
1051(1K)/ 2051(2K)/ 4051(4K) (20条引脚DIP封装)
128
2
15
1
5
89C系列
(常用型)
89C51(4K)/ 89C52(8K) (40条引脚DIP封装)
S1 S2 S3 S4 S5 S6
P1
P2
ALE
读操作码
空读
1.程序计数器PC(Program Counter) 一个16位的公用存放器,用来存放下一
条指令的地址。它具有自动加1的功能。 特点:
▼它是16位的按机器周期自动加1计数器 ▼总指向下一条指令所在首地址(当前PC值)
▼一切分支/跳转/调用/中断/复位 等操作 的本质就是:改动 PC 值
2.指令存放器 一个8位的存放器,用于暂存待执行的
有内部和外部两种时钟产生方式。 单片机的消费工艺不同,接法也不同。
在XTALl和XTAL2两端接晶体或 陶瓷谐振器,与内部反向器构成稳 定的自激振荡器。
参数选取:C1、C2起稳定振荡 频率,快速起振的作用。
外接晶振时:Cl和C2选择10~30pF 外接陶瓷谐振器时: Cl和C2的典型值约为 40±10pF。 振荡频率范围普通是1.2MHz~12MHz,有的 可达40MHz。
分别占据83H和82H两个地址。
5. 定时控制部件与时序
功能:在规定的时辰发出各种操作所需的全部 内部和外部的控制信号,协调各功能元件任务, 完成指令所规定的功能。

单片机完整课件

单片机完整课件

调试与测试
01
02
03
04
硬件调试
通过调试器对硬件电路进行调 试,检查电路板是否正常工作

软件调试
通过调试器对软件程序进行调 试,检查程序是否符合设计要
求。
系统测试
将软硬件结合起来进行系统测 试,测试系统的各项功能是否
正常。
优化与改进
根据调试和测试结果,对软硬 件进行优化和改进,提高系统
性能和稳定性。
05
单片机实际应用案例
智能家居控制系统
智能家居控制系统是利用单片机 技术实现对家居设备的智能化控 制,从而提高生活便利性和舒适
度。
智能家居控制系统可以实现的功 能包括:远程控制家电、语音控
制、定时控制、能耗监测等。
单片机在智能家居控制系统中主 要负责数据处理、通信和控制逻 辑的实现,是整个系统的核心部
详细描述
在智能仪表领域,单片机可以用于实现各种智能仪表 的控制和数据采集。在工业控制领域,单片机可以用 于实现各种工业控制系统的控制和数据采集。在智能 家居领域,单片机可以用于实现各种智能家居设备的 控制和数据采集。在汽车电子领域,单片机可以用于 实现汽车电子控制系统的控制和数据采集。在医疗电 子领域,单片机可以用于实现各种医疗设备的控制和 数据采集。
详细描述
单片机是一种微控制器,它通过集成电路技术将计算机的基本功能部件集成在 一块芯片上。由于其体积小、功耗低、可靠性高等特点,单片机被广泛应用于 各种领域,如智能仪表、工业控制、智能家居等。
单片机的发展历程
总结词
单片机的发展历程可以分为四个阶段,分别是探索阶段、发展阶段、成熟阶段和智能化 阶段。
02
单片机硬件结构
中央处理器

单片机红绿灯程序完整版

单片机红绿灯程序完整版

通灯设计交通灯设计方案:1:实现东西路----南北路红绿灯的交通指示。

2:东西路灯变化----红绿黄一南北路灯变化----绿黄红> T3:红灯延时时间---25S绿灯延时时间---20S黄灯延时时间一3S4:数码管显示:红灯---前20S不显示,只在最后5S开始倒计时显示。

绿灯---前15S不显示,只在最后5S开始倒计时显示。

黄灯---3S倒计时显示(若东西路为黄灯,南北路为红灯,那么南北绿的数码管也显示3S)。

5:交通应急事件处理:利用中断分别实现东西路---南北路的交通应急事件处理。

6:延时程序的使用:用循环延时和定时器计时的方法。

注:P1.0---北路绿灯,P1.1--北路黄灯,P1.2---北路红灯cP1.3--东路绿灯,P1.4---东路黄灯,P1.5----东路红灯。

【交通灯流程图】开始延时20秒5秒倒计时结束其他灯不变南北路绿灯亮,红,黄灯灭东西路红灯亮,绿,黄灯灭南北路绿灯数码管开始倒计时5秒南北路绿灯灭,黄灯亮且数码管开始倒计时3秒东西路红灯——数码管开始倒计时3秒3秒倒计时结束延时25秒5秒倒计时结束东西路绿灯亮,黄灯,红灯灭南北路红灯亮,黄灯,绿灯灭东西路数码管开始倒计时5秒其他灯不变东西路绿灯灭,黄灯亮且数码管开始倒计时3秒南北路红灯一一数码管开始倒计时3秒3秒倒计时结束程序如下:ORG 0000HLJMP LOOPORG 000BHLJMP WZDOORG 0013HLJMP WZD1ORG 0030HLOOP:MOV R3,#5MOV R4,#5MOV R2,#20l=LIfc=ER;定时器0中断,实现交通应急事件;下载可编辑亮 oMOV SP,#70H MOV IE,#85HMOV TMOD,#01H ;置T0为工作方式1MOV TH0,#3CH;置T0定时初值50msMOV TL0,#0B0HCLRTF0SETBTR0;启动定时器T0SETB P1.1 ;东---红灯亮,北---绿灯亮SETB P1.2CLR P1.0SETB P1.3SETB P1.4CLR P1.5ACALL DEL30SACALL Y ELLOW1 ; 北---绿灯转黄灯,东---红灯亮 ACALL DEL3S ;延时后北---黄灯火SETB P1.0;东:红灯火,绿灯亮,北:黄灯火,红灯CLR P1.2SETB P1.4SETB P1.5ACALL DEL55S ; 北---红灯不变,东---绿灯转黄灯ACALL Y ELLOW2ACALL DEL3SSJMP LOOPYELLOW1: ; 北---绿灯转黄灯,东---红灯不变SETB P1.0SETB P1.2CLR P1.1SETB P1.3CLR P1.5SETB P1.4RETYELLOW2: ; 东---绿灯转黄灯,北---红灯不变SETB P1.0SETB P1.1CLR P1.2SETB P1.3CLR P1.4RETWZD0: ;实现南北路交通应急事件CLR P1.0 ;(南北路保持畅通,东西路停止通行)SETB P1.1SETB P1.2SETB P1.3SETB P1.4CLR P1.5JNB P3.2,WZD0RETIWZD1: ;实现东西路交通应急事件CLR P1.3 ;(东西路保持畅通,南北路停止通行)CLR P1.2SETB P1.1SETB P1.0SETB P1.4SETB P1.5JNB P3.3,WZD1RETIDEL30S: J红绿灯延时DEL25S:JNB TF0QEL25S ;查询50ms到否CLR TFOMOV TH0,#3CH ;恢复T0定时初值50msMOV TL0,#0B0HDJNZ R2,DEL25S ;判断1s到否?未到继续状态MOV R2,#20 ;置50ms计数初值DJNZ R4,DEL25S ;状态1维持25s取数延时DEL5S:5MOV R2,#6DEL5:MOV A,R2ACALLST ;取数MOV P0,A ;实现数码管显示ACALL DEL1S ;每隔1S减1DJNZ R2,DEL5RETDEL3S:MOV R2,#4HDEL3:MOV A,R2ACALL ST ;取数MOV P2,AMOV P0,A ;数码管显示ACALL DEL1SDJNZ R2,DEL3RETDEL55S:ACALL DEL20SMOV R2,#6 ;倒计时5S DEL55:ACALL DEL1SMOV A,R2ACALLSTMOV P2,A ;数码管显示DJNZ R2QEL55RETDEL1S: ;1S 延时子程序MOV R5,#0BHST1:MOV R6,#0DAH下载可编辑ST2:MOV R7,#0CFHDJNZ R7,$DJNZ R6,ST2DJNZ R5,ST1RETDEL20S: ;20S延时子程序MOV R5,#0BH;#0DCHST3:MOV R6,#0DAHST4:MOV R7,#0CFHDJNZ R7,$DJNZ R6,ST4DJNZ R5,ST3RETST: ;取数MOV DPTR,#TABMOVC A,@A+DPTRRETTAB:DB 0FFH,0FFH,0F9H,0A4H,0B0H,99H,92HEnd.专业.整理.。

51单片机教学ppt精选全文完整版

51单片机教学ppt精选全文完整版
16位CPU、8K字节ROM、232字节RAM、5个8位并 口、1个
全双工串行口、2个16位定时/计数器。寻址范围64K。
片上还有8路10位ADC、1路PWM输出及高速I/O部件 等。
80C51系列单片机产品繁多,主流地位已经形成,近 年来推出的与80C51兼容的主要产品有:
﹡ATMEL公司融入Flash存储器技术的AT89系列; ﹡Philips公司的80C51、80C552系列; ﹡华邦公司的W78C51、W77C51高速低价系列; ﹡ADI公司的ADμC8xx高精度ADC系列; ﹡LG公司的GMS90/97低压高速系列; ﹡Maxim公司的DS89C420高速(50MIPS)系列; ﹡Cygnal公司的C8051F系列高速SOC单片机。 *ARM公司
EXIT: RET

1)编程扫描方式(查询方式) 2)定时扫描方式 3)中断方式

1)取得键值的方法 ◆扫描法 ◆线反转法
2)键值与键号的对应
3)通过程序得到键号 分析:

中断结构图





中断请求



中断响应
中断服务
中断返回 返
1.中断源及矢量地址 2.与中断控制相关的寄存器 3.中断处理过程 4.中断请求源的撤销 5.中断服务程序设计(汇编)
IE1
P1.3
25H
26H
例15:设累加器的各位ACC.0-ACC.7分别记为X0-X7 编程 实现以下逻辑表达式功能。
Y=X0 X1 X2+X0 X1 X2+X0 X1 X2 X3+X4 X5 X6 X7

例16:用程序实现c=a2+b2,设a、b均小于10。a存 放在

单片机毕业设计完整版

单片机毕业设计完整版

安徽工业大学继续学院《单片机原理》期末课程设计题目:单片机计时时钟设计与制作专业:电气工程及其自动化班级:14 电升姓名:夏云飞学号:1410102003035指导老师:贺容波成绩:( 2015.12 )目录一、绪论 (1)1.1单片机简介 (1)二、硬件系统设计方案 (3)2.1 时钟电路的设计 (3)2.2复位电路的设计 (4)2.3 数码显示电路的设计 (5)2.4按键电路的设计 (7)2.5 蜂鸣器电路的设计 (8)2.6接线图 (9)三、软件系统设计方案3.1 模块化设计方案 (10)3.2 主程序的设计 (11)3.3 LED动态显示程序的设计 (14)3.4 计时程序模块的设计 (17)3.5 键盘程序的设计 (19)3.6 蜂鸣器程序的设计 (22)3.7整个程序 (23)四、总结总结与致谢 (28)参考文献 (29)使用说明 (29)安徽工业大学继续教育学院《单片机原理》期末课程设计——单片机计时时钟设计与制作一绪论1.1单片机简介1.1.1单片机的产生计算机的发展经历了从电子管到大规模集成电路等几个发展阶段,随着大规模集成电路技术的发展,使计算机向性能稳定可靠、微型化、廉价方向发展,从而出现了单片微型计算机。

所谓单片微型计算机,是指将组成微型计算机的基本功能部件,如中央处理器CPU、存储器ROM和RAM、输入/输出(I/O)接口电路等集成在一块集成电路芯片上的微型计算机,简称单片机。

总体来讲,单片机可以用以下“表达式”来表示:单片机=CPU+ROM+RAM+I/O+功能部件1.1.2单片机的特点随着现代科技的发展,单片机的集成度越来越高,CPU的位数也越来越高,已能将所有主要部件都集成在一块芯片上,使其应用模式多、范围广,并具有以下特点:①体积小,功耗低,价格便宜,重量轻,易于产品化。

②控制功能强,运行速度快,能针对性地解决从简单到复杂的各类控制问题,满足工业控制要求,并有很强的位处理和接口逻辑操作等多种功能。

技师 单片机程序 最终版本V2

技师 单片机程序 最终版本V2

目录0 YuYin 录音专用lcd显示录音地址V1 ...........................................................................- 1 -1 DianZhiCheng led显示V1 ................................................................................................- 3 -2 DianZhiCheng lcd显示V1 ................................................................................................- 4 -3 DianZhiCheng lcd显示语音读重量值V1 .......................................................................-4 -4 ChaoShengBo led显示距离报警V1 ..............................................................................- 7 -5 ChaoShengBo lcd显示距离报警V1 ...............................................................................- 9 -6 ChaoShengBo lcd显示距离报警语音读距离V1 ...................................................... - 12 -7 MiMaSuo led显示V1 将密码写入24C02 ....................................................................- 17 -8 MiMaSuo led显示V1 .................................................................................................... - 18 -9 MiMaSuo lcd显示V1 .................................................................................................... - 22 -注:底层程序需要修改说明.............................................................................................- 26 -1 AT24C02底层程序...................................................................................................- 26 -2.4X4键盘底层程序...................................................................................................- 26 -0 YuYin 录音专用lcd显示录音地址V1#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit key0=P2^5; //录音按键sbit key1=P2^6; //放音按键sbit key2=P2^7; //音频地址+1按键uchar num; //修改音频地址累加uchar ress[2]; //显示的录音地址缓存//--------lcd显示函数声明---------------------------- 1 -void init_lcd(void);void ch_disp_any (unsigned char add, unsigned char num, unsigned char *chn);//--------语音模块函数声明---------------------------void powerup(void);void record(unsigned char address);void play_4004(unsigned char address);//-------------------------------------------void delay(uint ii){while(ii--);}main(){powerup();init_lcd();ch_disp_any(0x98,9,"音频地址:");ress[0]=0+0x30; //使地址初值显示00ress[1]=0+0x30; //液晶字符地址从0x30往后为阿拉伯数字0 1 2 3 ……while(1){if(key0==0){delay(1000);if(key0==0){while(!key0);record(num); //录音}}if(key1==0){delay(1000);if(key1==0){while(!key1);play_4004(num); //放音}- 2 -}if(key2==0){delay(3000);if(key2==0){while(!key2);num++; //音频地址+1if(num>=13)num=0;ress[1]=num%10+0x30; //提取个位数ress[0]=num/10+0x30; //提取十位数}}ch_disp_any(0x98,9,"音频地址:");ch_disp_any(0x9d,2,ress);}}1 DianZhiCheng l ed显示V1#include<reg52.h>#define uint unsigned int#define uchar unsigned char//--------AD模拟TLC549 函数声明---------------------------unsigned char TLC549(void);//--------led显示函数声明---------------------------void DISPLAY(unsigned int x);//-------------------------------------------void main(){while(1){uint i;i=TLC549(); //读取转换后的电压值i=i*500/255; //当TCL549的AD模拟电压采集输入端2脚AIN = REF+参考电压输入端时i=255//500为最大的砝码重量500gDISPLAY(i);}- 3 -}2 DianZhiCheng lcd显示V1#include<reg52.h>#define uint unsigned int#define uchar unsigned charuint i;uchar lcd_g[3]=0;//--------AD模拟TLC549 函数声明---------------------------unsigned char TLC549(void);//--------lcd显示函数声明---------------------------void init_lcd(void);void ch_disp_any (unsigned char add, unsigned char num, unsigned char *chn);//-------------------------------------------void main(){init_lcd();ch_disp_any(0x80,6,"电子称");ch_disp_any(0x88,12,"姓名: 某某某");ch_disp_any(0x98,13,"重量是: g");while(1){i=TLC549(); //读取转换后的电压值i=i*500/255; //当TCL549的AD模拟电压采集输入端2脚AIN = REF+参考电压输入端时i=255//500为最大的砝码重量500glcd_g[0]=i%1000/100+0x30; //提取百位数lcd_g[1]=i%100/10+0x30; //提取十位数lcd_g[2]=i%10+0x30; //提取个位数ch_disp_any(0x8c,3,lcd_g);}}3 DianZhiCheng lcd显示语音读重量值V1#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit key1=P2^7; //播放距离按键- 4 -uint i;uchar lcd_g[3]=0;uchar i1,i2,i3; //语音读数据的百十个位//--------AD模拟TLC549 函数声明---------------------------unsigned char TLC549(void);//--------LCD显示函数声明---------------------------void init_lcd(void);void ch_disp_any (unsigned char add, unsigned char num, unsigned char *chn);//--------语音---函数声明---------------------------------------void powerup(void);void record(unsigned char address); //语音录入函数本程序未使用因此有一个警告void play_4004(unsigned char address);//-------------------------------------------void delay(uint z) //语音播放连续字节发送指令延时{uint x ,y;for(x=z;x>0;x--)for(y=121;y>0;y--);}void main(){powerup(); //语音模块上电init_lcd();ch_disp_any(0x80,6,"电子称");ch_disp_any(0x88,12,"姓名: 某某某");ch_disp_any(0x98,13,"重量是: g");while(1){i=TLC549(); //读取转换后的电压值i=i*500/255; //当TCL549的AD模拟电压采集输入端2脚AIN = REF+参考电压输入端时i=255//500为最大的砝码重量500glcd_g[0]=i%1000/100+0x30; //提取百位数lcd_g[1]=i%100/10+0x30; //提取十位数lcd_g[2]=i%10+0x30; //提取个位数ch_disp_any(0x8c,3,lcd_g);if(key1==0){- 5 -i1=lcd_g[0]-0x30; //语音读取重量数据i2=lcd_g[1]-0x30;i3=lcd_g[2]-0x30;if(i1!=0&&i2!=0&&i3!=0) //百位十位个位都不为零读数方式{play_4004(i1);delay(50); //延时保证数据再次发送稳定play_4004(10);delay(50);play_4004(i2);delay(50);play_4004(11);delay(50);play_4004(i3);delay(50);play_4004(12);}if(i1==0&&i2!=0&&i3!=0) //百位为零十位个位都不为零读数方式{play_4004(i2);delay(50);play_4004(11);delay(50);play_4004(i3);delay(50);play_4004(12);}if(i1==0&&i2==0&&i3!=0) //百位为零十位为零个位不为零读数方式{play_4004(i3);delay(50);play_4004(12);}if(i1!=0&&i2==0&&i3!=0) //百位不为零十位为零个位不为零读数方式{play_4004(i1);delay(50);play_4004(10);- 6 -delay(50);play_4004(i2);delay(50);play_4004(0);delay(50);play_4004(i3);delay(50);play_4004(12);}}}}4 ChaoShengBo led显示距离报警V1#include<reg52.h>#include<math.h>#define uint unsigned int#define uchar unsigned charsbit send=P3^0; //超声波发送40kHz信号引脚sbit beep=P3^1; //蜂鸣器引脚定义//外部中断0固定为单片机P3.2引脚不需要定义为接收超声波反馈信息引脚bit flag=0; //位定义作为有中断时计算距离用标志flag=1时为有中断产生uint time_H=0,time_L=0; //缓存计数器的计数时间高8位底八位uchar count=0; //发送超声波脉冲计数uchar display_lcd[3]; //lcd显示距离缓存uint value; //最终计算的距离值//--------lde显示函数声明---------------------------void DISPLAY(unsigned int x);//-------------------------------------------void initTimer(void){TMOD=0x21; //T1为8位自动重装模式,T0为16位定时器TH0=0; //定时器T0初值用于计时超声波间断发送时间间隔TL0=0;TH1=0xf3; //定时器T1初值用于产生40kHz超声波发送探头所需信号TL1=0xf3;- 7 -}//--------------------------------------void timer0(void) interrupt 1 //T0中断,65ms中断一次即:重新发送超声波信号并且从0开始计时{TR1=1; //当定时器定时时间到时打开定时器1 发送超生波同时从0开始计时}//--------------------------------------void timer1(void) interrupt 3 //T1中断,发超声波用{send=~send; //超声波发送引脚count++; //超声波发送脉冲个数计数if(count>4) //计数个数到{count=0; //清零脉冲发送个数为下次发送准备TR1=0; //关闭定时器1 即关闭自身不在发送40kHz信号EX0=1; //打开外部中断等待超声波接收探头的响应信号}}//--------------------------------------void int0(void) interrupt 0 //接受中断{TR0=0; //关定时器T0 停止计时EX0=0; //关接受中断EA=0; //关闭总中断不在响应任何中断time_H=TH0; //读取定时器T0的计时时间即:超声波从发送到接受的响应信号的时间time_L=TL0;TR0=1; //本次超声波发送到接收时间读取完成开定时器T0开始计时开始下一个轮回EA=1; //打开总中断flag=1; //置计算距离表示有效}//----------------------------------------void main(){initTimer(); //定时器配置初始化TR0=1; //开启定时器T0- 8 -ET0=1; //允许定时器T0中断计时超声波发送到接收到回响信号时间//允许定时器T0中断未收到回响信号重复发送超声波信号间隔时间ET1=1; //允许定时器T1中断产生40kHz超声波发送信号EA=1; //允许总中断while(1){if(flag==1) //中断表示有效重新计算距离{time_H<<=8; //读取的定时器1 计时时间的高八位value=time_H+time_L; //第八位与高八位相加合成一个十六位电压值value=value*17/1000; //设S为测量距离,T为往返时间差,超声波的传播速度为V,则有: V = T/2 * S//value = ((value(单位是是us)* 0.000 001)s / 2) * 340m/s//value = ((value(单位是是us)* 0.000 001)s / 2) * (340 * 100)m/s//value = 【((value(单位是是us)* 0.001) / 2) * 34】cm 注:单位转换位cm//value = 【((value * (34 / 2)) * 1000 】cm 注:分子分母同时乘以1000 转换位整数计算flag=0; //本次距离计算处理完成清楚标志位}DISPLAY(value); //数码管显示距离if(value<10) //报警距离设定beep=0;elsebeep=1;}}5 ChaoShengBo lcd显示距离报警V1#include<reg52.h>#include<math.h>#define uint unsigned int#define uchar unsigned charsbit send=P3^0; //超声波发送40kHz信号引脚sbit beep=P3^1; //蜂鸣器引脚定义//外部中断0固定为单片机P3.2引脚不需要定义为接收超声波反馈信息引脚bit flag=0; //位定义作为有中断时计算距离用标志flag=1时为有中断产生- 9 -uint time_H=0,time_L=0; //缓存计数器的计数时间高8位底八位uchar count=0; //发送超声波脉冲计数uchar display_lcd[3]; //lcd显示距离缓存uint value; //最终计算的距离值//--------LCD显示函数声明---------------------------void init_lcd(void);void ch_disp_any (unsigned char add, unsigned char num, unsigned char *chn);//-------------------------------------------void delay_m(){int a,b;for(a=400;a>0;a--);for(b=400;b>0;b--);}void initTimer(void){TMOD=0x21; //T1为8位自动重装模式,T0为16位定时器TH0=0; //定时器T0初值用于计时超声波间断发送时间间隔TL0=0;TH1=0xf3; //定时器T1初值用于产生40kHz超声波发送探头所需信号TL1=0xf3;}//--------------------------------------void timer0(void) interrupt 1 //T0中断,65ms中断一次即:重新发送超声波信号并且从0开始计时{TR1=1; //当定时器定时时间到时打开定时器1 发送超生波同时从0开始计时}//--------------------------------------void timer1(void) interrupt 3 //T1中断,发超声波用{send=~send; //超声波发送引脚count++; //超声波发送脉冲个数计数if(count>4) //计数个数到{count=0; //清零脉冲发送个数为下次发送准备TR1=0; //关闭定时器1 即关闭自身不在发送40kHz信号EX0=1; //打开外部中断等待超声波接收探头的响应信号- 10 -}}//--------------------------------------void int0(void) interrupt 0 //接受中断{TR0=0; //关定时器T0 停止计时EX0=0; //关接受中断EA=0; //关闭总中断不在响应任何中断time_H=TH0; //读取定时器T0的计时时间即:超声波从发送到接受的响应信号的时间time_L=TL0;TR0=1; //本次超声波发送到接收时间读取完成开定时器T0开始计时开始下一个轮回EA=1; //打开总中断flag=1; //置计算距离表示有效}//----------------------------------------void main(){initTimer(); //定时器配置初始化TR0=1; //开启定时器T0ET0=1; //允许定时器T0中断计时超声波发送到接收到回响信号时间//允许定时器T0中断未收到回响信号重复发送超声波信号间隔时间ET1=1; //允许定时器T1中断产生40kHz超声波发送信号EA=1; //允许总中断init_lcd(); //初始化led显示ch_disp_any(0x81,12,"超声波测距仪"); //0x81为汉字在lcd上显示的起始位置(芯片资料的lcd手册中可以查到)//12为显示的字节数(一个汉字为2个字节)ch_disp_any(0x90,10,"姓名: 某某");ch_disp_any(0x88,12,"距离:cm");while(1){if(flag==1) //中断表示有效重新计算距离{- 11 -time_H<<=8; //读取的定时器1 计时时间的高八位value=time_H+time_L; //第八位与高八位相加合成一个十六位电压值value=value*17/1000; //设S为测量距离,T为往返时间差,超声波的传播速度为V,则有: V = T/2 * S//value = ((value(单位是是us)* 0.000 001)s / 2) * 340m/s//value = ((value(单位是是us)* 0.000 001)s / 2) * (340 * 100)m/s//value = 【((value(单位是是us)* 0.001) / 2) * 34】cm 注:单位转换位cm//value = 【((value * (34 / 2)) * 1000 】cm 注:分子分母同时乘以1000 转换位整数计算flag=0; //本次距离计算处理完成清楚标志位}delay_m(); //延时降低lcd的刷新频率display_lcd[2]=0x30+value%10; //提取个位数display_lcd[1]=0x30+value%100/10; //提取十位数display_lcd[0]=0x30+value%1000/100; //提取百位数ch_disp_any(0x8B,3,display_lcd); //更新显示if(value<10) //报警距离设定beep=0;elsebeep=1;}}6 ChaoShengBo lcd显示距离报警语音读距离V1#include<reg52.h>#include<math.h>#define uint unsigned int#define uchar unsigned charsbit key1=P2^7; //播放距离按键sbit send=P3^0; //超声波发送40kHz信号引脚sbit beep=P3^1; //蜂鸣器引脚定义//外部中断0固定为单片机P3.2引脚不需要定义为接收超声波反馈信息引脚bit flag=0; //位定义作为有中断时计算距离用标志flag=1时为有中断产生uint time_H=0,time_L=0; //缓存计数器的计数时间高8位底八位uchar count=0; //发送超声波脉冲计数uchar display_lcd[3]; //lcd显示距离缓存- 12 -uchar value; //最终计算的距离值uchar i1,i2,i3; //语音读数据的百十个位//--------LCD显示函数声明---------------------------void init_lcd(void);void ch_disp_any (unsigned char add, unsigned char num, unsigned char *chn);//--------语音---函数声明---------------------------------------void powerup(void);void record(unsigned char address); //语音录入函数本程序未使用因此有一个警告void play_4004(unsigned char address);//-------------------------------------------void delay_m() //lcd刷新显示延时{int a,b;for(a=400;a>0;a--);for(b=400;b>0;b--);}void delay(uint z) //语音播放连续字节发送指令延时{uint x ,y;for(x=z;x>0;x--)for(y=121;y>0;y--);}void initTimer(void){TMOD=0x21; //T1为8位自动重装模式,T0为16位定时器TH0=0; //定时器T0初值用于计时超声波间断发送时间间隔TL0=0;TH1=0xf3; //定时器T1初值用于产生40kHz超声波发送探头所需信号TL1=0xf3;}//--------------------------------------void timer0(void) interrupt 1 //T0中断,65ms中断一次即:重新发送超声波信号并且从0开始计时{TR1=1; //当定时器定时时间到时打开定时器1 发送超生波同时从0开始计时}//--------------------------------------void timer1(void) interrupt 3 //T1中断,发超声波用{- 13 -send=~send; //超声波发送引脚count++; //超声波发送脉冲个数计数if(count>4) //计数个数到{count=0; //清零脉冲发送个数为下次发送准备TR1=0; //关闭定时器1 即关闭自身不在发送40kHz信号EX0=1; //打开外部中断等待超声波接收探头的响应信号}}//--------------------------------------void int0(void) interrupt 0 //接受中断{TR0=0; //关定时器T0 停止计时EX0=0; //关接受中断EA=0; //关闭总中断不在响应任何中断time_H=TH0; //读取定时器T0的计时时间即:超声波从发送到接受的响应信号的时间time_L=TL0;TR0=1; //本次超声波发送到接收时间读取完成开定时器T0开始计时开始下一个轮回EA=1; //打开总中断flag=1; //置计算距离表示有效}//----------------------------------------void main(){powerup(); //语音模块上电initTimer(); //定时器配置初始化TR0=1; //开启定时器T0ET0=1; //允许定时器T0中断计时超声波发送到接收到回响信号时间//允许定时器T0中断未收到回响信号重复发送超声波信号间隔时间ET1=1; //允许定时器T1中断产生40kHz超声波发送信号EA=1; //允许总中断init_lcd(); //初始化led显示ch_disp_any(0x81,12,"超声波测距仪"); //0x81为汉字在lcd上显示的起始位置(芯片资料的lcd手册中可以查到)- 14 -//12为显示的字节数(一个汉字为2个字节)ch_disp_any(0x90,10,"姓名: 某某");ch_disp_any(0x88,12,"距离:cm");while(1){if(flag==1) //中断表示有效重新计算距离{time_H<<=8; //读取的定时器1 计时时间的高八位value=time_H+time_L; //第八位与高八位相加合成一个十六位电压值value=value*17/1000; //设S为测量距离,T为往返时间差,超声波的传播速度为V,则有: V = T/2 * S//value = ((value(单位是是us)* 0.000 001)s / 2) * 340m/s//value = ((value(单位是是us)* 0.000 001)s / 2) * (340 * 100)m/s//value = 【((value(单位是是us)* 0.001) / 2) * 34】cm 注:单位转换位cm//value = 【((value * (34 / 2)) * 1000 】cm 注:分子分母同时乘以1000 转换位整数计算flag=0; //本次距离计算处理完成清楚标志位}delay_m(); //延时降低lcd的刷新频率display_lcd[2]=0x30+value%10; //提取个位数display_lcd[1]=0x30+value%100/10; //提取十位数display_lcd[0]=0x30+value%1000/100; //提取百位数ch_disp_any(0x8B,3,display_lcd); //更新显示if(value<10) //报警距离设定beep=0;elsebeep=1;if(key1==0){i1=display_lcd[0]-0x30; //语音读取距离数据i2=display_lcd[1]-0x30;i3=display_lcd[2]-0x30;if(i1!=0&&i2!=0&&i3!=0) //百位十位个位都不为零读数方式{play_4004(i1);delay(50); //延时保证数据再次发送稳定- 15 -play_4004(10);delay(50);play_4004(i2);delay(50);play_4004(11);delay(50);play_4004(i3);delay(50);play_4004(12);}if(i1==0&&i2!=0&&i3!=0) //百位为零十位个位都不为零读数方式{play_4004(i2);delay(50);play_4004(11);delay(50);play_4004(i3);delay(50);play_4004(12);}if(i1==0&&i2==0&&i3!=0) //百位为零十位为零个位不为零读数方式{play_4004(i3);delay(50);play_4004(12);}if(i1!=0&&i2==0&&i3!=0) //百位不为零十位为零个位不为零读数方式{play_4004(i1);delay(50);play_4004(10);delay(50);play_4004(i2);delay(50);play_4004(0);delay(50);play_4004(i3);delay(50);play_4004(12);}- 16 -}}}7 MiMaSuo led显示V1 将密码写入24C02/****************************************************************************** **************************向AT24C02写入密码主程序说明:led数码管显示按键说明:无按键在程序中设定功能说明:当密码设定成功时数码管显示你所设定的密码当密码设定失败是数码管显示数字 5******************************************************************************* ****************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar num;uint buffer,buffer_H,buffer_L;//--------led数码管显示函数声明---------------------------void DISPLAY(unsigned int x);//--------AT24C02 函数声明---------------------------void WRITE_IIC(unsigned char ADDR_IIC2,unsigned char DATA_IIC2);unsigned char READ_IIC(unsigned char ADDR_IIC2);//-------------------------------------------void delay(uint t){while(t--);}void main(){while(1){if(num==0){num=1; //停止密码写入/*当你要设定的密码为**************1234时**********************/WRITE_IIC(0x00,12); /*写入24C02数据*****设定密码的高两位请修改这里******为12*/delay(1000);WRITE_IIC(0x01,34); /*写入24C02数据*****设定密码的底两位请修改这里- 17 -******为34*/}buffer_H=READ_IIC(0x00); //读取该地址的数据delay(1000);buffer_H=buffer_H*100;buffer_L=READ_IIC(0x01); //读取该地址的数据delay(1000);buffer=buffer_H+buffer_L;if(1234==buffer) /*修改为1234修改为你要设定的密码****例如为****1234时********/DISPLAY(buffer); //密码设定成功显示设定的密码else{DISPLAY(5); //密码设定失败num=0; //密码写入失败再次写入}}}8 MiMaSuo led显示V1/****************************************************************************** **************************密码锁主程序说明:LDE数码管显示LED灯指示密码输入正确与否按键说明:4X4键盘的0 1 ……8 9 为密码输入按键|| 4X4键盘按键10为复位键清空从新输入密码显示功能说明:当输入密码正确时程序自动确认LED指示灯点亮当4位密码输入完成LED指示灯未点亮则说明本次密码输入错误当再次按下任意数字键时进入下一次密码输入状态当第三次输入四位密码时未能成功点亮LED 蜂鸣器响三次密码错误报警当按下4X4键盘按键10 复位解除报警进入下一次密码输入轮回LED灯显示J2 LED1 接P3.6蜂鸣器J1 Buzzer 接P3.1******************************************************************************* ****************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit ok=P3^0; //密码输入正确指示接ledsbit beep=P3^1; //蜂鸣器引脚定义报警- 18 -uchar num,count; //密码输入次数计数|| 密码输入位数计数uint buffer_mima,buffer_key,display_key; //缓存读取24C02内部存存储的密码|| 读取的键值|| 显示的键值uint mima1,mima2,mima3,mima4; //缓存第4次输入密码千位百位十位个位|| 缓存第3次输入密码的千位百位十位|| 缓存第2次输入密码的千位百位|| 缓存第1次输入密码的最高位(千位)bit flag_beep; //报警状态标志uint buffer_H,buffer_L; //读取24C02中存储的密码的高低位//--------lde数码管显示函数声明---------------------------void DISPLAY(unsigned int x);//--------24C04数据存储函数声明---------------------------void WRITE_IIC(unsigned char ADDR_IIC2,unsigned char DATA_IIC2);unsigned char READ_IIC(unsigned char ADDR_IIC2);//--------4X4键盘函数声明---------------------------unsigned char Keyboard(void);//-------------------------------------------void delay(uint t){while(t--);}void initTimer(void){TMOD=0x1;TH0=0xb1;TL0=0xe0;}void timer0(void) interrupt 1{TH0=0xb1;TL0=0xe0;DISPLAY(display_key); //数码管扫描(数码管动态扫描放在主程序中时当按键按下数码管不能正常扫描)} //因此键数码管扫描放在定时器中当按键按下时保证显示正常void main(){initTimer();TR0=1;ET0=1;- 19 -EA=1;buffer_H=READ_IIC(0x00); //读取该地址的数据密码的千位百位delay(1000);buffer_H=buffer_H*100; //该字节地址数据位密码的千位百位放大100倍准备与十位个位合并buffer_L=READ_IIC(0x01); //读取该地址的数据密码的十位个位delay(1000);buffer_mima=buffer_H+buffer_L; //合并密码的千位百位与十位个位存入密码缓存while(1){buffer_key=Keyboard(); //读取4X4键盘的键值存入buffer_key按键值缓存if(16!=buffer_key){if(buffer_key<10) //当输入的键值小于10的时候认为是密码输入{count++; //密码输入的位数if(count>=5) //当第五位密码输入{count=1; //置密码位数为最高位输入}if(count<=4){switch(count) //密码千位百位十位个位识别{case 1:mima4=buffer_key;display_key=mima4; //显示密码千位break;case 2:mima3=buffer_key+mima4*10;display_key=mima3; //显示密码千位百位break;case 3:mima2=buffer_key+mima3*10;display_key=mima2; //显示密码千位百位个位break;case 4:mima1=buffer_key+mima2*10;display_key=mima1; //显示密码千位百位- 20 -个位个位break;}}if(count==4) //已输入4位密码进行密码识别{num++; //密码识别次数+1if(buffer_mima==mima1&&flag_beep==0) //缓存的密码与输入的密码比较&& 未到识别次数限制{ok=0; //密码正确标识num=0; //清零密码识别次数}else{if(num>=3) //密码输入错误次数判别{beep=0; //已到次数限制报警flag_beep=1; //停止密码再次判别}}}}if(10==buffer_key) //4X4键盘按键10 清零复位键{count=0; //清零按键位数计数mima1=0; //清零位数显示mima2=0;mima3=0;mima4=0;num=0; //清零密码识别次数ok=1; //清零密码正确标识beep=1; //清零报警flag_beep=0; //清零密码禁止识别标识display_key=0; //清零显示}}}}- 21 -9 MiMaSuo lcd显示V1/****************************************************************************** **************************密码锁主程序说明:LCE液晶显示按键说明:4X4键盘的0 1 ……8 9 为密码输入按键|| 4X4键盘按键10为复位键清空从新输入密码显示功能说明:当输入密码正确时程序自动确认液晶显示正确当4位密码输入完成液晶显示错误当再次按下任意数字键时进入下一次密码输入状态当第三次输入四位密码时蜂鸣器响三次密码错误报警并且4X4键盘的0 1 ……8 9 按键被锁定当按下4X4键盘按键10 复位解除报警解除被锁定按键进入下一次密码输入轮回蜂鸣器J1 Buzzer 接P3.1******************************************************************************* ****************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit beep=P3^1; //蜂鸣器引脚定义报警uchar num,count; //密码输入次数计数|| 密码输入位数计数uint buffer_mima,buffer_key,display_key; //缓存读取24C02内部存存储的密码|| 读取的键值|| 显示的键值uint mima1,mima2,mima3,mima4; //缓存第4次输入密码千位百位十位个位|| 缓存第3次输入密码的千位百位十位|| 缓存第2次输入密码的千位百位|| 缓存第1次输入密码的最高位(千位)bit flag_beep; //报警状态标志uint buffer_H,buffer_L; //读取24C02中存储的密码的高低位uchar lcd_display[4]=0;//--------LCD显示函数声明---------------------------void init_lcd(void);void ch_disp_any (unsigned char add, unsigned char num, unsigned char *chn);//--------24C04数据存储函数声明---------------------------void WRITE_IIC(unsigned char ADDR_IIC2,unsigned char DATA_IIC2);unsigned char READ_IIC(unsigned char ADDR_IIC2);//--------4X4键盘函数声明---------------------------unsigned char Keyboard(void);//-------------------------------------------- 22 -void delay(uint t){while(t--);}void main(){init_lcd();ch_disp_any(0x80,16,"密码锁**应电1014");ch_disp_any(0x90,14,"姓名: 某某某");ch_disp_any(0x88,12,"密码: ");ch_disp_any(0x98,14,"密码识别: ");buffer_H=READ_IIC(0x00); //读取该地址的数据密码的千位百位delay(1000);buffer_H=buffer_H*100; //该字节地址数据位密码的千位百位放大100倍准备与十位个位合并buffer_L=READ_IIC(0x01); //读取该地址的数据密码的十位个位delay(1000);buffer_mima=buffer_H+buffer_L; //合并密码的千位百位与十位个位存入密码缓存while(1){buffer_key=Keyboard(); //读取4X4键盘的键值存入buffer_key按键值缓存if(16!=buffer_key){if(buffer_key<10&&flag_beep==0) //当输入的键值小于10的时候认为是密码输入&& 未报警即:未到识别次数限制{count++; //密码输入的位数if(count>=5) //当第五位密码输入{count=1; //置密码位数为最高位输入ch_disp_any(0x9D,4," "); //4个空格密码清除密码正确|| 错误显示ch_disp_any(0x8B,8," "); //8个空格清除输入显示着的密码}if(count<=4){- 23 -switch(count) //密码千位百位十位个位识别{case 1: mima4=buffer_key;lcd_display[0]=buffer_key+0x30; //显示密码千位break;case 2: mima3=buffer_key+mima4*10;lcd_display[0]=buffer_key+0x30; //显示密码千位break;case 3: mima2=buffer_key+mima3*10;lcd_display[0]=buffer_key+0x30; //显示密码千位break;case 4: mima1=buffer_key+mima2*10;lcd_display[0]=buffer_key+0x30; //显示密码千位break;}if(count==1) ch_disp_any(0x8B,1,lcd_display); //将千位的密码显示到千位位置if(count==2) ch_disp_any(0x8C,1,lcd_display); //将百位的密码显示到百位位置if(count==3) ch_disp_any(0x8D,1,lcd_display); //将十位的密码显示到十位位置if(count==4) ch_disp_any(0x8E,1,lcd_display); //将个位的密码显示到个位位置}if(count==4) //已输入4位密码进行密码识别{num++; //密码识别次数+1if(buffer_mima==mima1) //缓存的密码与输入的密码比较{num=0; //清零密码识别次数ch_disp_any(0x9D,4,"成功"); //当汉字写‘确认’时两个汉字时显示出错}else{if(num>=3) //密码输入错误次数- 24 -判别{beep=0; //已到次数限制报警flag_beep=1; //停止密码再次判别ch_disp_any(0x9D,4,"报警");}elsech_disp_any(0x9D,4,"错误");}}}if(10==buffer_key) //4X4键盘按键10 清零复位键{count=0; //清零按键位数计数mima1=0; //清零位数显示mima2=0;mima3=0;mima4=0;num=0; //清零密码识别次数beep=1; //清零报警flag_beep=0; //清零密码禁止识别标识display_key=0; //清零显示ch_disp_any(0x9D,4," "); //4个空格密码清除密码正确|| 错误显示ch_disp_any(0x8B,8," "); //8个空格清除输入显示着的密码}}}}- 25 -注:底层程序需要修改说明1 AT24C02底层程序修改原因:按底层程序接线,将无法实现对AT24C02的读写操作!修改理由:修改前如图一所示,图一方框中程序VSDA定义为P3.6、VSCL定义为P3.7而程序说明中,如图一圆圈内容所示SCL接P3.6、SDA接P3.7显然与程序设定相反,所以请修改程序,如图二中圆圈所示,将程序注释中SCL接P3.7、SDA接P3.6。

十天学会单片机完整版212页PPT

十天学会单片机完整版212页PPT

RST 1 P3.0/RXD 2 P3.1/TXD 3
XTAL2 4 XTAL1 5 P3.2/INT0 6 P3.3/INT1 7 P3.4/T0 8 P3.5/T1 9
GND 10
20 VCC 19 P1.7 18 P1.6 17 P1.5 16 P1.4 15 P1.3 14 P1.2 13 P1.1/AIN1 12 P1.0/AIN0 11 P3.7
VSS 20
40 VCC 39 P0.0 38 P0.1 37 P0.2 36 P0.3 35 P0.4 34 P0.5 33 P0.6 32 P0.7 31 EA/VPP 30 ALE/PROG 29 PSEN 28 P2.7 27 P2.6 26 P2.5 25 P2.4 24 P2.3 23 P2.2 22 P2.1 21 P2.0
十天学会单片机完整版
自信是向成功迈出的第一步
十天学会单片机 完整版
▪ 十天学会单片机 完整版
单板机的I/O设备简单,软件资 源少,使用不方便。早期主要用 于微型计算机原理的教学及简单 的测控系统,现在已很少使用。
◆单片机
在一片集成电路芯片上集成微处理器、
存储器、I/O接口电路,从而构成了单芯片 微型计算机,即单片机。 Intel公司推出了 MCS-51系列单片机:集成 8位CPU、4K字 节ROM、128字节RAM、4个8位并口、1个 全双工串行口、2个16位定时/计数器。寻址 范围64K,并有控制功能较强的布尔处理器 。
2 10
8
1000
3 11
9
1001
4 100
10
1010
5 101
11
1011
十六进制
▪ 是二进制的简短表示形式。 十进制中的0-15分别表示为十六进制的0、1 、2、3、4、5、6、7、8、9、A、B、C、D 、E、F

(完整版)51单片机汇编指令(全)

(完整版)51单片机汇编指令(全)

指令中常用符号说明Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7)Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1)Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址#data表示8位常数(立即数)#data16表示16位常数Add16表示16位地址Addr11表示11位地址Rel8位代符号的地址偏移量Bit表示位地址@间接寻址寄存器或基址寄存器的前缀( )表示括号中单元的内容(( ))表示间接寻址的内容指令系统数据传送指令(8个助记符)助记符中英文注释MOV Move 移动MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器AMOV A , Direct;(direct)→A,直接地址的内容送AMOV A ,@ Ri;(Ri)→A,RI间址的内容送AMOV A , #data;data→A,立即数送AMOV Rn , A;A→Rn,累加器A的内容送寄存器RnMOV Rn ,direct;(direct)→Rn,直接地址中的内容送RnMOV Rn , #data;data→Rn,立即数送RnMOV direct , A;A→(direct),累加器A中的内容送直接地址中MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址MOV direct , #data;8位立即数送到直接地址中MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中MOV @Ri , #data; data→@Ri ,8位立即数送到间址中MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令)(MOV类指令共16条)MOVC Move Cod 查表指令MOVC A , @A+PC;PC+1→PC,(A+PC)→AMOVC A , @A+DPTR;(A+DPTR) →A(MOVC类指令共两条)MOVX Move External 与外部数据寄存区传送数据MOVX A , @DPTR;(DPTR)→A,DPTR间址单元内容送AMOVX @DPTR , A;A→(DPTR),A中内容送入DPTR间址单元MOVX A , @Ri;(Ri)→A,Ri间址单元内容送AMOVX @Ri , A;A→(Ri),A中内容送Ri间址单元(MOVX类指令4条)XCH Exchange 交换指令XCH A , Rn;Rn←→A , Rn的内容与A的内容交换XCH A , Direct; Direct ←→A ,直接地址的内容与A的内容交换XCH A , @Ri;(Ri)←→A ,间址的内容与A的内容交换XCHD Exchange Decimal十进制交换XCHD A , @Ri;(Ri.3~Ri.0) ←→A.3~A.0,间址内容低四位与A中内容低四位交换SWAP Swap 交换SWAP A;A.3~A.0←→ A.7~A.4 , A中低四位与高四位内容交换PUSH Push 入栈PUSH direct;SP+1→SP , (direct)→(SP);直接地址内容压入堆栈顶POP Pop 出栈POP direct;(SP)→(direct) , SP-1→SP;堆栈内容弹出到直接地址●算术运算类指令(7个助记符)ADD Add 加法运算ADD A , Rn;A + Rn→A , A与Rn的内容相加,结果送到A中ADD A , direct;(direct)+A→A,A与直接地址的内容相加,结果送到A中ADD A , @Ri;((Ri))+A→A, A与间址中的内容相加,结果送到A中ADD A , #data;data+A→A,A与立即数相加,和送入AADDC ADD with Carry 带进位加法ADDC A , Rn;A + Rn+CY→A , A与Rn的内容、进位状态相加,结果送到A中ADDC A , direct;(direct)+A+CY→A,A与直接地址的内容、进位状态相加,结果送到A中ADDC A , @Ri;((Ri))+A+CY→A, A与间址中的内容、进位状态相加,结果送到A中ADDC A , #data;data+A+CY→A,A与立即数、进位状态相加,和送入ASUBB Subbtract with Borrow 带进位减法SUBB A , Rn;A-Rn-CY→A,A减寄存器Rn的内容及进位标志,结果送ASUBB A , direct; A-(direct)-CY→A,A直接地址的内容及进位标志,结果送ASUBB A , @Ri; A-((Ri))-CY→A,A间址的内容及进位标志,结果送ASUBB A , #data; A-data-CY→A,A立即数及进位标志,结果送AMUL Multiply 乘法指令MUL AB;A x B→B和A,结果16位,高8位存入B,低8位存入A;若结果大于FFH,则将溢出标志OV置1DIV Divide 除法指令DIV AB;A÷B 商→A,余数→B;若除数为0,结果不确定,则将溢出标志OV置1INC Increment 加1指令INC A;A+1→A,A加1,结果放在AINC Rn; Rn +1→ Rn, Rn加1,结果放在RnINC direct; (direct)+1→ direct,直接地址的内容加1,结果放在该地址中INC @Ri;((Ri))+1→( Ri),间址中的内容加1,结果放在该间址中INC DPTR;(DPTR)+1→DPTR,数据指针内容加1,结果放在数据指针寄存器(DPTR)中DEC Decrement 减1指令INC A;A-1→A,A减1,结果放在AINC Rn; Rn -1→ Rn, Rn减1,结果放在RnINC direct; (direct)-1→ direct,直接地址的内容减1,结果放在该地址中INC @Ri;((Ri))-1→( Ri),间址中的内容减1,结果放在该间址中DA Decimal Adjust 十进制加法调整指令DA A;在加法指令后,把A中二进制码自动调整为BCD码;DA A只能更跟在ADD或ADDC加法指令后,不适用于减法●逻辑运算指令(9个助记符)ANL Logical And 逻辑与运算ANL A , Rn; (A)与(Rn)→A, A的内容与Rn中的内容相与,结果放在A中ANL A , direct; (A)与(direct)→A, A的内容与直接地址中的内容相与,结果放在A中ANL A , @Ri; (A)与((Ri))→A, A的内容与间址的内容相与,结果放在A中ANL A , #data; (A)与(data)→A, A的内容与立即数相与,结果放在A中ANL direct , A; (direct)与(A)→direct, 直接地址中的内容相与A的内容相与,结果放在直接地址中ANL direct , #data;(direct)与#data→direct, 直接地址中的内容相与立即数相与,结果放在直接地址中ORL Logical OR 逻辑或运算ORL A , Rn; (A) 或(Rn)→A, A的内容与Rn中的内容相或,结果放在A中ORL A , direct; (A) 或(direct)→A, A的内容与直接地址中的内容相或,结果放在A中ORL A , @Ri; (A) 或((Ri))→A, A的内容与间址的内容相或,结果放在A中ORL A , #data; (A) 或(data)→A, A的内容与立即数相或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相或,结果放在直接地址中ORL direct , #data;(direct) 或#data→direct, 直接地址中的内容相与立即数相或,结果放在直接地址中XRL Logical exclusive or 逻辑异或运算ORL A , Rn; (A) 异或(Rn)→A, A的内容与Rn中的内容相异或,结果放在A中ORL A , direct; (A) 异或(direct)→A, A的内容与直接地址中的内容相异或,结果放在A中ORL A , @Ri; (A) 异或((Ri))→A, A的内容与间址的内容相异或,结果放在A中ORL A , #data; (A) 异或(data)→A, A的内容与立即数相异或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相异或,结果放在直接地址中ORL direct , #data;(direct) 异或#data→direct, 直接地址中的内容相与立即数相异或,结果放在直接地址RL Rotate Left 循环左移指令RL A;每执行一次,A中的内容左移一位RR Rotate Right 循环右移指令RR A;每执行一次,A中的内容右移一位RLC Rotate Left with the Carry flag 带进位循环左移指令RLC A;每执行一次,CY和A中的内容左移一位RRC Rotate Right with the Carry flag带进位循环又移指令RRC A;每执行一次,CY和A中的内容右移一位注意:循环移位指令只能对A中的内容进行移位操作CPL Complement 取反指令(求补指令)CPL A;累加器内容按位取反,0变1,1变0CLR Clear 清零指令CLR A;累加器清零(A各位全变为0)●控制转移指令(9个助记符)LJMP Long Jump 长跳转指令LJMP add16;add16→PC,无条件跳转到add16地址,可在64KB范围内转移AJMP Absolute Jump 绝对跳转指令AJMP add11;add11→PC,无条件跳转到add11地址,可在2KB范围内转移SJMP Short Jump 短跳转指令SJMP rel;PC+2+rel→PC,rel是偏移量,8位有符号数(-127~127),可向前后跳转±128个地址单元JMP Jump 跳转指令JMP @A+DPTR;A+DPTR→PC,属于散转指令,无条件转向A与DPTR内容相加后形成的新地址JZ Jump if acc is Zero累加器为零转移JZ rel;A=0转向PC+2+rel→PC,A≠0,顺序执行JNZ Jump if acc is Not Zero累加器不为零转移JNZ rel;A≠0转向PC+2+rel→PC,A=0,顺序执行CJNE Compare and Jump if Not Equal比较不相等则转移CJNE A , direct , rel;A≠(direct)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(direct)CY=0, (A)<(direct)CY=1CJNE A , #data , rel;A≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(data)CY=0,( A)<(data)CY=1CJNE Rn , #data , rel; Rn≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); (Rn) >(data)CY=0, (Rn) <(data)CY=1CJNE @Ri , #data , rel;((Ri))≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); ((Ri))>(data)CY=0, ((Ri)) <(data)CY=1DJNE Decrement and Jump if Not Zero 减1不为0则转移DJNE Rn , rel;Rn-1→Rn, Rn≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)DJNZ direct , rel;(direct-1)→direct, direct≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)LCALL Long Call 长条用指令LCALL addr16;调用程序入口地址为addr16的之程序ACALL Absolute Call短调用ACALL addr11;调用程序入口地址为addr11的之程序RET ReturnRET;放在子程序最后,使程序准确返回到主程序断点处RETI Return from InterruptRETI;中断返回指令,能清楚优先级状态NOP No Operation 空操作指令NOP;空操作,产生一个机器周期延时●位操作指令MOV Move 数据传送指令MOV C , bit;(bit)→C,寻址位的状态送入CMOV bit , C;(C)→bit,C的转态送入地址中CLR Clear 清零指令CLR C;0→C,清零累加器CLR bit;清零直接寻址位CPL Complement 取反指令(求补指令)CPL C;c取反CPL bit;直接寻址位取反SETB Set Bit 置位SETB C;C置1SETB bit;直接寻址位置1ANL And Logical 与逻辑运算ANL C , bit;直接寻址位与C相与,结果放在CANL C , /bit; 直接寻址位与非C相与,结果放在CORL OR Logical 或逻辑运算ORL C , bit;直接寻址位与C相或,结果放在CORL C , /bit; 直接寻址位与非C相或,结果放在CJC Jump if Carry is set 进位位为1则转移JC rel;C=1,转向PC+2+rel→PC,否则顺序执行PC+2→PCJNC Jump if Carry is Not set 进位位为不为1则转移JNC rel;C=0,转向PC+2+rel→PC,否则顺序执行PC+2→PCJB Jump if Bit is set 进位位为1则转移JB bit , rel;(bit)=1,转向PC+3+rel→PC,否则顺序执行PC+3→PCJNB Jump if Bit is Not set 进位位为1则转移JNB bit , rel;(bit)=0,转向PC+3+rel→PC,否则顺序执行PC+3→PCJBC Jump if Bit is set and Clear bit指定位等于1转移并清该位JBC bit , rel; (bit)=1,转向PC+3+rel→PC,同时0→bit否则顺序执行PC+3→PC伪指令ORG Origin 代码起始地址指令ORG 0000HMOV A , #0010H;这条指令从0000H这个地址单元开始写起END End 汇编程序结束指令END;汇编指令结束DB字节定义伪指令ORG 1000HDB 01H , 02H;则(1000H)=01H,(1001H)=02HORG 1100HDB ‘01’;则(1100H)=30H,30H是0的ASCII码,(1101H)=31H,31H是1的ASCII码DW双字节定义伪指令ORG 2000HDW 2546H , 0178H; (2000H)=25H, (2001H)=46H, (2002H)=01H, (2003H)=78H,EQU数据赋值伪指令X EQU n;将n的值赋给xBIT位数据赋值伪指令y BIT b;y是用户定义标号,b为0或1MACRO宏指令宏指令名MACRO 形式参数······代码段······ENDM;宏指令定义结束寻址方式及相关的存储空间寻址方式寻址范围寄存器寻址R0~R7A 、B、C(CY)、AB(双字节)、DPTR(双字节)、PC(双字节)直接寻址内部RAM低128字节特殊功能寄存器内部RAM位寻区的128个位特殊功能寄存器中可寻址的位寄存器间接寻址内部数据存储器RAM【@R0,@R1,@SP(仅PUSH,POP)】内部数据存储器单元的低4位(@R0,@R1)外部RAM或I/O口(@R0,@R1,@DPTR)立即寻址程序存储器(常数)程序存储器(@A+PC,@A+DPTR)基寄存器加变址寄存器间接寻址。

单片机完整版

单片机完整版

长春建筑学院设计题目:数字时钟班级:电091姓名:学号:08指导老师:日期:2012 08 23题目名称:数字时钟长春建筑学院电气信息学院项目实现功能:使用TX-1C实验板自带的配件及板上资源设计一个时钟,要求如下:(1)时间显示在1602液晶上,并且按秒实时更新。

(2)能够使用板上的按键随时调节时钟的时、分、秒,按键可设计三个有效键,分别为功能选择键、数值增大键、数值减小键。

(3)每次有键按下时,蜂鸣器都以短“滴”声报警。

(4)利用板上的AT24C02设计实现断电自动保护显示数据的功能,当下次上电时会接上上次断电前的时间数据继续运行。

一、设计方案1、单片机引脚接线单片机的P0.0~P0.7加上拉电阻并与1602液晶的D0~D7连接,通过单片机内部的程序驱动整个系统运行。

2、24C02电路AT24C02电路实现断电保护显示数据的功能,当下次上电时会接着上断电前的时间数据继续运行。

3、1602电路1602的管脚与单片机相连,单片机将数据传送到1602实现时钟的显示功能。

4、蜂鸣器电路通过非门与ULN2003来驱动蜂鸣器5、总仿真电路启动前启动后二、系统调试主控芯片为AT89C52,晶振为11.0592M,由于处理器速度满足全部功能的实现,故用通俗明了的C语言编写源程序。

将程序下载到已经设计好的硬件电路中进行调试,通过不断的纠正和改进,终于实现了时钟的正常显示。

三、C语言程序#include<reg52.h> //包含52单片机头文件#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //定义锁存器锁存端sbit wela=P2^7;sbit rs=P3^5; //定义1602液晶RS端sbit lcden=P3^4; //定义1602液晶LCDEN端sbit s1=P3^0; //定义按键--功能键sbit s2=P3^1; //定义按键--增加键sbit s3=P3^2; //定义按键--减小键sbit rd=P3^7;sbit beep=P2^3; //定义蜂鸣器端bit write=0; //写24C02的标志;sbit sda=P2^0;sbit scl=P2^1;uchar count,s1num;char miao,shi,fen;uchar code table[]=" 2012-8-21 TUE"; //定义初始上电时液晶默认显示状态void delay0(){ ;; }void start() //开始信号{sda=1;delay0();scl=1;delay0();sda=0;delay0();}void stop() //停止{sda=0;delay0();scl=1;delay0();sda=1;delay0();}void respons() //应答{uchar i;scl=1;delay0();while((sda==1)&&(i<250))i++;scl=0;delay0();}void init_24c02() //IIC初始化函数{sda=1;delay0();scl=1;delay0();}void write_byte(uchar date) //写一个字节函数{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay0();sda=CY;delay0();scl=1;delay0();}scl=0;delay0();sda=1;delay0();}uchar read_byte() //读一个字节函数{uchar i,k;scl=0;delay0();sda=1;delay0();for(i=0;i<8;i++){scl=1;delay0();k=(k<<1)|sda;scl=0;delay0();}return k;}void write_add(uchar address,uchar date) //指定地址写一个字节{start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();}char read_add(uchar address) //指定地址读一个字节{uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di()//蜂鸣器发声函数{beep=0;delay(100);beep=1;}void write_com(uchar com) //液晶写命令函数{rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date) //液晶写数据函数{rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date) //写时分秒函数{uchar shi,ge;shi=date/10; //分解一个2位数的十位和个位ge=date%10;write_com(0x80+0x40+add); //设置显示位置write_date(0x30+shi); //送去液晶显示十位write_date(0x30+ge); //送去液晶显示个位}void init()//初始化函数{uchar num;rd=0; //软件将矩阵按键第4列一端置低用以分解出独立按键dula=0; //关闭两锁存器锁存端,防止操作液晶出现乱码wela=0;lcden=0;fen=0; //初始化种变量值miao=0;shi=0;count=0;s1num=0;init_24c02();write_com(0x38); //初始化1602液晶write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80); //设置显示初始坐标for(num=0;num<15;num++) //显示年月日星期{write_date(table[num]);delay(5);}write_com(0x80+0x40+6); //写出时间显示部分的两个冒号write_date(':');delay(5);write_com(0x80+0x40+9);write_date(':');delay(5);miao=read_add(1); //首次上电从AT24C02中读取出存储的数据fen=read_add(2);shi=read_add(3);write_sfm(10,miao); //分别送去液晶显示write_sfm(7,fen);write_sfm(4,shi);TMOD=0x01;//设置定时器0工作模式1TH0=(65536-50000)/256; //定时器装初值TL0=(65536-50000)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0}void keyscan() //按键扫描函数{if(s1==0){delay(5);if(s1==0) //确认功能键被按下{ s1num++; //功能键按下次数记录while(!s1); //释放确认di(); //每当有按键释放蜂鸣器发出滴声if(s1num==1) //第一次被按下时{TR0=0; //关闭定时器write_com(0x80+0x40+10);//光标定位到秒位置write_com(0x0f); //光标开始闪烁}if(s1num==2) //第二次按下光标闪烁定位到分钟位置{write_com(0x80+0x40+7);}if(s1num==3) //第三次按下光标闪烁定位到小时位置{write_com(0x80+0x40+4);}if(s1num==4) //第四次按下{s1num=0; //记录按键数清零write_com(0x0c); //取消光标闪烁TR0=1; //启动定时器使时钟开始走}}}if(s1num!=0) //只有功能键被按下后,增加和减小键才有效{if(s2==0){delay(5);if(s2==0) //增加键确认被按下{while(!s2); //按键释放di(); //每当有按键释放蜂鸣器发出滴声if(s1num==1) //若功能键第一次按下{miao++; //则调整秒加1if(miao==60)//若满60后将清零miao=0;write_sfm(10,miao);//每调节一次送液晶显示一下write_com(0x80+0x40+10);//显示位置重新回到调节处write_add(1,miao); //数据改变立即存入24C02 }if(s1num==2)//若功能键第二次按下{fen++;//则调整分钟加1if(fen==60)//若满60后将清零fen=0;write_sfm(7,fen);//每调节一次送液晶显示一下write_com(0x80+0x40+7);//显示位置重新回到调节处write_add(2,fen);//数据改变立即存入24C02}if(s1num==3)//若功能键第三次按下{shi++; //则调整小时加1if(shi==24) //若满24后将清零shi=0;write_sfm(4,shi);;//每调节一次送液晶显示一下write_com(0x80+0x40+4);//显示位置重新回到调节处write_add(3,shi);//数据改变立即存入24C02}}}if(s3==0){delay(5);if(s3==0) //确认减小键被按下{while(!s3); //按键释放di(); //每当有按键释放蜂鸣器发出滴声if(s1num==1) //若功能键第一次按下{miao--; //则调整秒减1if(miao==-1) //若减到负数则将其重新设置为59miao=59;write_sfm(10,miao);//每调节一次送液晶显示一下write_com(0x80+0x40+10);//显示位置重新回到调节处write_add(1,miao);//数据改变立即存入24C02}if(s1num==2) //若功能键第二次按下{fen--; //则调整分钟减1if(fen==-1) //若减到负数则将其重新设置为59fen=59;write_sfm(7,fen); //每调节一次送液晶显示一下write_com(0x80+0x40+7);//显示位置重新回到调节处write_add(2,fen);//数据改变立即存入24C02}if(s1num==3) //若功能键第二次按下{shi--; //则调整小时减1if(shi==-1) //若减到负数则将其重新设置为23shi=23;write_sfm(4,shi);//每调节一次送液晶显示一下write_com(0x80+0x40+4);//显示位置重新回到调节处write_add(3,shi);//数据改变立即存入24C02}}}}}void main() //主函数{init(); //首先初始化各数据while(1) //进入主程序大循环{keyscan(); //不停的检测按键是否被按下}}void timer0() interrupt 1 //定时器0中断服务程序{TH0=(65536-50000)/256; //再次装定时器初值TL0=(65536-50000)%256;count++; //中断次数累加if(count==20) //20次50毫秒为1秒{count=0;miao++;if(miao==60) //秒加到60则进位分钟{miao=0; //同时秒数清零fen++;if(fen==60) //分钟加到60则进位小时{fen=0; //同时分钟数清零shi++;if(shi==24) //小时加到24则小时清零{shi=0;}write_sfm(4,shi); //小时若变化则重新写入write_add(3,shi); //数据改变立即存入24C02 }write_sfm(7,fen); //分钟若变化则重新写入write_add(2,fen); //数据改变立即存入24C02 }write_sfm(10,miao); //秒若变化则重新写入write_add(1,miao); //数据改变立即存入24C02 }}四、实物图准备阶段完成品正面背面五、设计总结设计的总结:通过这次时钟的设计,使我更能熟练的掌握单片机的知识:本次设计中涉及51单片机、1602液晶以及单片机的最小系统等等。

2024版年度单片机原理及应用全套完整课件

2024版年度单片机原理及应用全套完整课件

件CONTENTS •课件概述•单片机基础知识•单片机内部结构与工作原理•单片机指令系统与程序设计•单片机外部扩展技术及应用•单片机接口技术及应用•单片机通信技术及应用课件概述01课件内容与目标内容涵盖单片机基本原理、架构、指令系统、编程语言、开发工具及典型应用等方面知识。

目标培养学生掌握单片机系统开发的基本技能,具备独立设计单片机应用系统的能力。

课件结构与安排结构按照由浅入深、循序渐进的原则,分为基础篇、提高篇和应用篇三个部分。

安排基础篇主要介绍单片机的基本概念和原理;提高篇着重讲解单片机的指令系统和编程语言;应用篇则通过实例分析,介绍单片机的典型应用和开发流程。

学习方法与建议学习方法建议采用理论与实践相结合的学习方式,通过实验和课程设计等环节加深对单片机原理及应用的理解。

学习建议在学习过程中,应注重培养自己的逻辑思维能力和动手能力,多思考、多实践,不断提高自己的单片机应用水平。

同时,还应积极参加各种科技竞赛和实践活动,锻炼自己的团队协作和创新能力。

单片机基础知识02单片机概述单片机的定义单片机是一种集成电路芯片,它采用超大规模集成电路技术,将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM等功能集成到一块硅片上,构成一个小而完善的微型计算机系统。

单片机的基本组成单片机主要由运算器、控制器、存储器和输入输出设备等部分组成,其中运算器和控制器是单片机的核心部件。

早期的单片机功能相对简单,主要用于控制领域,如Intel公司的8048、8051等。

随着技术的发展,现代单片机功能越来越强大,集成了更多的外设接口和通信接口,如ARM公司的ARM7、ARM9等。

未来单片机将更加注重低功耗、高性能、高集成度和智能化等方向的发展。

早期单片机现代单片机未来单片机发展趋势单片机发展历程单片机广泛应用于工业自动化控制系统中,如温度控制、压力控制、流量控制等。

工业控制领域单片机在智能仪表中也有着广泛的应用,如电能表、水表、燃气表等。

MCS-51单片机(完整版)

MCS-51单片机(完整版)

智能仪表
单机应用 机电一体化产品
智能接口
单片机应用
智能民用产品 功能集散系统
多机应用 并行多控制系统
局部网络系统 是指在一个应用系统中,使用多个单片机。
2 单片机芯片的硬件结构
2.1 MCS-51单片机的逻辑结构及信号引脚
2.1.1 MCS-51单片机基本结构框图
输入输出接口 (I/O)
控制与运算单元 (CPU)
1.2 单片机的发展 1.2.1 单片机的发展概述
1946 第一台计算机诞生 1971 第一个微处理器诞生 1976 MCS-48(8位) 1980 MCS-51(8位) 1983 MCS-96(16位) 80年代末 Motorola 680X
Zilog Z-8
Rockwell 650X•••
当前: (1) MCS-51、MCS-96系列发 展(2。) PIC (Microchip公司) (3) ARM (4) 凌阳单片机 (5) AVR
1.3.1 单片机的特点
长寿命 体积小 低电压与低功耗
低噪声与高可靠性技术
总而言之,单片机具有集成度高、功能强、体 积小、功耗低、使用方便、价格低廉等优点。
第一章 单片机概述
1.1 单片机的概念
1.2 单片机的发展
1.3 单片机的应用
1.3.1 单片机的特点 1.3.2 单片机的应用领域
是指在一个应用系统中,只用一个单片机。 测控系统
外接晶体引线端
2.1.3 MCS-51的信号引脚 1. 信号引脚介绍 2. 信号引脚的第二功能
• P3口线的第二功能
口线
P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
第二功能 RXD TXD INT0 INT1 T0 T1 WR RD

单片机超详细教程超赞PPT课件

单片机超详细教程超赞PPT课件

单元地址 MSB
2FH
7F
7E
2EH
77
76
2DH
6F
6E
2CH
67
66
2BH
5F
5E
2AH
57
56
29H
4F
4E
28H
47
46
27H
3F
3E
26H
37
36
25H
2F
2E
24H
27
26
23H
1F
1E
22H
17
16
21H
0F
0E
20H
07
06
位地址
7D
7C
75
74
6D
6C
65
64
5D
5C
55
54
4D
4C
VSS
1
40
2
39
3
38
4 5
8031
37 36
6
35
7 8051 34
8
33
9 10
8751
32 31
11
30
12 89C51 29
13
28
14
27
15
26
16
25
17
24
18
24
19
22
20
21
VCC P0. 0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 EA ALE PSEN P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2. 0
单片机复位条件: 必须使RST引脚持续2微秒高电平(外部时钟12MHz)

单片机最终完整版

单片机最终完整版

单片机1.控制8只led,每1秒闪亮一次,利用定时器实现1秒定时。

2.发光二极管从左向右依次1、3闪亮,2、4闪亮,5、7闪亮,6、8闪亮,中间时间间隔500ms,然后为左四个点亮,600ms后熄灭,右四个点亮,500ms后熄灭,循环上述方式。

3.在P.0端口上接一个发光二极管,发光二极管不停的闪烁,一亮一灭的时间间隔为0.4s(相同意思:闪烁周期为1秒,占空比40%)4.8个发光二极管显示0-200进制值,中间间隔为400ms,循环显示。

5.8个发光二极管,依次点亮从右到左间隔400ms,然后停留2s后熄灭,然后从左到右依次点亮,间隔800ms,然后停留3s后熄灭,停止。

6.将单片机的I/O接口连接到一排发光二极管上,使得这排二极管由中间向两端依次点亮,全亮后,保持2s钟,然后,再由中间向两端熄灭,要求每次动作时间间隔为200ms,重复上述过程。

7.P1接一排二极管上,使一排二极管有两端向中间依次点亮,然后再由两边至中间熄灭,熄灭后保持30秒,再依次循环,要求每次动作间隔0.7s,重复上述方式。

8. P1接一排二极管上,四个一组同时由左到右,点亮持续2s,再由右向左依次熄灭,要求每次动作时间间隔为500ms,重复上述方式。

9. P1接一排二极管上,由低位到高位,第一次前两位闪烁点亮5次,间隔500ms 后,轮到下两位闪烁点亮4次,间隔500ms后,轮到下两位闪烁点亮3次,间隔500ms后轮到下两位闪烁点亮2次,间隔500ms,循环上述方式。

10.应用单片机内部定时器T0的工作方式1,输入周期为2s的方波脉冲信号,利用发光二极管显示输出上述位置。

按键+二极管11.连接两个按键,发光二极管全亮,按一个按键时,8个led从左到右熄灭,间隔800ms,按另一个时,8个led从右到左熄灭,间隔600ms。

12.K0按下,流水灯由左向右显示,K1按下,流水灯停止显示。

利用4个独立按键控制led点亮13.主程序执行时,8个led从左到右点亮,当外部中断(按键作为中断源)执行中断,8个led亮灭一次后,左右各四个led同时亮灭,然后执行主程序。

单片机实验报告(完整版)

单片机实验报告(完整版)

单片机原理与应用实验报告学院(部):专业:学生姓名:班级:学号:最终评定成绩:实验一存储器读写一、实验目的:1、掌握寄存器、存储器读写等汇编指令;2、掌握编程软件编辑、编译、调试等基本操作。

二、实验仪器设备1.PC机,1台2.WAVE软件开发系统三、实验内容及步骤:1、将下面的汇编程序输入到W A VE集成开发软件中ORG 0000HSJMP STARTORG 0030HSTART:MOV R0,#07HMOV 70H,#08HMOV R1,#70HMOV DPTR,#2000HLOOP:MOVX A,@R1MOVX A,@DPTRINC R1INC ADJNZ R7,LOOPSJMP $END2、选择菜单“仿真器”→“仿真器设置”,按下图所示完成软件初始设置。

3、选择菜单“项目”下“编译”,编译通过后,选择“单步运行”,观察记录寄存器(R0、R1)、累加器(A)、程序状态字(PSW)、外部存储器(2000H单元)、I/O端口(P1)的数据变化。

四、源程序源程序:ORG 0000H ;定义起始地址SJMP STARTORG 0030HSTART:MOV R0,#07HMOV 70H,#08H ;给内部RAM的70H单元赋初值MOV R1,#70H ;使R1指向内部70H单元MOV DPTR,#2000H ;定义外部存储器开始单元LOOP:MOVX A,@R1 ;将R1所指向的70H的内容赋给AMOVX @DPTR,A;将A的内容赋给外部存储器单元INC R1 ;内部RAM地址加1INC DPTR ;外部存储器地址加1DJNZ R7,LOOP ;循环,直到RAM中70H~7FH;单元的内容全部相应赋给;外部2000H~2007H单元SJMP $END3、记录下程序单步运行时,寄存器(R0、R1)、累加器(A)、程序状态字(PSW)、外部存储器(2000H单元)、I/O端口(P1)的数据变化。

五、仿真效果图实验二I/O端口操作一、实验目的:1、掌握I/O端口读写等基本汇编指令;2、掌握单片机最小系统硬件电路设计及仿真软件PROTEUS仿真、调试等基本操作方法。

单片机终极版

单片机终极版

1、LED 闪烁程序注释#include<reg52.h>sbit LED = P0^0; sbitADDR0 = P1^0; sbit ADDR1 =P1^1; sbit ADDR2 = P1^2;sbit ADDR3 = P1^3; sbitENLED = P1^4;void main() //void即函数类型{//以下为声明语句部分unsigned int i = 0; //定义一个无符号整型变量i,并赋初值0//以下为执行语句部分ENLED = 0; //U3、U4两片74HC138总使能ADDR3 = 1; //使能U3使之正常输出ADDR2 = 1; //经U3的Y6输出开启三极管Q16ADDR1 = 1; ADDR0 = 0;while (1){LED = 0; //点亮小灯for (i=0; i<30000; i++); //延时一段时间 LED = 1; //熄灭小灯 for (i=0; i<30000; i++); //延时一段时间 } }2、流水灯的程序注释#include <reg52.h>sbit ADDR0 = P1^0; sbitADDR1 = P1^1; sbit ADDR2 =P1^2; sbit ADDR3 = P1^3;sbit ENLED = P1^4;void main(){ unsigned int i = 0; //定义循环变量i,用于软件延时unsigned char cnt = 0; //定义计数变量cnt,用于移位控制ENLED = 0;ADDR3 = 1;ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;while (1) //主循环,程序无限循环执行该循环体语句{P0 = ~(0x01 << cnt); //P0等于1左移cnt位,控制8个LED for (i=0; i<20000; i++); //软件延时 cnt++; //移位计数变量自加1 if (cnt >= 8) //移位计数超过7后,再重新从0开始 { cnt= 0; } } }3、数码管的静态显示程序注释#include <reg52.h>sbit ADDR0 = P1^0; sbitADDR1 = P1^1; sbit ADDR2 =P1^2; sbit ADDR3 = P1^3;sbit ENLED = P1^4;//用数组来存储数码管的真值表,数组将在下一章详细介绍unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; void main(){ unsigned char cnt = 0; //记录T0中断次数unsigned char sec = 0; //记录经过的秒数ENLED = 0; //使能U3,选择数码管DS1ADDR3 = 1;ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;TMOD = 0x01; //设置T0为模式1TH0 = 0xB8; //为T0赋初值0xB800 TL0 = 0x00; TR0 = 1; //启动T0while (1){ if (TF0 == 1) //判断T0是否溢出{TF0 = 0; //T0溢出后,清零中断标志TH0 = 0xB8; //并重新赋初值TL0 = 0x00;cnt++; //计数值自加1 if (cnt >= 50) //判断T0溢出是否达到50次{cnt = 0; //达到50次后计数值清零P0 = LedChar[sec]; //当前秒数对应的真值表中的值送到P0口sec++; //秒数记录自加 1 if (sec >= 16) //当秒数超过0x0F(15)后,重新从0开始{ sec = 0; } } } } }4、点阵程序读写注释1、#include <reg52.h>sbit ADDR0 = P1^0; sbitADDR1 = P1^1; sbit ADDR2 =P1^2; sbit ADDR3 = P1^3;sbit ENLED = P1^4;void main(){ENLED = 0; //U3、U4两片74HC138总使能ADDR3 = 0; //使能U4使之正常输出ADDR2 = 0; //经U4的Y1输出开启三极管Q11ADDR1 = 0;ADDR0 = 1;P0 = 0x00; //向P0写入0来点亮一行 while(1);//程序停止在这里 }2、#include <reg52.h>sbit ADDR0 = P1^0; sbitADDR1 = P1^1; sbit ADDR2 =P1^2; sbit ADDR3 = P1^3;sbit ENLED = P1^4;void main(){EA = 1; //使能总中断ENLED = 0; //使能U4,选择LED点阵ADDR3 = 0; //因为需要动态改变ADDR0-2的值,所以不需要再初始化了TMOD = 0x01; //设置T0为模式1TH0 = 0xFC; //为T0赋初值0xFC67,定时1msTL0 = 0x67;ET0 = 1; //使能T0中断TR0 = 1; //启动T0 while (1); //程序停在这里,等待定时器中断} /* 定时器0中断服务函数 */void InterruptTimer0() interrupt 1{ static unsigned char i = 0; //动态扫描的索引TH0 = 0xFC; //重新加载初值TL0 = 0x67;//以下代码完成LED点阵动态扫描刷新P0 = 0xFF; //显示消隐 switch (i){ case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0x00; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0x00; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0x00; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0x00; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0x00; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0x00; break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0x00; break; case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=0x00; break; default: break; } }5、写程序#include <reg52.h>sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2;sbit ADDR3 = P1^3; sbit ENLED = P1^4;unsigned char code image[] = { //图片的字模表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,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; void main(){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中断服务函数 */void InterruptTimer0() interrupt 1{ static unsigned char i = 0; //动态扫描的索引 static unsigned char tmr = 0; //250ms 软件定时器 static unsigned char index = 0; //图片刷新索引TH0 = 0xFC; //重新加载初值TL0 = 0x67; //以下代码完成LED点阵动态扫描刷新P0 = 0xFF; //显示消隐 switch (i){ case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index+0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index+1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index+2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++;P0=image[index+3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index+4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index+5]; break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index+6]; break; case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index+7]; break; default: break;}//以下代码完成每250ms改变一帧图像tmr++; if (tmr >= 250) //达到250ms时改变一次图片索引{ tmr = 0; index++; if(index >= 32) //图片索引达到32后归零{ index= 0; } } }6、矩阵按键的扫描程序(与注释相对应)#include <reg52.h>sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbitADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED= P1^4; sbit KEY_IN_1 = P2^4; sbit KEY_IN_2= P2^5; sbit KEY_IN_3 = P2^6; sbit KEY_IN_4= P2^7; sbit KEY_OUT_1 = P2^3; sbit KEY_OUT_2= P2^2; sbit KEY_OUT_3 = P2^1; sbit KEY_OUT_4= P2^0;unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; unsigned char KeySta[4][4] = { //全部矩阵按键的当前状态{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}; void main(){ unsigned char i, j; unsigned char backup[4][4] = { //按键值备份,保存前一次的值{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1} }; EA = 1; //使能总中断ENLED = 0; //选择数码管DS1进行显示ADDR3 = 1;ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;TMOD = 0x01; //设置T0为模式1TH0 = 0xFC; //为T0赋初值0xFC67,定时1msTL0 = 0x67;ET0 = 1; //使能T0中断TR0 = 1; //启动T0P0 = LedChar[0]; //默认显示0while (1){ for (i=0; i<4; i++) //循环检测4*4的矩阵按键{ for (j=0; j<4;j++){ if (backup[i][j] != KeySta[i][j]) //检测按键动作{ if (backup[i][j] != 0) //按键按下时执行动作{P0 = LedChar[i*4+j]; //将编号显示到数码管} backup[i][j] = KeySta[i][j]; //更新前一次的备份值 } } } } }/* T0中断服务函数,扫描矩阵按键状态并消抖 */void InterruptTimer0() interrupt 1{ unsigned char i; static unsigned char keyout = 0; //矩阵按键扫描输出索引 static unsigned char keybuf[4][4] = { //矩阵按键扫描缓冲区{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}};TH0 = 0xFC; //重新加载初值TL0 = 0x67; //将一行的4个按键值移入缓冲区keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2; keybuf[keyout][2] =(keybuf[keyout][2] << 1) | KEY_IN_3; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4; //消抖后更新按键状态for (i=0; i<4; i++) //每行4个按键,所以循环4次{ if ((keybuf[keyout][i] & 0x0F) == 0x00){ //连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下KeySta[keyout][i] = 0;} else if ((keybuf[keyout][i] & 0x0F) == 0x0F){ //连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起KeySta[keyout][i] = 1; }}//执行下一次的扫描输出keyout++; //输出索引递增 keyout = keyout & 0x03; //索引值加到4即归零 switch (keyout) //根据索引,释放当前输出引脚,拉低下次的输出引脚{ case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2:KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1;KEY_OUT_4 = 0; break; default: break; } }7、程序注释#include <reg52.h>void ConfigUART(unsigned int baud);void main(){EA = 1; //使能总中断ConfigUART(9600); //配置波特率为9600 while (1);}/* 串口配置函数,baud-通信波特率 */void ConfigUART(unsigned int baud){SCON = 0x50; //配置串口为模式1TMOD &= 0x0F; //清零T1的控制位TMOD |= 0x20; //配置T1为模式2 #include <reg52.h>void ConfigUART(unsigned int baud);void main(){EA = 1; //使能总中断ConfigUART(9600); //配置波特率为9600 while (1);}/* 串口配置函数,baud-通信波特率 */void ConfigUART(unsigned int baud){SCON = 0x50; //配置串口为模式1TMOD &= 0x0F; //清零T1的控制位TMOD |= 0x20; //配置T1为模式2#include <reg52.h>sbit LED = P0^0; sbit ADDR0 = P1^0; sbit ADDR1= P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3;sbit ENLED = P1^4;void main(){ unsigned char cnt = 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; //T0溢出后,清零中断标志TH0 = 0xB8; //并重新赋初值TL0 = 0x00; cnt++; //计数值自加1 if (cnt >= 50) //判断T0溢出是否达到50次{cnt = 0; //达到50次后计数值清零LED = ~LED; //LED取反:0-->1、1-->0 }9、按键扫描#include <reg52.h>sbit ADDR0 = P1^0; sbitADDR1 = P1^1; sbit ADDR2 =P1^2; sbit ADDR3 = P1^3;sbit ENLED = P1^4; sbitKEY1 = P2^4; sbit KEY2 =P2^5; sbit KEY3 = P2^6;sbit KEY4 = P2^7;unsigned char code LedChar[] = { //数码管显示字符转换表 0xC0,0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; bit KeySta = 1; //当前按键状态void main(){ bit backup = 1; //按键值备份,保存前一次的扫描值 unsignedchar cnt = 0; //按键计数,记录按键按下的次数EA = 1; //使能总中断ENLED = 0; //选择数码管DS1进行显示ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;TMOD = 0x01; //设置T0为模式1TH0 = 0xF8; //为T0赋初值0xF8CD,定时2msTL0 = 0xCD;ET0 = 1; //使能T0中断TR0 = 1; //启动T0P2 = 0xF7; //P2.3置0,即KeyOut1输出低电平P0 = LedChar[cnt]; //显示按键次数初值while (1){if (KeySta != backup) //当前值与前次值不相等说明此时按键有动作{if (backup == 0) //如果前次值为0,则说明当前是弹起动作{ cnt++; //按键次数+1 if (cnt >= 10){ //只用1个数码管显示,所以加到10就清零重新开始cnt = 0;}P0 = LedChar[cnt]; //计数值显示到数码管上}backup = KeySta; //更新备份为当前值,以备进行下次比较 } } }/* T0中断服务函数,用于按键状态的扫描并消抖 */void InterruptTimer0() interrupt 1{ static unsigned char keybuf = 0xFF; //扫描缓冲区,保存一段时间内的扫描值TH0 = 0xF8; //重新加载初值TL0 = 0xCD;keybuf = (keybuf<<1) | KEY4; //缓冲区左移一位,并将当前扫描值移入最低位 if (keybuf == 0x00){ //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下KeySta = 0;} else if (keybuf == 0xFF){ //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起KeySta = 1;} else{} //其它情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新 }10、马达转动#include <reg52.h>unsigned long beats = 0; //电机转动节拍总数void StartMotor(unsigned long angle);void main(){EA = 1; //使能总中断TMOD = 0x01; //设置T0为模式1TH0 = 0xF8; //为T0赋初值0xF8CD,定时2msTL0 = 0xCD;ET0 = 1; //使能T0中断TR0 = 1; //启动T0StartMotor(360*2+180); //控制电机转动2圈半 while (1);}/* 步进电机启动函数,angle-需转过的角度 */void StartMotor(unsigned long angle){//在计算前关闭中断,完成后再打开,以避免中断打断计算过程而造成错误EA = 0;beats = (angle * 4076) / 360; //实测为4076拍转动一圈 EA = 1;}/* T0中断服务函数,用于驱动步进电机旋转 */void InterruptTimer0() interrupt 1{ unsigned char tmp; //临时变量static unsigned char index = 0; //节拍输出索引unsigned char code BeatCode[8] = { //步进电机节拍对应的IO控制代码0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6};TH0 = 0xF8; //重新加载初值TL0 = 0xCD;if (beats != 0) //节拍数不为0则产生一个驱动节拍{ tmp = P1; //用tmp把P1口当前值暂存tmp = tmp & 0xF0; //用&操作清零低4位 tmp = tmp |BeatCode[index]; //用|操作把节拍代码写到低4位P1 = tmp; //把低4位的节拍代码和高4位的原值送回P1 index++; //节拍输出索引递增 index = index & 0x07; //用&操作实现到8归零 beats--; //总节拍数-1}else //节拍数为0则关闭电机所有的相{P1 = P1 | 0x0F; } }1. 单片机的三大内部资源是:Flash——程序存储空间。

单片机大报告集终

单片机大报告集终

单片机大报告组员:姓名李小锋学号10907990810姓名吴妍学号10907990826姓名张爽浩学号10907990235姓名秦中娅学号10907990723小组成员所选择的课题:题一:设计一倒计时装置,最大值9999秒。

计时单位为0.1秒,计时的初始值为学号后4位(可以用键盘选择不同成员的学号作为初始值),键盘启动/停止计时。

1、详细的功能说明:计时单位为0.1秒,计时的初始值为学号后4位,设置了五个按键,其中ENTER键用来控制倒计时的开始和停止,而ZUYUAN1、ZUYUAN2、ZUYUAN3、ZUYUAN4四个按键绑定四个组员的学号后四位,当扫描到相应的按键按下,计数初值就是对应的那位小组成员学号的后四位。

2、8051最小系统设计:3、硬件设计:4、程序设计:#include<reg51.h>sbit P1_0=P1^0;//位定义sbit P1_1=P1^1; //位定义sbit P1_2=P1^2; //位定义sbit P1_3=P1^3; //位定义sbit P1_4=P1^4; //位定义sbit P1_5=P1^5; //位定义sbit P1_6=P1^6; //位定义sbit P1_7=P1^7; //位定义sbit P2_0=P2^0; //位定义sbit P2_1=P2^1; //位定义sbit P2_2=P2^2; //位定义sbit P2_3=P2^3; //位定义sbit P2_4=P2^4; //位定义sbit P2_5=P2^5; //位定义sbit P2_6=P2^6; //位定义sbit P2_7=P2^7; //位定义sbit P3_0=P3^0; //位定义sbit P3_1=P3^1; //位定义sbit P3_2=P3^2; //位定义sbit P3_3=P3^3; //位定义sbit P3_4=P3^4; //位定义sbit P3_5=P3^5; //位定义sbit P3_6=P3^6; //位定义sbit P3_7=P3^7; //位定义unsigned char c[5]; // 全局变量unsigned long k;//全局变量unsigned char tick=0;//全局变量void quwei();//函数声明void yanshi_pp()//数码管扫描延时程序{unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<100;j++)}void init_timer0(void)//定时中断函数,20ms的定时计数器{TMOD=0x01;//00000000B,GATE=0,C/T=0,M1,M0=0,定时器0,定时器1工作在16位定时TL0=(-20000)%256;//将计数初值的低八位放入T0的低八位TH0=(-20000)/256;//将计数初值的高八位放入T0的高八位TR0=1;// runET0=1;//允许T0产生中断EA=1;//允许全局中断}void ISR_timer0(void) interrupt 1//定时中断函数,0.1s 的定时计数器,每20ms溢出就进入中断进行取位运算{TL0=(-20000)%256;//将计数初值的低八位放入T0的低八位TH0=(-20000)/256;//将计数初值的高八位放入T0的高八位tick++;if(tick==5){tick=0;//每0.1s计数变量自动清零k--;//每0.1s进行一次单位为0.1s的减记数quwei();//调用取位函数进行数码管的显示}}void quwei()//将五位数一位一位的分离出来{c[4]=k/10000;//将初始化的值的万位分离出来c[3]=k/1000%10;//将初始化的值的千位分离出来c[2]=k/100%10;//将初始化的值的百位分离出来c[1]=k/10%10;//将初始化的值的十位分离出来c[0]=k%10;//将初始化的值的个位分离出来}void main(){unsigned char a[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//定义长度为10的数组,装的是数码管的段码unsigned char b[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};//定义长度为10的数组,装的是数码管的段码P1=0xFF;//数码管消隐,清零init_timer0();//寄存器的初始化{if(P2_0==0&&P2_1==0)//用按键选择成员的学号作为计数的初始值{k=8100;//写入成员的学号作为计数的初始值while(1){P1=0xFE;P3=a[c[4]];yanshi_pp();P1=0xFD;P3=a[c[3]];yanshi_pp();P1=0xFB;P3=a[c[2]];yanshi_pp(); /* 数码管的段扫描以及数码管的位扫描程序*/P1=0xF7;P3=b[c[1]];yanshi_pp();P1=0xEF;P3=a[c[0]];yanshi_pp();if(P2_0==1){ //当检测到P2_0口为高电平的时候,硬件停止减记数,并且清零break;}}}else if(P2_0==0&&P2_2==0)//用按键选择成员的学号作为计数的初始值{k=8260;//写入成员的学号作为计数的初始值while(1){P1=0xFE;P3=a[c[4]];yanshi_pp();P1=0xFD;P3=a[c[3]];yanshi_pp();P1=0xFB;P3=a[c[2]]; /* 数码管的段扫描以及数码管的位扫描程序*/yanshi_pp();P1=0xF7;yanshi_pp();P1=0xEF;P3=a[c[0]];yanshi_pp();if(P2_0==1){ //当检测到P2_0口为高电平的时候,硬件停止减记数,并且清零break;}}}else if(P2_0==0&&P2_3==0)//用按键选择成员的学号作为计数的初始值{k=7230;//写入成员的学号作为计数的初始值while(1){P1=0xFE;P3=a[c[4]];yanshi_pp();P1=0xFD;P3=a[c[3]];yanshi_pp(); /* 数码管的段扫描以及数码管的位扫描程序*/P1=0xFB;P3=a[c[2]];yanshi_pp();P1=0xF7;P3=b[c[1]];yanshi_pp();P1=0xEF;P3=a[c[0]];yanshi_pp();if(P2_0==1){ //当检测到P2_0口为高电平的时候,硬件停止减记数,并且清零break;}}}else if(P2_0==0&&P2_4==0) //用按键选择成员的学号作为计数的初始值{k=2350;//写入成员的学号作为计数的初始值while(1){P3=a[c[4]];yanshi_pp();P1=0xFD;P3=a[c[3]];yanshi_pp();P1=0xFB;P3=a[c[2]]; /* 数码管的段扫描以及数码管的位扫描程序*/yanshi_pp();P1=0xF7;P3=b[c[1]];yanshi_pp();P1=0xEF;P3=a[c[0]];yanshi_pp();if(P2_0==1){ //当检测到P2_0口为高电平的时候,硬件停止减记数,并且清零break;}}}else//当没有检测到按键按下时,进行软件清零,让所有的数码管全部显示为零{P1=0xFE;P3=a[0];yanshi_pp();P1=0xFD;P3=a[0];yanshi_pp();P1=0xFB;P3=a[0];yanshi_pp(); /* 数码管的段扫描以及数码管的位扫描程序*/P1=0xF7;P3=b[0];yanshi_pp();P1=0xEF;P3=a[0];yanshi_pp();}}}调试说明:首先根据题目的要求去写程序,一个模块一个模块的进行仿真和调试,此过程必须学会使用keil中的debug模式功能,当每一个模块分别仿真调试正确后,最后就是进行程序最后的整合和优化,使其满足可以所提出的要求,逐步进行完善和优化。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机1.控制8只led,每1秒闪亮一次,利用定时器实现1秒定时。

2.发光二极管从左向右依次1、3闪亮,2、4闪亮,5、7闪亮,6、8闪亮,中间时间间隔500ms,然后为左四个点亮,600ms后熄灭,右四个点亮,500ms后熄灭,循环上述方式。

3.在P.0端口上接一个发光二极管,发光二极管不停的闪烁,一亮一灭的时间间隔为0.4s(相同意思:闪烁周期为1秒,占空比40%)4.8个发光二极管显示0-200进制值,中间间隔为400ms,循环显示。

5.8个发光二极管,依次点亮从右到左间隔400ms,然后停留2s后熄灭,然后从左到右依次点亮,间隔800ms,然后停留3s后熄灭,停止。

6.将单片机的I/O接口连接到一排发光二极管上,使得这排二极管由中间向两端依次点亮,全亮后,保持2s钟,然后,再由中间向两端熄灭,要求每次动作时间间隔为200ms,重复上述过程。

7.P1接一排二极管上,使一排二极管有两端向中间依次点亮,然后再由两边至中间熄灭,熄灭后保持30秒,再依次循环,要求每次动作间隔0.7s,重复上述方式。

8. P1接一排二极管上,四个一组同时由左到右,点亮持续2s,再由右向左依次熄灭,要求每次动作时间间隔为500ms,重复上述方式。

9. P1接一排二极管上,由低位到高位,第一次前两位闪烁点亮5次,间隔500ms后,轮到下两位闪烁点亮4次,间隔500ms后,轮到下两位闪烁点亮3次,间隔500ms后轮到下两位闪烁点亮2次,间隔500ms,循环上述方式。

10.应用单片机内部定时器T0的工作方式1,输入周期为2s的方波脉冲信号,利用发光二极管显示输出上述位置。

按键+二极管11.连接两个按键,发光二极管全亮,按一个按键时,8个led从左到右熄灭,间隔800ms,按另一个时,8个led从右到左熄灭,间隔600ms。

12.K0按下,流水灯由左向右显示,K1按下,流水灯停止显示。

利用4个独立按键控制led点亮13.主程序执行时,8个led从左到右点亮,当外部中断(按键作为中断源)执行中断,8个led亮灭一次后,左右各四个led同时亮灭,然后执行主程序。

数码管14.数码管循环显示99-00的减1计数(利用定时器完成)。

15.连接电路实现数码管显示b,c,d,E,F,H,然后数码管左移显示,c,d,E,F,H,b,依次循环,两次后再循环右移的,两次后回到原点静止。

数码管+按键16.主程序四个动态数码管显示变量,外部中断0使变量加1,外部中断1使变量减1,初值2345,按键作为中断源。

17.数码管动态显示00,每次按K1键加1,每次按K2键减1,每次按K3键清0,按K4键则显示99。

18.2位数码管为动态显示,4*4矩阵键盘的对应值0-15。

19.数码管显示0000FFFF循环,按1后,停止到当前显示的数值,按2后,从0000FFFF重新开始循环。

数码管+按键+定时器20.数码管0-60s定时按键K1后,时间清零,重新定时,按K2后,时间减10s,继续定时,按K3后,时间加10s,继续定时。

21.主程序数码管显示50,当外部中断0产生后,执行中断子程序,数码管数值每隔1s加1,中断1产生后,停止计时,中断源为按键。

数码管+按键+定时器+蜂鸣器22.数码管初值000,定时器定时,1s加1加到60s时,蜂鸣器响,按K0后蜂鸣器停止。

串口通信23.PC发给单片机0X30,单片机显示0X30,发给PC OK!,并点亮8个发光二极管。

LCD24.LCD1602第一行第3位位置,开始显示test happy!按K1后LCD清屏,按K2后第一行2位置显示hurry up!,第二行2位置显示good luck!25.日,时,分,秒,加点的时间显示26.利用单片机的定时功能制作一个时钟,起始显示时间为12:32:01,用数码管进行显示,设置2个按键,一个清零键,另一个按键当第一次按下时,时钟停止同时发出间歇式响声,再次按下时时钟正常运行,蜂鸣器停止。

27.K1从左向右流水K2从右向左流水K3从左向右逐个点亮K4交替亮灭1S后交替灭亮28.由低到高每次俩个点亮闪烁5次转到下俩个闪烁5次29.led一个闪2次,俩个闪三次…..30.LED显示0--100进制数:31.K1按下,流水从左到右。

K2按下,停止32.利用定时器控制8个led闪烁33.利用6位动态数码管,显示移位数字,独立式按键K1,K2,K3,K4分别表示1,2,3,4按下相应按键,数码管显示相应数值。

每次按下的键值将在最低位(最右侧数码管)显示,同时将原有显示的数值左移。

34.由单片机内部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次,P1口的P1.0-1.7分别接8个发光二极管。

编写程序模拟一时序控制装置。

上电后第一秒钟L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个二极管全亮,第八秒钟全灭,以后又从头开始一直循环下去35.利用线反转扫描矩阵键盘,方法为:同时令四列为0,扫描行线是否有低电平,如有,说明有按键按下,记录下当前的行值,然后,将四行置0,查找按键按下所在的列,记录键值,将键值送显示,显示电路利用数码管动态扫描显示,位选2位数码管显示键值为0-15.36.编制一个循环闪烁的程序,有8个发光二极管,由低位到高位每次每个灯闪烁点亮3次(间隔600ms)后,转到下两位闪烁3次,循环不止。

37.单片机端口所接的8个发光二极管依次从左到右循环点亮,当按键K1按下时,左四位发光二极管点亮,其余熄灭,当按键K2按下时,右四位发光二极管点亮,其余熄灭,当按键K3按下时,8个发光二极管闪烁,时间间隔为500ms。

(备注:当按下按键时,需复位)1-24练习题1:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuint aa=0;void main(void){SP=0X30;EA=1;ET0=1;TR0=1;TMOD=0x01;TH0=15536/256;TL0=15536%256;while(1){}}void yichuzhongduan0() interrupt 1 using 3 //溢出中断0;2015 11 4 {TH0=15536/256;TL0=15536%256;aa++;P0=0;if(aa==20){P0=0xff;aa=0;}}2:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuint aa=0;void main(void){SP=0X30;EA=1;ET0=1;TR0=1;TMOD=0x01;TH0=15536/256;TL0=15536%256;while(1){}}void yichuzhongduan0() interrupt 1using 3 //溢出中断0;2015 11 4{TH0=15536/256;TL0=15536%256;aa++;P0=0;if(aa==10)P0=0x05;if(aa==20)P0=0x0A;if(aa==30)P0=0x50;if(aa==40)P0=0xA0;if(aa==50)P0=0x0f;if(aa==60)P0=0x00;if(aa==70)P0=0xf0;if(aa==80){P0=0x00;aa=0;}}3:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuint aa=0;void main(void){SP=0X30;EA=1;ET0=1;TR0=1;TMOD=0x01;TH0=15536/256;TL0=15536%256;while(1){}}void yichuzhongduan0() interrupt 1using 3 //溢出中断0;2015 11 4{TH0=15536/256;TL0=15536%256;aa++;P0=0;if(aa>=8)P0=0xff;if(aa==20)aa=0;}4:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa=0;void s(uint t);void xianshi();uchar code t[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code wei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; uchar shu[8];uchar h=0; //为什么不能用uint类型?void main(void){SP=0X30;EA=1;ET0=1;TR0=1;TMOD=0x01;TH0=15536/256;TL0=15536%256;while(1){shu[5]=t[h/100];shu[6]=t[h/10%10];shu[7]=t[h%10];xianshi();} }void xianshi() //数码管显示{uchar r;for(r=0;r<8;r++)//先段码后位码{P1=wei[r];P0=shu[r];s(1);}}void s(uint t) //延时函数{uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);//1ms}void yichuzhongduan0() interrupt 1using 3 //溢出中断0;2015 11 4{TH0=15536/256;TL0=15536%256;aa++;if(aa==8){h--;aa=0;}if(h==0)h=200;}5:#include<reg51.h>unsigned char codetable1[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};unsigned char codetable2[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};void main(){unsigned a,b;TMOD=0x10;TH1=15536/256;TL1=15536%256;TR1=1;while(1){if(TF1==1){TF1=0;a++;TH1=15536/256;TL1=15536%256;if(a==8){a=0;b++;P0=table2[b];if(b==8){b=0;a=9;}}if(a==49){a=33;b++;P0=table1[b];if(b==8){b=0;a=50;}}if(a==110){a=0;}}}}6:#include<reg51.h> unsigned char codetable1[]={0x00,0x18,0x3c,0x7e,0xff};unsigned char codetable2[]={0xff,0xe7,0xc3,0x81,0x00};void main(){unsigned a,b;TMOD=0x10;TH1=15536/256;TL1=15536%256;TR1=1;while(1){if(TF1==1){TF1=0;a++;TH1=15536/256;TL1=15536%256;if(a==4){a=0;b++;P0=table1[b];if(b==4){b=0;a=5;}}if(a==45){a=41;b++;P0=table2[b];if(b==4){b=0;a=0;}}}}}7:#include<reg51.h>unsigned char codetable[]={0x00,0x81,0xc3,0xe7,0xff};unsigned char codetable1[]={0xff,0x7e,0x3c,0x18,0x00};void main(){unsigned a,b;TMOD=0x10;TH1=15536/256;TL1=15536%256;TR1=1;while(1){if(TF1==1){TF1=0;a++;TH1=15536/256;TL1=15536%256;if(a==14){a=0;b++;P1=table[b];if(b==4){b=0;a=29;}}if(a==29){a=15;b++;P1=table1[b];if(b==4){b=0;a=30;}}if(a==630){a=0;}}} }8:#include<reg51.h>unsigned char codetable[]={0x00,0x0f,0x1f,0x3f,0x7f,0xff};unsigned char codetable1[]={0xff,0x7f,0x3f,0x1f,0x0f,0x00};void main(){unsigned a,b;TMOD=0x10;TH1=15536/256;TL1=15536%256;TR1=1;while(1){if(TF1==1){TF1=0;a++;TH1=15536/256;TL1=15536%256;if(a==10){a=0;b++;P1=table[b];if(b==5){b=0;a=10;}}if(a==50){a=40;b++;P1=table1[b];if(b==5){b=0;a=0;}}}}}9:#include<reg51.h>unsigned char codetable[]={0x00,0x03,0x0c,0x30,0xc0};void main(){unsigned int a,b,c ;TMOD=0x10;TH1=15536/256;TL1=15536%256;TR1=1;while(1){if(TF1==1){TF1=0;a++;TH1=15536/256;TL1=15536%256;if(a==10){a=0;b++;c++;if(b==1){P0=0x00;}if(b==2){P0=table[1];b=0;}if(c==12){c=0;a=20;}}if(a==20){a=10;b++;c++;if(b==1){P0=0x00;}if(b==2){P0=table[2];b=0;}if(c==10){c=0;a=30;}}if(a==30){a=20;b++;c++;if(b==1){P0=0x00;}if(b==2){P0=table[3];b=0;}if(c==6){c=0;a=40;}}if(a==50){a=40;b++;c++;if(b==1){P0=0x00;}if(b==2){P0=table[4];b=0;}if(c==4){c=0;a=0;}}}}}10.#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit P1_1=P1^1;//一根线接在P1.1口,另一端接在数码管任意一个char i;void main(){TMOD=0x01;TH0=15536/256;TL0=15536%256; //定时50msEA=1;ET0=1;i=0;TR0=1;while(1);}void t0(void) interrupt 1{TH0=15536/256;TL0=15536%256;i++;if(i==20) //1s{P1_1=!P1_1;i=0;}}11.#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit key0=P1^0; //从左到右灭sbit key1=P1^1; //从右到左灭uchar code table1[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//从左到右灭uchar codetable[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//从右到左灭void s(uint t);char i;void main(){while(1){if(key0==0){ s(10);if(key0==0){for(i=0;i<9;i++){ P2=table1[i];s(800);}}}P2=0xff;if(key1==0){s(10);if(key1==0){ for(i=0;i<9;i++){ P2=table[i];s(600);}}}}}void s(uint t){ uint x,y;for(x=0;x<t;x++)for(y=125;y>0;y--);}12#include<reg51.h>#include<intrins.h>sbit fmq=P2^0;sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;unsigned char codetab[]={0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};unsigned char codebs[]={0x0fe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x87f};void Delay10ms(unsigned int c){unsigned char a, b;for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}}}void delay1ms(unsigned char i){unsigned char x;while(i--){for(x=0;x<115;x++);}}void main(){if(key1==0){Delay10ms(10);if(key1==0){P0=0x01;while(1){P0=_crol_(P0,1);Delay10ms(50);if(key2==0){Delay10ms(50);if(key2==0){while(1){P0=P0;}}}}}// while(!key1);}}13#include<reg51.h>#define uchar unsigned char#define uint unsigned intUchar codetable1[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//从左到右依次亮void s(uint t);char i;void main(){ EA=1;EX0=1;IT0=1;while(1){for(i=0;i<10;i++){P2=table1[i];s(500);}}}void int0_0() interrupt 0{P2=0xff;s(100);P2=0x00;s(100);P2=0xf0;s(100);P2=0x0f;}void s(uint t){ uint x,y;for(x=0;x<t;x++)for(y=125;y>0;y--);}14#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar coded[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code w[]={0,1,2,3,4,5,6,7};int shu[8];sbit a=P1^0;sbit b=P1^1;sbit c=P1^2;void Display();void s(uint t);char aa=99;char n;void main(){ EA=1;ET0=1;TMOD=0x01;TH0=15536/256;TL0=15536%256;TR0=1;while(1){ if(aa==0){aa=99;}shu[6]=d[aa/10];shu[7]=d[aa%10];Display();}}void int0_0() interrupt 1{TH0=15536/256;TL0=15536%256;n++;if(n==20){ n=0;aa--;}}void Display() //数码管显示{uchar i;for(i=0;i<8;i++)//先段码后位码{P1=w[i];P2=shu[i];s(2);}}void s(uint t){ uint x,y;for(x=0;x<t;x++)for(y=125;y>0;y--);}15#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid s(uint t) ;void Display();sbit c=P1^2;//定义单个输出口sbit b=P1^1;sbit a=P1^0;uchar code d[]={ 0x7c,0x39,0x5e,0x79,0x71,0x76};uchar code w[]={0,1,2,3,4,5,6,7};uchar shu[8];void main(void){ char i,j,m,k;for(j=0;j<2;j++) //向左移动,循环8次(改变j,就是循环几次){for(i=0;i<8;i++){ k=i+j;if(k>7)k=k-8;shu[i]=d[k];}for(m=0;m<30;m++)Display();}for(j=0;j<2;j++) //向右移动,循环8次(改变j,就是循环几次){for(i=0;i<8;i++){k=i-j;if(k<0)k=k+8;shu[i]=d[k];}for(m=0;m<30;m++)Display();}}void Display() //数码管显示{uchar i;for(i=0;i<8;i++)//先段码后位码{P1=w[i];P2=shu[i];s(2);}}void s(uint t){uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);//1ms}16#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar coded[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code w[]={0,1,2,3,4,5,6,7};int shu[8];sbit a=P1^0;sbit b=P1^1;sbit c=P1^2;void Display();void s(uint t);int aa=2345;char n;void main(){ EA=1;EX0=1;EX1=1;IT0=1;IT1=1;while(1){shu[4]=d[aa/1000];shu[5]=d[aa/100%10];shu[6]=d[aa/10%10];shu[7]=d[aa%10];Display();}}void int0_0() interrupt 0 { aa--;shu[4]=d[aa/1000] ;shu[5]=d[aa/100%10];shu[6]=d[aa/10%10];shu[7]=d[aa%10];Display();}void int0_1() interrupt 2{ aa++;shu[4]=d[aa/1000];shu[5]=d[aa/100%10];shu[6]=d[aa/10%10];shu[7]=d[aa%10];Display();}void Display() //数码管显示{uchar i;for(i=0;i<8;i++)//先段码后位码{P1=w[i];P2=shu[i];s(2);}}void s(uint t){ uint x,y;for(x=0;x<t;x++)for(y=125;y>0;y--);}17#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar coded[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code w[]={0,1,2,3,4,5,6,7};int shu[8];sbit a=P1^0;sbit b=P1^1;sbit c=P1^2;//定义位选void Display();void s(uint t);sbit key0=P0^0;sbit key1=P0^1;sbit key2=P0^3;sbit key3=P0^4;//定义四个按键int aa=0;char n;void main(){while(1){ if(key0==0){s(10);if(key0==0){aa++;while(!key0);}}if(key1==0){s(10);if(key1==0){aa--;while(!key1);}}if(key2==0){s(10);if(key2==0){aa=0;while(!key2);}}if(key3==0){s(10);if(key3==0){aa=99;while(!key3);}}shu[6]=d[aa/10];shu[7]=d[aa%10];Display();}}void Display() //数码管显示{uchar i;for(i=0;i<8;i++)//先段码后位码{P1=w[i];P2=shu[i];s(2);}}void s(uint t){ uint x,y;for(x=0;x<t;x++)for(y=125;y>0;y--);}18#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid s(uint t) ;void Display();sbit c=P1^2;//定义单个输出口sbit b=P1^1;sbit a=P1^0;uchar coded[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-15数码管uchar code w[]={0,1,2,3,4,5,6,7};uchar shu[8];void main(void){ uchar e,r;while(1) //按键函数{P2=0x0f;if(P2!=0x0f){s(10);if(P2!=0x0f){P2=0x7f; //扫描第一行e=P2;switch(e){case(0x77):r=0;break;case(0x7b):r=1;break;case(0x7d):r=2;break;case(0x7e):r=3;break;default:break;}P2=0xbf; //扫描第二行e=P2;switch(e){ case(0xb7):r=4;break;case(0xbb):r=5;break;case(0xbd):r=6;break;case(0xbe):r=7;break;default:break;}P2=0xdf; //扫描第三行e=P2;switch(e){ case(0xd7):r=8;break;case(0xdb):r=9;break;case(0xdd):r=10;break;case(0xde):r=11;break;default:break;}P2=0xef; //扫描第四行e=P2;switch(e){ case(0xe7): r=12;break;case(0xeb):r=13;break;case(0xed):r=14;break;case(0xee):r=15;break;default:break;}}}shu[6]=d[r];shu[7]=d[r];Display();}}void Display() //数码管显示{uchar i;for(i=0;i<8;i++)//先段码后位码{P1=w[i];P0=shu[i];s(2);}}void s(uint t){uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);//1ms}19:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit k1=P2^1;sbit k2=P2^2;void s(uint t);void xianshi();uchar codea[16]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar codet[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar codewei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};uchar shu[8],aa;uchar h=1,i;void main(void){shu[0]=t[0];shu[1]=t[0];shu[2]=t[0];shu[3]=t[0];shu[4]=t[15];shu[5]=t[15];shu[6]=t[15];shu[7]=t[15];while(1){ while(h){aa=shu[0];shu[0]=shu[1];shu[1]=shu[2];shu[2]=shu[3];shu[3]=shu[4];shu[4]=shu[5];shu[5]=shu[6];shu[6]=shu[7];shu[7]=aa;for(i=0;i<10;i++){s(2);xianshi();}if(k1==0){s(10);if(k1==0)h=0;}}if(k2==0){shu[0]=t[0];shu[1]=t[0];shu[2]=t[0];shu[3]=t[0];shu[4]=t[15];shu[5]=t[15];shu[6]=t[15];shu[7]=t[15];h=1;xianshi();}xianshi();}}void xianshi(){ uchar r;for(r=0;r<8;r++){P1=wei[r];P0=shu[r];s(2);}}void s(uint t){ uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++); }20:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa=0;sbit k1=P2^1;sbit k2=P2^2;sbit k3=P2^3;void s(uint t);void xianshi();uchar codet[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar codewei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};uchar shu[8];uchar h=0;void main(void){SP=0X30;EA=1;ET0=1;TR0=1;TMOD=0x01;TH0=15536/256;TL0=15536%256;while(1){shu[5]=t[h/100];shu[6]=t[h%100/10];shu[7]=t[h%10];xianshi();if(k1==0){s(10);if(k1==0)while(!k1);h=0; }if(k2==0){s(10);if(k2==0)while(!k2);h=h+10;}if(k3==0){s(10);if(k3==0)while(!k3);h=h-10;}if(h>=60||h<=0)h=0;}}void xianshi(){uchar r;for(r=0;r<8;r++){P1=wei[r];P0=shu[r];s(1);}}void s(uint t){uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);}void yichuzhongduan0() interrupt 1using 3{TH0=15536/256;TL0=15536%256;aa++;if(aa==20){h++;aa=0;}}21:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa=0;void s(uint t);void xianshi();uchar code t[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code wei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};uchar shu[8]; uchar h=50;void main(void){SP=0X30;EA=1;ET0=1;EX0=1; //P3.2EX1=1; //P3.3PX1=1;TMOD=0x01;TH0=15536/256;TL0=15536%256;while(1){shu[5]=t[h/100];shu[6]=t[h%100/10];shu[7]=t[h%10];xianshi();}}void xianshi(){uchar r;for(r=0;r<8;r++){P1=wei[r];P0=shu[r];s(1);}}void s(uint t){uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);}void yichuzhongduan0() interrupt 1using 3{TH0=15536/256;TL0=15536%256;aa++;if(aa==20){h++;aa=0;}}void waibuzhongduan0() interrupt 0using 1{ TR0=1;}void waibuzhongduan1() interrupt 2using 2{TR0=0;}22:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa=0;sbit r=P1^5;sbit k0=P2^7;void s(uint t);void xianshi();uchar codet[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar codewei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};uchar shu[8];uchar h=0;void main(void) {SP=0X30;EA=1;ET0=1;TR0=1;TMOD=0x01; TH0=15536/256; TL0=15536%256; while(1){shu[5]=t[0];shu[6]=t[h/10]; shu[7]=t[h%10];xianshi();if(h==60){TR0=0;r=1;s(1);r=0;s(1);if(k0==0){TR0=1;h=0;}}}}void xianshi() {uchar r;for(r=0;r<8;r++){P1=wei[r];P0=shu[r];s(1);}}void s(uint t){uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);//1ms}void yichuzhongduan0() interrupt 1using 3{TH0=15536/256;TL0=15536%256;aa++;if(aa==20){h++;aa=0;}}23:#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar aa=0;void s(uint t);void xianshi();uchar codet[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar codewei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};uchar shu[8],a;uchar chuan[]="OK!";uint h=0,i;void main(void){ SP=0X30;TMOD=0x20;SCON=0x50;PCON=0x80;TH1=0xf3; //T1控制比特率TL1=0xf3;TR1=1;EA=1;ES=1;while(1){if(a==0x30){ for(i=0;i<200;i++){shu[6]=t[a/16];shu[7]=t[a%16];xianshi(); }for(i=0;i<3;i++){SBUF=chuan[i];while(!TI);TI=0;a=0; }for(i=0;i<60000;i++)P0=0xff;}shu[6]=t[a/16];shu[7]=t[a%16];xianshi();}}void xianshi(){ uchar r;for(r=0;r<8;r++){P0=0;P1=wei[r];P0=shu[r];s(1);}}void s(uint t) //延时函数{ uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);//1ms}void shujuzhongduan0() interrupt 4 using 2 //传输中断;2015 11 4 {if(RI==1){RI=0;a=SBUF;}}24:#include<reg51.h>#define uchar unsigned char#define uint unsigned int #include"lcd.h"sbit K1=P2^1;sbit K2=P2^2;void s(uint t);unsigned char PuZh[]="test happy!";unsigned char PuZh1[]="hurry up!";unsigned char PuZh2[]="goodluck!";void main(void){unsigned char i;LcdInit();LcdWriteCom(0x83);for(i=0;i<11;i++){LcdWriteData(PuZh[i]);}while(1){if(K1==0){s(10);if(K1==0){LcdWriteCom(0x01);} }if(K2==0){s(10);if(K2==0){LcdWriteCom(0x82);for(i=0;i<9;i++){LcdWriteData(PuZh1[i]);}LcdWriteCom(0xc2);for(i=0;i<10;i++){LcdWriteData(PuZh2[i]);}} }}}void s(uint t) //延时函数{uint x,y;for(y=0;y<t;y++)for(x=0;x<120;x++);//1ms}.(25)日,时,分,秒,加点的时间显示#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit P1_0=P1^0;uint ri,shi,fen,miao;uchar coded[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code w[]={0,1,2,3,4,5,6,7};uint a=0;uchar shu[8];void s(int t);void Display();void main(void){TMOD=0x01;EA=1;ET0=1;SP=0x30;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;while(1){ shu[0]=d[ri/10];shu[1]=0x80+d[ri%10];shu[2]=d[shi/10];shu[3]=0x80+d[shi%10];shu[4]=d[fen/10];shu[5]=0x80+d[fen%10];shu[6]=d[miao/10];shu[7]=0x80+d[miao%10];Display();}}void int00() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a++;if(a==20){a=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;ri++;}}}}}void s(int t){int i,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}void Display() //数码管显示{uchar i;for(i=0;i<8;i++)//先段码后位码{P1=w[i];P0=shu[i];s(2);}}(26)利用单片机的定时功能制作一个时钟,起始显示时间为12:32:01,用数码管进行显示,设置2个按键,一个清零键,另一个按键当第一次按下时,时钟停止同时发出间歇式响声,再次按下时时钟正常运行,蜂鸣器停止。

相关文档
最新文档