单片机最终完整版
- 格式:doc
- 大小:127.00 KB
- 文档页数:28
通灯设计交通灯设计方案: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.专业.整理.。
安徽工业大学继续学院《单片机原理》期末课程设计题目:单片机计时时钟设计与制作专业:电气工程及其自动化班级: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的位数也越来越高,已能将所有主要部件都集成在一块芯片上,使其应用模式多、范围广,并具有以下特点:①体积小,功耗低,价格便宜,重量轻,易于产品化。
②控制功能强,运行速度快,能针对性地解决从简单到复杂的各类控制问题,满足工业控制要求,并有很强的位处理和接口逻辑操作等多种功能。
目录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。
指令中常用符号说明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液晶以及单片机的最小系统等等。
件CONTENTS •课件概述•单片机基础知识•单片机内部结构与工作原理•单片机指令系统与程序设计•单片机外部扩展技术及应用•单片机接口技术及应用•单片机通信技术及应用课件概述01课件内容与目标内容涵盖单片机基本原理、架构、指令系统、编程语言、开发工具及典型应用等方面知识。
目标培养学生掌握单片机系统开发的基本技能,具备独立设计单片机应用系统的能力。
课件结构与安排结构按照由浅入深、循序渐进的原则,分为基础篇、提高篇和应用篇三个部分。
安排基础篇主要介绍单片机的基本概念和原理;提高篇着重讲解单片机的指令系统和编程语言;应用篇则通过实例分析,介绍单片机的典型应用和开发流程。
学习方法与建议学习方法建议采用理论与实践相结合的学习方式,通过实验和课程设计等环节加深对单片机原理及应用的理解。
学习建议在学习过程中,应注重培养自己的逻辑思维能力和动手能力,多思考、多实践,不断提高自己的单片机应用水平。
同时,还应积极参加各种科技竞赛和实践活动,锻炼自己的团队协作和创新能力。
单片机基础知识02单片机概述单片机的定义单片机是一种集成电路芯片,它采用超大规模集成电路技术,将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM等功能集成到一块硅片上,构成一个小而完善的微型计算机系统。
单片机的基本组成单片机主要由运算器、控制器、存储器和输入输出设备等部分组成,其中运算器和控制器是单片机的核心部件。
早期的单片机功能相对简单,主要用于控制领域,如Intel公司的8048、8051等。
随着技术的发展,现代单片机功能越来越强大,集成了更多的外设接口和通信接口,如ARM公司的ARM7、ARM9等。
未来单片机将更加注重低功耗、高性能、高集成度和智能化等方向的发展。
早期单片机现代单片机未来单片机发展趋势单片机发展历程单片机广泛应用于工业自动化控制系统中,如温度控制、压力控制、流量控制等。
工业控制领域单片机在智能仪表中也有着广泛的应用,如电能表、水表、燃气表等。
单片机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个按键,一个清零键,另一个按键当第一次按下时,时钟停止同时发出间歇式响声,再次按下时时钟正常运行,蜂鸣器停止。