单片机仿真图及程序

合集下载

基于单片机的光控路灯设计含程序和仿真图

基于单片机的光控路灯设计含程序和仿真图

机电工程系课程设计报告题目: 光控路灯专业:___应用电子技术______ 班级:___应电(1)班_______ 学号:___100601****_________ 姓名:____潘某某____________ 指导老师:____某某某___________ 答辩日期:___2012年6月6号___目录一、绪论 (3)二、对本课程设计的分析 (4)2.1所需的软硬件 (4)2.2工作原理 (4)三、主要电路模块的实现方案比较及选择 (5)3.1光敏电阻感应模块与AD/DA转换模块 (5)3.2IIC总线模块 (6)3.3LED灯与数码管显示模块 (7)3.4单片机最小系统模块 (9)四、系统电路图 (10)五、系统的软件设计 (12)六、结论 (13)七、课程设计过程中遇到的主要问题以及解决办法 (13)八、心得体会 (14)九、附件 (15)一、绪论随着社会的发展,路灯已经成为一个城市的照明系统中不可分割的一部分,在城市照明中发挥着举足轻重的作用,而其所依靠的就是路灯自动化控制系统。

但当前大多采用的是定时的路灯自动化控制系统。

其通常都是采用全夜式开启路灯的自动化控制系统。

但因为夏天跟冬天因为天亮与天黑的时差颇大,使得夏天晚上过早的路灯就开启,早上又过晚的关闭。

且世界奇观这么多,偶尔总会出现点极端的天气状况,会造成白天天过黑、夜晚又如白昼般亮的情况(如日全食等),而路灯又不会自动开启或者关闭,这就使得交通事故的发生概率增大,路灯在这种情况下失去了其应有的价值和意义也造成能源的白白浪费。

而且现在路灯已经全球基本普及,大到世界有名的大城市,小到小城镇、小乡村都已经有了路灯,可想而知世界能源在这块的浪费上是多么的巨大。

光控路灯不仅可以解决这类问题,还可以使路灯在有需要的时候自动开启或者关闭,避免了路灯在不需要的时候自动开启或者关闭。

大大的避免了能源不必要的浪费,对于地球环保和能源的节约,可以起到巨大的作用。

15系列单片机仿真步骤

15系列单片机仿真步骤

15单片机仿真步骤仿真是为了实时监控单片机的内部运行状态,在进行程序调试时,不可避免的会出现一些错误,但是单从程序我们无法发现错误所在,用软件模拟仿真同样可以达到同样的目的,那么这是我们就需要用到硬件仿真了。

具体仿真操作步骤如下(编程软件为Keil,烧写软件为STC-ISP,特别注意STC-ISPV6.36及以上版本方才支持仿真功能):1、下载keil和STC-ISPV6.36或以上版本进行安装。

2、由于下载软件和烧写软件为两款不同的软件,故需要将两个软件进行关联。

打开STC-ISP进行如下操作。

3、点击“keil仿真设置”(部分低版本的STC-ISP是“keil关联设置”)4、点击“添加型号和头文件到keil中添加STC仿真器驱动到keil中”(将鼠标放在该按钮上有具体添加步骤,如上图)。

选定keil的安装路径,点击确定。

5、在keil中打开工程文件,或新建工程文件,确保工程设置的芯片型号与实际型号一致。

6、打开optionfortarget选项卡,如上图1;选择Device选项卡,选择STCMCUDatabase,如上图2;选择对应的单片机型号(这里15w4k58s4为例,由于没有该单片机的MCU型号,选择最接近的15w4k32s4),如图3;点击ok确定,如图4.7、在Dubeg选项卡中选择仿真模式,选择Use模式,如图1;在下拉选项中选择STCMonitor-51 Driver,如图28、点击“setting”按钮出现串口配置窗口,如上图,将Com设置为单片机的连接的COM(COM口的查询方式见注释一),波特率设置一个相对稳定的值,没有特别要求。

点击ok设置完毕。

9、将hex文件导入STC-ISP中点击“将IAP15w4k58s4设置为仿真芯片”如上图。

10、此时会出现如上图所示提示,此时冷启动单片机进行程序的烧写,直至提示成功。

11、点击Dubeg图标进入仿真。

至此所有仿真设置全部设置完毕。

单片机课程设计密码锁程序和仿真图

单片机课程设计密码锁程序和仿真图

#include<at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10; //开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=-1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0}; //原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40 }; //段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z>0;z--)for(y=120;y>0;y--);}void setpw() //设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count<6) //六位密码,所以COUNT<6{if(set==0) //设置密码键没有按下时pwx[count]=num; //存储按下的数字elsepws[count]=num; //设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count<6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e: //设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//......workbuf[2]=0x00;//......workbuf[3]=0x00;workbuf[4]=0x00;workbuf[5]=0x00;//......count=-1; //按键计数复位为-1if(count<6) //密码没有设置完,继续设置密码{setpw(); //设置密码}}break;}while(temp!=0xf0) //按键抬起检测{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xed:{num=4;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdd:{num=5;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbd:{num=6;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xeb:{num=1;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdb:{num=2;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbb:{num=3;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xd7:{num=0;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xe7: num=20;break; //确定键按下检测case 0x77: //复位键或者输入密码全部一次删除{P1_1=0; //锁关P1_3=1; //密码设置指示灯灭set=0; //不设置密码num=10; //num复位count=-1; //COUNT复位workbuf[0]=tabledu[10]; //第一位数码管不显示workbuf[1]=tabledu[10]; //第二位数码管不显示workbuf[2]=tabledu[10];workbuf[3]=tabledu[10];workbuf[4]=tabledu[10];workbuf[5]=tabledu[10]; //......P1_0=1; //锁关}break;case 0xb7: //输入密码删除键(一位一位删除){count--;workbuf[count]=0x00; //因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count--; //因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减if(count<=-1)count=-1;}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return(num);}void init() //利用定时显示数码管{TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;}bit compare() //密码比较函数{if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pw x[5]==pws[5]))rightflag=1;elserightflag=0;return(rightflag);}void main(){uint i,j;init();P0=0;P1_1=0; //锁关while(1){keyscan();if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键){if(count==6){if(set==1) //修改密码确定{P1_3=1;workbuf[0]=0;workbuf[1]=0;workbuf[2]=0;workbuf[3]=0;workbuf[4]=0;workbuf[5]=0;}else//输入密码确定{set=0;compare();if(rightflag==1) //如果密码正确{P1_0=0; //锁开P1_1=1;workbuf[0]=tabledu[8]; //数码管第一位显示"8"workbuf[1]=tabledu[8]; //数码管第二位显示"8"workbuf[2]=tabledu[8];workbuf[3]=tabledu[8];workbuf[4]=tabledu[8];workbuf[5]=tabledu[8]; //......}else{P1_1=0; //锁仍然是关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71; //......for(i=0;i<1000;i++) //密码错误报警{for(j=0;j<80;j++);Beep=~Beep;}break;}}}else//若输入的密码位数不为位时{P1_1=0; //锁仍然关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71;for(i=0;i<1000;i++){for(j=0;j<80;j++);Beep=~Beep;}break;}}}}void timer0() interrupt 1 //显示数码管{uchar i;TH0=(65536-500)/200; TL0=(65536-500)%200; for (i=0;i<6;i++) { P0=workbuf[i]; P2=tablewe[i]; delay(5); P0=0;}}XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-812365489=7+CONABCD1243D2LED-RED锁开锁关LS1SOUNDERD3LED-BLUE设置密码指示灯R11kR21kR310KR410K+12VQ3TIP127Q4TIP127Q18050Q28050Q5TIP122Q6TIP122+88.8Amps+88.8Amps+88.8Volts。

仿真单片机c语言程序设计实训100例 基于pic proteus仿真

仿真单片机c语言程序设计实训100例 基于pic proteus仿真

仿真单片机c语言程序设计实训100例基于pic proteus
仿真
单片机上使用C语言进行程序设计的基本步骤和要点:
1. **理解硬件**:在开始编程之前,你需要对单片机的硬件有深入的理解。

这包括它的内存结构,输入/输出端口,以及任何特定的硬件特性。

2. **选择开发环境**:有很多可用的单片机开发环境,如Keil、IAR Embedded Workbench等。

这些环境都支持C语言编程,并且提供了编译、调试等功能。

3. **编写代码**:在理解了硬件和开发环境之后,就可以开始编写代码了。

这可能包括配置IO端口,读写内存,以及控制单片机的各种功能。

4. **编译代码**:在大多数开发环境中,你都可以直接编写和编译代码。

编译过程会将你的C代码转换成单片机可以执行的机器码。

5. **调试代码**:这是整个开发过程中最重要的一步。

你可以使用开发环境提供的调试工具来检查你的代码是否按照预期工作。

这可能包括查看变量的值,单步执行代码,以及使用断点等。

6. **仿真和测试**:在真实硬件上测试代码之前,你可以使用仿真软件(如Proteus)来模拟你的代码的行为。

这可以帮助你发现和修复一些在真实硬件上可能无法发现的错误。

7. **在真实硬件上测试**:最后,当你的代码在仿真环境中运行正常后,你就可以将其烧录到真实硬件上进行了。

以上就是在单片机上使用C语言进行程序设计的基本步骤和要点。

不过请注意,由于具体的硬件和开发环境可能会有所不同,因此具体的步骤可能会有所不同。

用Proteus仿真单片机的方法

用Proteus仿真单片机的方法

用PROTEUS对单片机进行仿真实例Proteus软件是英国Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB 的设计; ISIS模块用来完成电路原理图的布图和仿真。

它可以进行模拟电路仿真、数字电路仿真,也可以进行单片机及其外围电路组成的系统的仿真;软件提供了各种虚拟仪器,如示波器、逻辑分析仪、信号发生器、电压表、电流表等。

和其它仿真软件相比,Proteus ISIS最大特色是对单片机系统的仿真,目前支持的单片机类型有: 68000系列、8051系列、ARM系列、AVR系列、PIC系列、Z80系列、HC11系列等。

本文主要介绍Proteus软件在单片机方面的仿真功能,即ISIS模块的用法。

在单片机学习开发的过程中,程序的调试是一个很重要的环节,要安装电路进行实验,而且电路在调试过程中往往要进行调整和改变,这不紧增加了费用和难度,而且也影响了学习和开发的进度,这也成了一些初学者学习的障碍。

如果使用Proteus 软件就可以大大节省时间和开发费用,可以在软件仿真通过后再制作印刷电路板进行电路实验。

一、Proteus ISIS软件的工作环境和一些基本使用方法下面通过一个流水灯的实例来说明Proteus的基本使用方法,使用的软件版本是Proteus.Professional 7.1 SP2。

流水灯使用AT89C51单片机,用P2口作输出口。

先在Keil uVision编译器中输入下列程序:#include <reg51.h>void Delay1ms(unsigned int count)//延时子程序{unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}main() //主程序{unsigned char LEDIndex = 0;bit LEDDirection = 1;while(1){if(LEDDirection)P2 = ~(0x01<<LEDIndex);elseP2 = ~(0x80>>LEDIndex);if(LEDIndex==7)LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%8;Delay1ms(200);}}将上述程序编译生成目标文件LED.hex。

单片机仿真件Keil C51软件的使用教程(中文版)

单片机仿真件Keil C51软件的使用教程(中文版)

单片机仿真软件Keil C51软件的使用教程(中文版)keil uvision2 C51软件是目前功能最强大的单片机c语言集成开发环境,本软件及视频教程可以本站下载。

下面我们通过图解的方式来Keil C51软件的使用教程,学习最简单的,如何输入源程序→ 新建工程→ 工程详细设置→ 源程序编译得到目标代码文件。

第一步:双击Keil uVision2的桌面快捷方式(图1),启动Keil集成开发开发软件。

软件启动后的界面如图2所示。

图1:启动Keil uVision2单片机集成开发环境图2:软件启动后的界面第二步:新建文本编辑窗。

点击工具栏上的新建文件快捷按键,即可在项目窗口的右侧打开一个新的文本编辑窗,见图3所示。

图3:新建文本编辑窗第三步:输入源程序。

在新的文本编辑窗中输入源程序,可以输入C语言程序,也可以输入汇编语言程序,见图4。

图4:输入源程序第四步:保存源程序。

保存文件时必须加上文件的扩展名,如果你使用汇编语言编程,那么保存时文件的扩展名为“.asm”,如果是C语言程序,文件的扩展名使用“*.C ”。

图5:保存源程序注:第3步和第4步之间的顺序可以互换,即可以先输入源程序后保存,也可以先保存后输入源程序。

第五步:新建立Keil工程。

如图6所示,点击 "工程" → "新建工程" 命令,将出现保存对话框(图7)。

图6:新建工程图7:保存工程对话框在保存工程对话框中输入你的工程的文件名,Keil工程默认扩展名为".uv2",工程名称不用输入扩展名(见图7),一般情况下使工程文件名称和源文件名称相同即可,输入名称后保存,将出现"选择设备"对话框(图8),在对话框中选择CPU的型号。

第六步:选择CPU型号。

如图8所示,为工程选择CPU型号,本新建工程选择了ATMEL公司的AT89C51单片机。

图8:选择CPU型号对话框第七步:加入源程序到工程中。

Proteus单片机仿真实验内容

Proteus单片机仿真实验内容

实验1 PROTUES环境及LED闪烁实验1.实验任务做一个闪烁灯:在P1.0端口上接一个发光二极管D1,使D1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒,重复循环。

2.电路原理图3.程序设计内容(1)延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大多是微秒级。

实验要求的闪烁时间间隔为0.2秒,所以在执行某一指令时,需要插入延时程序,来达到实验的要求。

延时子程序如下:DELAY: MOV R5, #20D1: MOV R6, #20D2: MOV R7, #248DJNZ R7, $DJNZ R6, D2DJNZ R5, D1RET(2)输出控制如上图所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

实验2 外部中断实验1.实验任务设计一个交通灯正常工作程序,并在有意外情况发生的情况下,能自动中断进入到中断服务程序运行,进行紧急事故处理,处理完成后能回到正常工作程序继续运行。

如原理图所示,P1接一位数码管用于显示时间,P2端口接东西方向和南北方向红绿灯,P3.2接一个按钮用于模拟一个外部中断源,当正常工作时,东西方向绿灯亮8秒,然后南北方向绿灯亮9秒;当模拟中断源发出中断信号时,东西和南北红灯亮5秒后返回正常工作程序。

(注:这里数码管选用了共阳极的数码管)数码管的段选码如下表所示:2.电路原理图3.程序设计内容(1)从proteus库中选取元器件:单片机AT89C51、磁片电容CAP、电解电容CAP-ELEC,晶振CRYSTAL、电阻RES、数码管7SEG-COM-CAT-GRN,按钮BUTTON,发光二极管等。

(2)设计延时程序。

实验3 T0波形发生器实验1.实验任务(1)首先用AT89C51单片机定时器/计数器0的定时功能构成一方波发生器,实现周期为400us的方波输出,如图所示,P3.5,p3.7是两个波形输出端,分别输出反相波形,两路波形输入虚拟示波器的A通道和B通道,用示波器观察方波的周期是否是400us。

《单片机Proteus仿真C51参考程序实验》

《单片机Proteus仿真C51参考程序实验》

1 2 3 4 5 6 7 8
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C51 CLOCK=12MHz
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
2.在 Keil 环境下建立源程序并保存为.C 文件,生成.HEX 文件;
参考程序如下:
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int
void delay_ms(uint x) {
uchar t;while(x--)for(t=0;t<120;t++); }
班级:
学号:
姓名
void main() {
uchar i,j=0x01; while(1) {
P2=j; j=_crol_(j,1); delay_ms(100); } } 将以上程序补充完整,流水时间间隔为 100ms。 3.将.HEX 文件导入仿真图,运行并观察结果;
2.在 Keil 环境下建立源程序并保存为.C 文件,生成.HEX 文件;
参考程序如下:
#include<reg51.h>
班级:
学号:
姓名
#include<intrins.h> #define uchar unsigned char #define uint unsigned int void delay_ms(uint x) {

单片机仿真器和仿真环境

单片机仿真器和仿真环境

单片机基本原理,如何使用DX516 仿真器,如何编程点亮和灭掉一个LED 灯,如何进入KEILC51uV调试环境,如何使用单步,断点,全速,停止的调试方法单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需要学习单片机。

可以说,掌握了单片机开发,就多了一个饭碗。

51 单片机已经有30 多年的历史了,在中国,高校的单片机课程大多数都是51,而51 经过这么多年的发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。

而国内书店的单片机专架上,也大多数都是51 系列。

可以预见,51 单片机在市场上只会越来越多,功能只会越来越丰富,在可以预见的数十年内是不可能会消失的。

作为一个初学者,如何单片机入门?需要那些知识和设备呢?知识上,其实不需要多少东西,会简单的C 语言,知道51 单片机的基本结构就可以了。

一般的大学毕业生都可以快速入门,自学过这2 门课程的高中生也够条件。

就算你没有学过单片机课程,只掌握了C 语言的皮毛,通过本系列的教程,您也会逐渐的进入单片机的大门。

当然在学习的过程中,您还是必须多去研读单片机书籍,了解他们的基本结构及工作方式。

下面以51 为例来了解一下单片机是什么东西,控制原理又是什么?在数字电路中,电压信号只有两种情况,高电平和低电平,用数字来记录就是1 和0。

单片机内部的CPU,寄存器,总线等等结构都是通过1 和0 两种信号来运作的,数据也是以1 或者0 来保存的。

单片机的输入输出管脚,也就是IO 口,也是只输出或识别1 和0 两种信号,也就是高电平和低电平。

当单片机输出一个或一组电平信号到IO 口后,外部的设备就可以读到这些信号,并进行相应操作,这就是单片机对外部的控制。

当外部一个或一组电平信号送到单片机的IO 口时,单片机也可以读到这些信号,并进行分析操作,这就是单片机对外部设备信号的读取。

当然实际的操作中,这些信号可能十分复杂,必须严格地按照规定的时间顺序(时序)输入输出。

单片机原理与应用-基于实例驱动和Proteus仿真

单片机原理与应用-基于实例驱动和Proteus仿真

使用虚拟信号发生器产生各种测 试信号,用于验证电路功能和性 能。
联合调试技巧与经验分享
硬件连接检查
调试顺序
调试工具使用
经验积累与分享
在进行联合调试前,务必检 查硬件连接是否正确、可靠, 避免因此导致的调试失败。
遵循先硬件后软件、先局部 后整体的调试顺序,逐步缩 小问题范围,提高调试效率。
熟练掌握调试工具的使用技 巧,如断点设置、变量观察、 内存检查等,以便更好地分 析和解决问题。
单片机原理与应用-基于实例驱动 和proteus仿真
contents
目录
• 单片机概述与基本原理 • Proteus仿真软件介绍 • 基于实例驱动的单片机应用开发 • Proteus在单片机应用中的高级技巧 • 实验环节:基于Proteus的单片机应用
开发实践 • 总结与展望
01 单片机概述与基本原理
不同闪烁模式。
硬件组成
单片机、LED灯、电阻。
仿真验证
在Proteus软件中搭建电路,将编写好的 程序下载到单片机中,观察LED灯的闪烁 效果是否符合设计要求。
实例二:数码管显示驱动
设计目标
硬件组成
软件编程
仿真验证
通过单片机驱动数码管显示 数字或字符。
单片机、数码管、电阻。
使用C语言或汇编语言编写程 序,将需要显示的数字或字 符转换为对应的段选码和位 选码,通过单片机的IO口输
智能化发展
结合人工智能、机器学习等技术,未来的单片机将具备更 强的智能化功能,能够实现更加复杂的控制和应用。
物联网应用
物联网技术的快速发展将为单片机提供更广阔的应用空间 ,单片机将作为物联网终端设备的核心控制器,实现设备 间的互联互通和智能化管理。

单片机:密码锁仿真图+原理图+PCB电路图

单片机:密码锁仿真图+原理图+PCB电路图

单片机密码锁课程设计仿真图原理图部分图代码#include <REG51.h>#include<intrins.h>#define LCM_Data P0#define uchar unsigned char#define uint unsigned int#define w 6 //定义密码位数sbit lcd1602_rs=P2^5;sbit lcd1602_rw=P2^6;sbit lcd1602_en=P2^7;sbit Scl=P3^4; //24C02串行时钟sbit Sda=P3^5; //24C02串行数据sbit ALAM = P2^1; //报警sbit KEY = P3^6; //开锁sbit open_led=P2^2; //开锁指示灯bit operation=0; //操作标志位bit pass=0; //密码正确标志bit ReInputEn=0; //重置输入充许标志bit s3_keydown=0; //3秒按键标志位bit key_disable=0; //锁定键盘标志unsigned char countt0,second; //t0中断计数器,秒计数器void Delay5Ms(void);unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};//控盘扫描控制表unsigned char code start_line[] = {"password: "}; unsigned char code name[] = {"===Coded Lock==="};//显示名称unsigned char code Correct[] = {" correct "};//输入正确unsigned char code Error[] = {" error "};//输入错误unsigned char code codepass[] = {" pass "}; unsigned char code LockOpen[] = {" open "};//OPENunsigned char code SetNew[] = {"SetNewWordEnable"}; unsigned char code Input[] = {"input: "};//INPUTunsigned char code ResetOK[] = {"ResetPasswordOK "};unsigned char code initword[] = {"Init password..."};unsigned char code Er_try[] = {"error,try again!"};unsigned char code again[] = {"input again "};unsigned char InputData[6];//输入密码暂存区unsigned char CurrentPassword[6]={1,3,1,4,2,0};//当前密码值unsigned char TempPassword[6];unsigned char N=0; //密码输入位数记数unsigned char ErrorCont; //错误次数计数unsigned char CorrectCont; //正确输入计数unsigned char ReInputCont; //重新输入计数unsigned char code initpassword[6]={0,0,0,0,0,0};//=====================5ms延时==============================void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//===================400ms延时==============================void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}//=============================================================================================//================================24C02========================================================//=============================================================================================void mDelay(uint t) //延时{uchar i;while(t--){for(i=0;i<125;i++){;}}}void Nop(void) //空操作{_nop_();_nop_();_nop_();_nop_();}/*起始条件*/void Start(void){Sda=1;Scl=1;Nop();Sda=0;Nop();}/*停止条件*/void Stop(void){Sda=0;Scl=1;Nop();Sda=1;Nop();}/*应答位*/void Ack(void){Sda=0;Nop();Scl=1;Nop();Scl=0;}/*反向应答位*/void NoAck(void){Sda=1;Nop();Scl=1;Nop();Scl=0;}/*发送数据子程序,Data为要求发送的数据*/void Send(uchar Data){uchar BitCounter=8;uchar temp;do{temp=Data;Scl=0;Nop();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*读一字节的数据,并返回该字节值*/uchar Read(void){uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;Nop();Scl=1;Nop();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}void WrToROM(uchar Data[],uchar Address,uchar Num){uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Send(*(PData+i));Ack();Stop();mDelay(20);}}void RdFromROM(uchar Data[],uchar Address,uchar Num){uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}//==================================================================================================//=======================================LCD1602====================================================//==================================================================================================#define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//----------------延时函数,后面经常调用----------------------void delay(uint xms)//延时函数,有参函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}//--------------------------写指令---------------------------write_1602com(uchar com)//****液晶写入指令函数****{lcd1602_rs=0;//数据/指令选择置为指令lcd1602_rw=0; //读写选择置为写P0=com;//送入数据delay(1);lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令}//-------------------------写数据-----------------------------write_1602dat(uchar dat)//***液晶写入数据函数****{lcd1602_rs=1;//数据/指令选择置为数据lcd1602_rw=0; //读写选择置为写P0=dat;//送入数据delay(1);lcd1602_en=1; //en置高电平,为制造下降沿做准备delay(1);lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令}//-------------------------初始化-------------------------void lcd_init(void){write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);//开显示不显示光标write_1602com(0x06);//整屏不移动,光标自动右移write_1602com(0x01);//清显示}//========================================================================================//=========================================================================================//==============将按键值编码为数值=========================unsigned char coding(unsigned char m){unsigned char k;switch(m){case (0x11): k=1;break;case (0x21): k=2;break;case (0x41): k=3;break;case (0x81): k='A';break;case (0x12): k=4;break;case (0x22): k=5;break;case (0x42): k=6;break;case (0x82): k='B';break;case (0x14): k=7;break;case (0x24): k=8;break;case (0x44): k=9;break;case (0x84): k='C';break;case (0x18): k='*';break;case (0x28): k=0;break;case (0x48): k='#';break;case (0x88): k='D';break;}return(k);}//=====================按键检测并返回按键值===============================unsigned char keynum(void){unsigned char row,col,i;P1=0xf0;if((P1&0xf0)!=0xf0){Delay5Ms();Delay5Ms();if((P1&0xf0)!=0xf0){row=P1^0xf0; //确定行线i=0;P1=a[i]; //精确定位while(i<4){if((P1&0xf0)!=0xf0){col=~(P1&0xff); //确定列线break; //已定位后提前退出}else{i++;P1=a[i];}}}else{return 0;}while((P1&0xf0)!=0xf0);return (row|col); //行线与列线组合后返回}else return 0; //无键按下时返回0}//=======================一声提示音,表示有效输入========================void OneAlam(void){ALAM=0;Delay5Ms();ALAM=1;}//========================二声提示音,表示操作成功========================void TwoAlam(void){ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;}//========================三声提示音,表示错误========================void ThreeAlam(void){ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;}//=====================显示输入的N个数字,用H代替以便隐藏============================void DisplayOne(void){// DisplayOneChar(9+N,1,'*');write_1602com(yi+5+N);write_1602dat('*');}//=======================显示提示输入=========================void DisplayChar(void){unsigned char i;if(pass==1){//DisplayListChar(0,1,LockOpen);write_1602com(er);for(i=0;i<16;i++){write_1602dat(LockOpen[i]);}}else{if(N==0){//DisplayListChar(0,1,Error);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Error[i]);}}else{//DisplayListChar(0,1,start_line);write_1602com(er);for(i=0;i<16;i++){write_1602dat(start_line[i]);}}}}void DisplayInput(void){unsigned char i;if(CorrectCont==1){//DisplayListChar(0,0,Input);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Input[i]);}}}//========================重置密码==================================================//==================================================================================void ResetPassword(void){unsigned char i;unsigned char j;if(pass==0){pass=0;DisplayChar();ThreeAlam();}else{if(ReInputEn==1){if(N==6){ReInputCont++;if(ReInputCont==2){for(i=0;i<6;){if(TempPassword[i]==InputData[i]) //将两次输入的新密码作对比i++;else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示pass=0;ReInputEn=0; //关闭重置功能,ReInputCont=0;DisplayChar();break;}}if(i==6){//DisplayListChar(0,1,ResetOK);write_1602com(er);for(j=0;j<16;j++){write_1602dat(ResetOK[j]);}TwoAlam(); //操作成功提示WrToROM(TempPassword,0,6); //将新密码写入24C02存储ReInputEn=0;}ReInputCont=0;CorrectCont=0;}else{OneAlam();//DisplayListChar(0, 1, again); //显示再次输入一次write_1602com(er);for(j=0;j<16;j++){write_1602dat(again[j]);}for(i=0;i<6;i++){TempPassword[i]=InputData[i]; //将第一次输入的数据暂存起来}}N=0; //输入数据位数计数器清零}}}}//=======================输入密码错误超过三过,报警并锁死键盘======================void Alam_KeyUnable(void){P1=0x00;{ALAM=~ALAM;Delay5Ms();}}//=======================取消所有操作============================================void Cancel(void){unsigned char i;unsigned char j;//DisplayListChar(0, 1, start_line);write_1602com(er);for(j=0;j<16;j++){write_1602dat(start_line[j]);}TwoAlam(); //提示音for(i=0;i<6;i++){InputData[i]=0;}KEY=1; //关闭锁ALAM=1; //报警关operation=0; //操作标志位清零pass=0; //密码正确标志清零ReInputEn=0; //重置输入充许标志清零ErrorCont=0; //密码错误输入次数清零CorrectCont=0; //密码正确输入次数清零ReInputCont=0; //重置密码输入次数清零open_led=1;s3_keydown=0;key_disable=0;N=0; //输入位数计数器清零}//==========================确认键,并通过相应标志位执行相应功能===============================void Ensure(void){unsigned char i,j;RdFromROM(CurrentPassword,0,6); //从24C02里读出存储密码if(N==6){if(ReInputEn==0) //重置密码功能未开启{for(i=0;i<6;){if(CurrentPassword[i]==InputData[i]){i++;}else{ErrorCont++;if(ErrorCont==3) //错误输入计数达三次时,报警并锁定键盘{write_1602com(er);for(i=0;i<16;i++){write_1602dat(Error[i]);}doAlam_KeyUnable();while(1);}else{TR0=1; //开启定时key_disable=1; //锁定键盘pass=0;break;}}}if(i==6){CorrectCont++;if(CorrectCont==1) //正确输入计数,当只有一次正确输入时,开锁,{//DisplayListChar(0,1,LockOpen);write_1602com(er);for(j=0;j<16;j++){write_1602dat(LockOpen[j]);}TwoAlam(); //操作成功提示音KEY=0; //开锁pass=1; //置正确标志位TR0=1; //开启定时open_led=0; //开锁指示灯亮for(j=0;j<6;j++) //将输入清除{InputData[i]=0;}}else //当两次正确输入时,开启重置密码功能{//DisplayListChar(0,1,SetNew);write_1602com(er);for(j=0;j<16;j++){write_1602dat(SetNew[j]);}TwoAlam(); //操作成功提示ReInputEn=1; //允许重置密码输入CorrectCont=0; //正确计数器清零}}else //=========================当第一次使用或忘记密码时可以用131420对其密码初始化============{if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0)){WrToROM(initpassword,0,6); //强制将初始密码写入24C02存储//DisplayListChar(0,1,initword); //显示初始化密码write_1602com(er);for(j=0;j<16;j++){write_1602dat(initword[j]);}TwoAlam();Delay400Ms();TwoAlam();N=0;}else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示音pass=0;}}}else //当已经开启重置密码功能时,而按下开锁键,{//DisplayListChar(0,1,Er_try);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Er_try[j]);}ThreeAlam();}}else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示音pass=0;}N=0; //将输入数据计数器清零,为下一次输入作准备operation=1;}//==============================主函数===============================void main(void){unsigned char KEY,NUM;unsigned char i,j;P1=0xFF;TMOD=0x11;TL0=0xB0;TH0=0x3C;EA=1;ET0=1;TR0=0;Delay400Ms(); //启动等待,等LCM讲入工作状态lcd_init(); //LCD初始化write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示for(i=0;i<16;i++){write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分}write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示for(i=0;i<16;i++){write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号}write_1602com(er+9); //设置光标位置write_1602com(0x0f); //设置光标为闪烁Delay5Ms(); //延时片刻(可不要)N=0; //初始化数据输入位数while(1){if(key_disable==1)Alam_KeyUnable();elseALAM=1; //关报警KEY=keynum();if(KEY!=0){if(key_disable==1){second=0;}else{NUM=coding(KEY);{switch(NUM){case ('A'): ; break;case ('B'): ; break;case ('C'): ; break;case ('D'): ResetPassword(); break; //重新设置密码case ('*'): Cancel(); break; //取消当前输入case ('#'): Ensure(); break; //确认键,default:{//DisplayListChar(0,1,Input);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Input[i]);}operation=0;if(N<6) //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。

伟福LAB2000P系列 单片机仿真实验系统000

伟福LAB2000P系列 单片机仿真实验系统000

伟福®伟福Lab2000P系列单片机仿真实验系统使用说明书南京伟福实业有限公司® 伟福Lab2000P 单片机仿真实验系统 目录 - i -目录第一章 概述 (1)第二章 伟福实验系统组成和结构 (3)第三章 板上仿真器使用方法 (12)第四章 MCS51系列单片机实验 (19)MCS96系列单片机实验 (20)8088/86系列CPU 实验 (21)软件实验1. 存储器块清零(51/96/88) (22)2. 二进制到BCD 码转换(51/96/88) (23)3. 二进制到ASCII 码转换(51/96/88) (24)4. 内存块移动(51/96/88) (25)5. 程序跳转表(51/96/88) (26)6. 数据排序(51/96/88) (27)硬件实验1. P1口输入输出(51/96) (28)2. 继电器控制(51/96) (30)3. 用74LS245读入数据(51/96/88) (31)4. 用74LS273输出数据(51/96/88) (32)5. PWM 转换电压实验(51/96) (33)6. 音频控制(51/96) (34)7. 用8255输入、输出(51/96/88) (35)8. 串行数转换并行数(51/96) (36)9. 并行数转换串行数(51/96) (38)10. 计数器实验(51) (40)11. 外部中断实验(51/96) (41)12. 定时器实验(51/96) (43)13. D/A 转换实验(51/96/88) (45)14. A/D 转换实验(51/96/88) (47)15. 外部中断实验(急救车与交通灯) (51/96) (49)16. 八段数码管显示(51/96/88) (51)17. 键盘扫描显示实验(51/96/88) (53)18. 电子时钟(51/96/88) (55)19. 单片机串行口通讯实验(51/96) (57)® 伟福Lab2000P 单片机仿真实验系统 目录 - ii -20. 打印机控制实验(51/96/88) (59)21. 直流电机控制实验(51/96/88) (61)22. 步进电机控制实验(51/96/88) (63)23. 温度传感器实验(51/96/88) (66)24. 液晶显示屏控制实验(51/96/88) (67)25. 电子琴(51/96/88) (69)26. 空调温度控制实验(51/96/88) (71)27. 计算器实验(51/96/88) (74)28. 用HSO 方式输出PWM 波形(96) (76)29. 用HSI 方式测量脉冲宽度(96) (77)30. 用HSI 中断方式统计脉冲个数(96) (78)31. 计数器实验(96) (80).... 32. 用片内A/D 做A/D 转换实验(96).. (81)33. PWM 转换电压实验(88) (82)34. 8253计数器实验(88) (83)35. 8259外部中断实验(88) (84)36. 8253定时器实验(88) (86)37. 8251A 串行口通讯实验(88) (88)第五章 逻辑分析工具 (90)本实验说明书包括8051,80C196,8088/86三种实验说明(8051单片机有6个软件实验、27个硬件实验,80C196单片机有6个软件实验、31个硬件实验,8088/86CPU 有6个软件实验、21个硬件实验)。

第六部分 单片机仿真实验

第六部分  单片机仿真实验

第六部分单片机仿真实验实验一硬件仿真调试硬件仿真除PC机之外,还需要仿真器、实验电路板,DP-51PROC实验仪已具备这些设备。

一、硬件仿真工程环境的设置源程序存放起始地址为8000H,即程序存放伪指令应为“ORG 8000H”。

单击工具栏Project,在弹出的下拉菜单中选择options for Target>Target1”命令(或者单击快捷图标),弹出工程调试设置窗口。

(1)Targect页面设置;由于MON51监控程序已经占有了0000H~7FFFH地址单元的程序存储空间,因此用户的应用程序必须从8000H地址单元开始存放,即用户应设置off-chip Code Memory栏内的Eprom选项。

见图二十一。

图二十一(2)output的设置:点击output按钮,在“Create HEX File”(建立16进制格式文件)前打勾选中。

对于C51选项卡的设置。

点击C51按钮,进入C51选项卡的设置,按图二十二设置。

图二十二(3)C51属性栏的设置:在efine后面框中输入MONITOR51,将断口地址改为0X8000图二十三(4)Debug调试环境的设置。

选择Debug标签,进入设置页面,在该选项卡中,应选中Use(硬件仿真),在Use下拉控列表框中应选择Keil Monitor-51 Driver选项。

其它选项参考图二十四进行。

图二十四同时它的Settings按钮还提供了串口通信环境设置,通过它可以灵活设置串行通信的端口和波特率。

DP-51PROC单片机综合仿真实验仪波特率必须选9600bps,接口port一般为Com1。

图二十五完成上述设置后,单击“确定”按钮,退出环境设置。

二、编译、链接方法和软件仿真调试完全一样。

若在编辑、链接中出现警告信息,用户可以不必理会它;如果编译出错,将提示错误ERROR的类型和行号。

双击该提示行,将会在指令前出现一个箭头,指向出错误的那条指令。

必须修改程序中的错误,直至程序编译成功为止。

51单片机程序及仿真

51单片机程序及仿真

目录1、交叉流水灯---------------------------------------------12、倒序流水灯---------------------------------------------33、正序流水灯---------------------------------------------74、交替流水灯--------------------------------------------115、2 0个LED显示--------------------------------------146、单个数码管显示0~ F ---------------------------------167、两个数码管显示00~ 99 ------------------------------208、4个数码管显示固定数值-------------------------------249、6个数码管同步显示----------------------------------2610、6个数码管依次显示数字1~6 -------------------------2911、一个按键控制LED灯---------------------------------3312、矩阵按键控制LED灯---------------------------------3613、矩阵键盘控制数码管依次显示0~F --------------------3914、中断控制LED灯的依次亮灭--------------------------4615、中断按键显示0~F ------------------------------------4816、1秒闪烁灯-------------------------------------------5017、1秒闪烁灯(中断)-----------------------------------5418、2秒闪烁灯--------------------------------------------5819、59秒循环计时----------------------------------------6020、串口---------------------------------------------------63交叉流水灯仿真图:程序:#include<reg51.h>#include<intrins.h>void DelayTime (unsigned int DelayValue) {unsigned int a,b;for (a=0;a<DelayValue;a++)for (b=0;b<1827;b++);}void main(){char b;b=0xfe;while(1){b= _crol_(b,7);DelayTime(50);P0=b;}}程序实现的功能:本程序实现的是先让上面的4个灯一起亮灭,再让下面4个灯亮灭,然后让奇数位的灯亮灭,最后让偶数位的灯亮灭。

Proteus仿真单片机实验

Proteus仿真单片机实验

目录引言 (2)实验1 PROTUES环境及LED闪烁综合实验 (7)实验2 多路开关状态指示 (10)实验3 报警产生器 (13)实验4 I/O并行口直接驱动LED显示 (16)实验5 按键识别方法之一 (19)实验6 一键多功能按键识别技术 (22)实验7 定时计数器T0作定时应用技术 (25)实验8定时计数器T0作定时应用技术 (28)实验9 “嘀、嘀、......”报警声 (32)实验10 8X8 LED点阵显示技术 (36)实验11电子琴 (40)引言单片机体积小,重量轻,具有很强的灵活性而且价格便宜,具有逻辑判断,定时计数等多种功能,广泛应用于仪器仪表,家用电器,医用设备的智能化管理和过程控制等领域。

以单片机为核心的嵌入式系统已经成为目前电子设计最活跃的领域之一。

在嵌入式系统的中,开发板成本高,特别是对于大量的初学者而言,还可能由于设计的错误导致开发板损坏。

利用Proteus我们可以很好地解决这个问题,由此我们可以快速地建立一个单片机仿真系统。

1. Proteus介绍Proteus是英国Labcenter Electronics公司开发的一款电路仿真软件,软件由两部分组成:一部分是智能原理图输入系统ISIS(Intelligent Schematic Input System)和虚拟系统模型VSM(Virtual Model System);另一部分是高级布线及编辑软件ARES (Advanced Routing and Editing Software)也就是PCB。

1.1 Proteus VSM的仿真Proteus可以仿真模拟电路及数字电路,也可以仿真模拟数字混合电路。

Proteus可提供30多种元件库,超过8000种模拟、数字元器件。

可以按照设计的要求选择不同生产厂家的元器件。

此外,对于元器件库中没有的元件,设计者也可以通过软件自己创建。

除拥有丰富的元器件外,Proteus还提供了各种虚拟仪器,如常用的电流表,电压表,示波器,计数/定时/频率计,SPI调试器等虚拟终端。

单片机C语言程序设计代码和仿真图

单片机C语言程序设计代码和仿真图
sbit RED_A=P0^0;//东西向灯
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3;//南北向灯
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//延时
void DelayMS(uint x)
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//延时
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}
//主程序
void main()
}
}
}
05 LED模拟交通灯
/*名称:LED模拟交通灯

基于Multisim的单片机仿真

基于Multisim的单片机仿真

Multisim补充实验二:以单片机8051为核心的交通灯控制电路的仿真如今的电子电路已经很少再由若干个硬件器件拼接而成,而更多的则是以单片机、DSP、FPGA或ARM等可编程器件为核心,进行相关的编程处理再辅以适当的外围电路来设计实现。

Multisim从9.0版本开始,加入了MCU(Microprocessor Control Unit,,微处理机控制器)模块,使得该软件的实际应用能力得到了大大地增强。

本例将通过以单片机8051为核心的交通灯控制电路的仿真设计说明其基本应用方法。

(注:本例选自黄培根等编著《Multisim10计算机虚拟仿真实验室》一书,北京:电子工业出版社,2008。

如对MCU仿真设计有兴趣,还可参考聂典主编《Mumsim 9计算机仿真在电子电路设计中的应用》P460~472之范例。

)一、设计要求和分析在道路的十字路口,为了有序地指挥车辆和行人正常通行,都架有红绿灯,“红灯停,绿行”,这是大家所熟悉的交通规则。

实际的交通灯控制,除了红绿灯之外,在红绿灯之间还有一盏黄灯,它起一个过渡作用,即由红灯转换为绿灯或由绿灯转换为红灯之前,黄灯先闪亮几下,提醒正在通行的车辆行人加快通过道口,绿灯即将灭,红灯即将亮;同时也提醒另一方向正在路口等待的车辆行人,红灯即将灭,绿灯即将亮,准备通行;黄灯闪烁几次后,红灯亮转换为绿灯亮或绿灯转换为红灯亮。

根据以上十字路口红、黄、绿灯的工作情况,我们采用单片机模块8051实现交通灯控制。

单片机模块8051需要的工作电源电压为5V;由于模块内已备晶振(默认振荡频率为12MHz),所以仿真外围电路可以省略晶振;外围需要加一只电容和一只电阻,实现单片机的上电复位功能;单片机输出利用Mumsim 10.1元件工具条中的3D元件,红色、黄色和绿色发光二极管各4只,组成南北方向和东西方向的指示灯,形象直观、生动有趣。

交通灯控制框图如图1所示,交通灯控制电路原理图如图2所示。

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