基于protuse的单片机模拟的实例
8051单片机Proteus仿真实例2(原理图+C程序)
1. INT0,INT1中断计数原理图:程序:#include <reg51.h>sbit k3=P3^4;sbit k4=P3^5;unsigned char code led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsigned char code seg_code[]={0x20,0x10,0x08,0x04,0x02,0x01};unsigned char led_buffer[]={0,0,0,0,0,0};unsigned int count_a=0,count_b=0;void delay(unsigned int x){unsigned char t;while(x--)for(t=0;t<120;t++);}void display(){unsigned char i;led_buffer[2]=count_a/100;led_buffer[1]=count_a%100/10;led_buffer[0]=count_a%10;if(led_buffer[2]==0){led_buffer[2]=10;if(led_buffer[1]==0)led_buffer[1]=10;}led_buffer[5]=count_b/100;led_buffer[4]=count_b%100/10; led_buffer[3]=count_b%10;if(led_buffer[5]==0){led_buffer[5]=10;if(led_buffer[4]==0)led_buffer[4]=10;}for(i=0;i<6;i++){P2=seg_code[i];P1=led_code[led_buffer[i]];delay(1);}}void main(){IT0=1;IT1=1;PX0=1;IE=0x85;while(1){k3=1;k4=1;if(k3==0) count_a=0;if(k4==0) count_b=0;display();}}void int0() interrupt 0{count_a++;}void int1() interrupt 2{count_b++;}2. INT0中断计数原理图:程序:#include <reg51.h>unsigned char code led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; unsigned char led_buffer[]={0,0,0};unsigned count=0;sbit key=P3^6;void display(){led_buffer[2]=count/100;led_buffer[1]=count%100/10;led_buffer[0]=count%10;if(led_buffer[2]==0){led_buffer[2]=10;if(led_buffer[1]==0)led_buffer[1]=10;}P0=led_code[led_buffer[0]];P1=led_code[led_buffer[1]];P2=led_code[led_buffer[2]];}void main(){IE=0x81;IT0=1;while(1){key=1;if(key==0)count=0;display();}}void int0() interrupt 0 {count++;}3.LED点阵原理图:程序:#include <reg51.h>sbit led1=P0^0;sbit led2=P0^1;void delay(long dly){while(dly--);}void main(){SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;PCON=0x00;TR1=1;RI=0;while(1){if(RI==1){RI=0;switch(SBUF){case 'A':led1=~led1;led2=1;break;case 'B':led1=1;led2=~led2;break;case 'C':led1=~led1;led2=~led2;break;}}else led1=led2=1;delay(1000);}}4.串行通信(MAX232芯片)原理图:程序:#include <reg51.h> sbit led1=P0^0;sbit led2=P0^1;void delay(long dly) {while(dly--);}void main(){SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;PCON=0x00;TR1=1;RI=0;while(1){if(RI==1){RI=0;switch(SBUF){case 'A':led1=~led1;led2=1;break;case 'B':led1=1;led2=~led2;break;case 'C':led1=~led1;led2=~led2;break;}}else led1=led2=1;delay(1000);}}5.MAX7221芯片原理图:程序:#include <reg51.h>#include <intrins.h>sbit DIN=P2^0;sbit CSB=P2^1;sbit CLK=P2^2;unsigned char code buffer[]={2,0,1,5,10,5,10,9};void delay(long dly){while(dly--);}void write(unsigned char addr,unsigned char dat){unsigned char i;CSB=0;for(i=0;i<8;i++){CLK=0;addr<<=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}for(i=0;i<8;i++) {CLK=0;dat<<=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}CSB=1;}void initialise(){write(0x09,0xff); write(0x0a,0x07); write(0x0b,0x07); write(0x0c,0x01);}void main(){unsigned char i; initialise();delay(10);for(i=0;i<8;i++)write(i+1,buffer[i]); while(1);}6. T0控制LED实现二进制计数原理图:程序:#include <reg51.h>void main(){TMOD=0x05;TR0=1;TH0=0x00;TL0=0x00;while(1){P1=TH0;P2=TL0;}}8. 按键控制LED循环原理图:程序:#include <reg51.h>#include <intrins.h>void delay(unsigned int x){while(x--);}void move_led(){if((P1&0x10)==0) P0=_cror_(P0,1);else if((P1&0x20)==0) P0=_crol_(P0,1);else if((P1&0x40)==0) P2=_cror_(P2,1);else if((P1&0x80)==0) P2=_crol_(P2,1);}void main(){unsigned char key;P0=0xfe;P2=0xfe;P1=0xff;key=0xff;while(1){if(key!=P1){key=P1;move_led();delay(15000); }}}9.按键控制数码管显示原理图:程序:#include <reg51.h>unsigned char code led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsigned char code led_seg[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsigned char led_buffer[]={0,10,10,10,10,10,10,10};void delay(unsigned int x){unsigned char t;while(x--) for(t=0;t<120;t++);}void led_display(){unsigned char i;for(i=0;i<8;i++){P2=led_seg[i];P0=led_code[led_buffer[i]];delay(2);}}void main(){unsigned char i,key_val,key_count=0;P0=0xff;P1=0xff;P2=0x00;while(1){led_display();key_val=P1;switch(key_val){case 0xfe:key_count++;if(key_count>8) key_count=8;led_buffer[key_count-1]=key_count;break;case 0xfd:if(key_count>0) led_buffer[--key_count]=10;if(key_count==0) led_buffer[0]=0;break;case 0xfb:led_buffer[0]=0;for(i=1;i<8;i++)led_buffer[i]=10;key_count=0;}while(P1!=0xff)led_display();}}10.报警器原理图:程序:#include <reg51.h>sbit SOUNDER=P1^0;sbit BUTTON=P1^7;void delay(unsigned int x){while(x--);}void alarm(unsigned char t){unsigned char i,j;for(i=0;i<200;i++){SOUNDER=!SOUNDER;for(j=0;j<t;j++);delay(15);}}void main(){SOUNDER=0;while(1){BUTTON=1;if(BUTTON==1){alarm(90);alarm(120);}}}。
基于Protues软件的单片机软硬件仿真实验
・
9 ・ 6
最后 单击 仿 真 工具 栏 中全 速运 行 按 钮便 可 进 行 虚拟 仿 真 ( 图 1 ) 见 0 。可 以看 到 L D灯 按 程序 的 E 要 求循 环 闪亮 ,可 以随时 修改 程序 观察 L D灯显 示 的变化 。 E
图 1 全 速仿 真 0
3 结 束 语
T ANG Xi o h i a - u ,W E i g p n IP n — i g
( co l f te t sa dC mp tr ce c , uzo om l o ee G iag G i o 5 0 1 , hn ) S h o o h ma c n o ue in e G i uN r a l g , uyn , uz u 5 0 8 C ia Ma i S h C l h
21 0 2年 第 8期 第 3 O卷 ( 第 15期 ) 总 4
毕 节 学 院 学
报
J OURN lE UNI AL OFBi VER I l STY
NO. 2 1 8, 0 2 Vo . 0 1 3 Ge e a .4 n r lNo 1 5
基于 P oue r t s软件 的单片机软硬件仿真 实验
PROTEUS仿真100实例
《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》
//延时 void DelayMS(uint x) {
uchar i; while(x--) for(i=0;i<120;i++); } //交通灯切换 void Traffic_Light() { switch(Operation_Type) {
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {
2
《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》
for(i=0;i<7;i++) {
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
} } //主程序 void main() {
while(1) Traffic_Light(); }
06 单只数码管循环显示 0~9
5
《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》
/* 名称:单只数码管循环显示 0~9
说明:主程序中的循环语句反复将 0~9 的段码送至 P0 口,使数字 0~9 循环显示
《单片机C语言程序设计实训100例—基于8051+Proteus仿真
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
基于proteus的51单片机仿真实例九、51单片机的最小工作系统
基于proteus的51单片机仿真实例九、51单片机的最小工作系统1、前面我们已经利用proteus和keil c51建立了第一个仿真实例,并通过仿真运行验证了我们的实例的正确性。
现在我们已经了解了proteus和keil c51的基本操作。
2、但是毕竟是初学单片机,对于我们前面编写的程序所实现的功能可就是一头雾水,不知所云了。
那么接下来我们就了解一下51单片机的知识吧3、先来简单说说怎么学习单片机。
前面已经说过,单片机是一种软件和硬件紧密结合的技术,对于一个单片机应用系统来说,硬件电路是单片机系统运行的基础和保障,软件程序是单片机系统的灵魂。
相对于人来说,人的身体、四肢是一个硬件系统,大脑就是软件系统,只有通过大脑发出指令,身体的各个部分才会做出相应的动作,但是如果手被绑住了,大脑即使发出让手去拿一个杯子的指令,手也无法完成这个指令。
所以软件和硬件需要相互结合才能够去完成一项任务。
1)就像我们新买了一台电视机一样,买回来后我们会首先了解一下这个电视机的功能特点,看一下遥控器的说明书,给电视机加上电源和天线(或有线电视信号线),然后按照说明书的使用方法来一步一步熟悉和操作电视机。
单片机的学习也一样,我们接触到一种单片机后,首先要了解这种单片机的功能和性能特点,然后才能进行相应的开发设计。
怎么来了解一种单片机呢?单片机厂家提供的数据手册是第一手也是最准确的资料。
但是很多数据手册是英文的,对于我们很多人来说,看起来会比较吃力。
不过幸运的是,现在很多资料都已经被翻译过来了。
我们到网上搜索一下,会搜索到很多的中文数据手册和应用实例,所以网络现在已经成为我们学习的一个非常重要的工具和平台了。
2)单片机的结构是十分复杂的,我们打开一个单片机的数据手册,会发现前面里面到处充斥着结构图和理论知识的介绍,相信对于一个新手来说,看数据手册不到10分钟就想放弃。
但是很多人说,这些是最基础的,必须要理解和掌握。
确实,这些东西我们必须精通,但是是不是一开始就要完全精通这些呢?大可不必。
实验一:单片机仿真初步(二)-Proteus的使用
实验一:单片机仿真初步(二)-Proteus的使用用来仿真的单片机电路,如下图所示:电路的核心是单片机A T89C52,晶振X1和电容C1、C2构成单片机时钟电路,单片机的P1口接8个发光二极管,二极管的阳极通过限流电阻接到电源的正极。
特别注意:下面文中所有值为1K的电阻都修正成100 可以考虑把红色发光二极管换成黄色发光二极管一、新建一个设计。
单击“File”中“New Design……”,在Proteus中打开了一个空白的新电路图纸。
二、将需要用到的元器件加载到对象选择器窗口。
单击对象选择器按钮如图所示:弹出“Pick Devices”对话框,在“Category”下面找到“Mircoprocessor ICs”选项,鼠标左键点击一下,在对话框的右侧,我们会发现这里有大量常见的各种型号的单片机。
找到AT89C52,双击“AT89C52”。
这样在左侧的对象选择器就有了A T89C52这个元件了。
如果知道元件的名称或者型号我们可以在“Keywords”输入AT89C52,系统在对象库中进行搜索查找,并将搜索结果显示在“Results”中,如下图所示:在“Results”的列表中,双击“A T89C52”即可将AT89C52加载到对象选择器窗口内。
晶振CRY:无极性电容CAP:有极性电容CAP POL:红色发光二极管LED-RED:电阻RES经过前面的操作我们已经将A T98C52、晶振等元件加载到了对象选择器窗口内。
在对象选择器窗口内鼠标左键点击“AT89C52”会发现在预览窗口看到AT89C52的实物图,且绘图工具栏中的元器件按钮处于选中状态。
我们在点击“CRYSTAL”、“LED-RED”也能看到对应的实物图,按钮也处于选中状态,如图所示:三、将元器件放置到图形编辑窗口。
在对象选择器窗口内,选中A T89C52,如果元器件的方向不符合要求可使用预览对象方向控制按钮进行操作。
如用按钮对元器件进行顺时针旋转,用按钮对元器件进行逆时针旋转,用按钮对元器件进行左右反转,用按钮对元器件进行上下反转。
(完整版)PROTEUS仿真100实例
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
8051单片机Proteus仿真实例3(原理图+C程序)
}
}
}
void timer_0() interrupt 1
{
doorbell=~doorbell;
p++;
if(p<400)
{
TH0=(8192-700)/32;
case 1: transmit('B');break;
case 2: transmit('C');break;
}
delay(10);
}
}
void serial() interrupt 4
{
if(RI==1)
{
RI=0;
if(SBUF>=0&&SBUF<=9)
P0=led_code[SBUF];
else P0=0x00;
ET0 = 1;
TR0 = 1;
P2=0x01;
while(1);
}
void timer_0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
count++;
if(count==10)
{
P2=_crol_(P2,1);
count=0;
}
}
6.继电器
原理图:
程序:
#include <reg51.h>
1.单片机之间通过串口进行通信
原理图:
程序:
#include <reg51.h>
sbit key=P1^0;
unsigned char code led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
PROTEUS的单片机教学与应用仿真
结论
它可以帮助学生们更好地理解单片机的工作原理和编程方法,同时也可以帮 助他们提高解决实际问题的能力。因此,PROTEUS单片机教学与应用仿真的实用 性和推广价值不容忽视。
结论
展望未来,随着科技的不断发展和PROTEUS软件的进一步升级和完善,相信 PROTEUS单片机教学与应用仿真将在更多的领域得到应用,同时也会为单片机人 才的培养和发展带来更多的机遇和挑战。
五、实验结果分析
实验过程: 1、在PROTEUS中搭建电路:选用AT89C51单片机芯片,连接8个LED灯和一个 按键开关,并设置相应的输入输出端口。
五、实验结果分析
2、编写程序:使用C语言编写程序,通过循环控制P1口输出高低电平,实现 LED灯的依次点亮和熄灭。同时,程序中加入按键开关的输入判断,以便手动控 制LED灯的显示状态。
四、应用场景
2、硬件开发:在单片机应用项目开发过程中,使用PROTEUS可以进行电路设 计和仿真,减少硬件调试的难度,提高开发效率。
四、应用场景
3、软件测试:通过在PROTEUS中搭建单片机外围电路,可以测试和验证单片 机的程序功能是否正确实现。
四、应用场景
4、产品设计:在产品研发阶段,使用PROTEUS进行单片机电路设计与仿真, 可以缩短产品开发周期,提高产品的可靠性和稳定性。
教学案例
教学案例
下面以一个简单的LED闪烁实验为例,介绍PROTEUS单片机教学案例的具体实 施过程:
1、实验题目:LED闪烁实验
1、实验题目:LED闪烁实验
2、实验目的:通过单片机控制LED的亮灭,实现LED的闪烁效果 3、实验原理:利用单片机的IO口控制LED的亮灭状态,通过循环实现LED的 闪烁效果
参考内容
(完整版)单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
基于proteus的51单片机仿真实例八十一、实时时钟芯片DS1302应用
基于proteus的51单片机仿真实例八十一、实时时钟芯片DS1302应用实例标签: proteus单片机芯片时钟实例2010-02-25 16:561、DS1302引脚排列:如下图引脚说明:1)Vcc1:后备电源,VCC2:主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
2)X1、X2:振荡源,外接32.768kHz 晶振。
3)RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
4)I/O为串行数据输入输出端(双向)。
5)SCLK为时钟输入端。
2、 DS1302的控制字节DS1302 的控制字如下图所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
3、数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见数据手册。
(完整版)PROTEUS仿真100实例
(完整版)PROTEUS仿真100实例《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include#include#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include#include#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x 00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0 x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xf f,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xf b,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0 xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff };uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x 9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x 00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0 x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xf f,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xd f,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc 0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
基于proteus的51单片机仿真实例八十三-PROTEUS技术交流区-PROTE...
基于proteus的51单片机仿真实例八十三-PROTEUS技术交流区-PROTE...proteus, 单片机, 实例, 仿真1、SPI总线器件与单片机的连接需要3跟线:时钟线SCK,数据线MOSI(主机发送,从机接收)和MISO(主机接收,从机发送)。
X5045是一种集合了看门狗、电压监控和串行EEPROM三种功能于一身的器件。
上电复位功能:在系统上电时产生一个足够长时间的复位信号,以确保单片机正常工作前,系统电路已处于稳定状态。
看门狗功能:如果在规定的时间内单片机没有在CS引脚产生规定的电平变化(喂狗信号),芯片内的看门狗电路将产生复位信号。
利用该功能,可让单片机死机后自动复位并开始工作。
电压检测:当电源电压下降到一定的值后,虽然单片机仍能工作,但可能已经不能稳定工作了,此时X5045将产生复位信号,直到电压恢复正常后,才能正常工作。
串行EEPROM:X5045自带512字节的数据存储空间,数据可掉电保存。
2、x5045的引脚及功能CS/WDI:片选输入端。
低电平时选中该芯片SO:串行数据输出端,数据在sck的下降沿输出WP:写保护端,该脚接地,写操作被禁止,接高电平,所有功能正常VSS:电源地SI:串行数据输入端,数据在sck的上升沿写入(高位在前)SCK:串行时钟端,RESET:复位输出端,用于电源监测和看门狗超时输出VCC:电源3、使用方法1)上电复位:当器件通电并超过规定值时,X5045内部的复位电路将会产生一个约200ms的复位脉冲,使单片机正常复位。
2)电压检测:工作过程中,X5045能不断检测VCC端的电压,在电压下降到一定值后,将产生一个复位脉冲,使单片机停止工作,这个复位脉冲一直有效,直到VCC下降到1V以下,整个系统停止工作。
如果VCC在下降后又升高,则当超过规定值后200ms,复位信号消失,单片机可以继续工作。
3)看门狗定时器:看门狗定时器电路通过检测WDI端的输入来判断单片机工作是否正常,在规定的时间内,单片机必须在WDI端口产生一个由高到低的电平变化。
Proteus虚拟仿真案例---流水灯制作
Proteus虚拟仿真案例-——流水灯制作一、原理图设计1.打开proteus,新建文件2.选择元器件(1)选择单片机芯片左侧快捷菜单栏里按下,按下P,在“关键字”栏中输入“8951”,选择AT89C51(2)选择晶振:输入crystal,选择CRYSTAL(3)选择电容:输入22p,左边类别中选择Capacitors,右边选择CERAMIC22P(4)选择电阻:输入10k,左边类别中选择Resistors,右边选择RESISTORS库的3WATT10K(5)选择led:输入led,左边类别中选择Optoelectronics,右边选择led-yellow(6)选择按钮:输入button,选择USERDVC库的BUTTON(7)选择好的元器件如图所示3.放置器件振荡电路:(1)放置AT89C51单片机:在DEVICES栏中选中AT89C51,然后在绘制区放置到合适的位置(2)放置晶振,隐藏text属性(菜单—模板—设置设计默认值—显示隐藏文本不勾选)(3)分别将晶振的两脚与AT89C51的19、18脚相连(4)放置两个22p的电容,一端与晶振相连,另一端互连(5)放置地节点(左侧快捷菜单栏里按下——GROUND),与两个电容相连复位电路:a.放置电源节点(左侧快捷菜单栏里按下——POWER)b.放置地节点c.放置电容,电阻,电阻一端接地,一端与电容相连,电容一端接+5V电源d.AT89C51第9脚接电阻、电容中间e.放置按钮,接电容两端f.右击按钮——编辑属性——元件参考:BUTTON,并取消“本元件不用于PCB制版”g.修改C3电容的值:右击——编辑属性——Capacitance改为10u绘制流水灯:a.放置电阻、led,右击led——编辑属性——隐藏元件值,连接电阻和ledb.使用块复制,复制7组电阻和ledc.放置电源,分别与D1-D8的一端连接d.总线绘制:左侧选择“总线模式”,绘制一条总线,连接P1口与R2-R9e.使用属性分配工具进行快速网络标号:按下a,出现属性分配窗口,“字符串”框输入“net=D#”,单击P0口的8条线,进行编号,再次按下a,出现属性分配窗口,“字符串”框输入“net=D#”,单击R2-R9的8条线,进行编号f.批量修改R2-R9的值:按下a,出现属性分配窗口,“字符串”框输入“V ALUE=100”,确定二、系统仿真1.编写源代码(1)菜单——源代码——添加/删除源文件——new——文件名输入pmd.asm——打开——确定(2)菜单——源代码——pmd.asm,进入编辑窗口,编写跑马灯源程序(如下所示),保存ORG 00HSTART: MOV R2,#8MOV A, #0FEHLOOP: MOV P1, ALCALL DELAYRL ADJNZ R2, LOOPLJMP STARTDELAY: MOV R5, #20D1: MOV R6, #20D2: MOV R7, #248DJNZ R7, $DJNZ R6, D2DJNZ R5, D1RETEND(3)编译代码:源代码——全部编译2.运行仿真(1)暂停,观察源代码窗口,寄存器窗口(调试——寄存器窗口),SFR窗口中的值三、PCB(Printed Circuit Board,印制电路板)制版1.封装检查(1)菜单——设计——设计浏览器,查看(2)回到ISIS界面,处理“按钮”:右键——封装工具——添加——关键字输入button,选择一个,引脚A分别输入1、2——指定封装(3)批量修改电阻的封装值:选中R2-R9,按下a,出现属性分配窗口,“字符串”框输入“package=RES40”,确定(4)批量修改led的封装值:选中D1-D8,按下a,出现属性分配窗口,“字符串”框输入“package=LED”,确定(5)修改R1的封装值:右击——编辑属性——PCB Package设置为RES40(6)保存:路径和文件名不要有中文2.点击ARES,制作PCB板(1)画板框:左下角下拉框“选择当前板层”——Board Edge,顶部快捷菜单栏里按下,左侧快捷菜单栏里按下,画一个100mm×100mm的框(2)布局各元器件:按下,分别放置单片机U1、电阻R2-R9、晶振X1、电容C1-C3、按钮、led灯D1-D8、电阻R1到刚才画的板框中(3)自动布线:顶部快捷菜单栏里按下——开始布线(4)调整板框到合适的大小(5)3D预览PCB:菜单——输出——3D预览(6)生成电源层:菜单——工具——生成电源层——网络下拉框选择“GND=POWER”,层下拉框选择“Top Copper”——确定。
基于proteus的51单片机开发实例30
基于proteus的51单片机开发实例301. 基于proteus的51单片机开发实例30-模块化程序设计1.1. 实验目的模块化程序设计不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什么呢?我们先从程序结构开始吧。
总结在前面的29个例子中的程序,我们会发现:所有的程序都在一个main.c文件中,第一个程序只有不到20行,电脑屏幕上直接能够从头看到尾,这个程序看起来非常直观,所有程序语句都是一目了然的。
随着学习的深入,我们编写的程序是越来越复杂了,程序的长度是疯狂地增加。
到了第29个实例,我们的程序量已经接近500行了,假设我们要找最后一个函数的内容,那就要用鼠标拨拉好一会才能找到这个函数,是不是会有“好长啊”的感慨?更为致命的是,我们这个程序中既有延时程序、又有液晶显示程序、还有DS18B20的读写程序。
所有这个程序都挤在一个main.c文件中,即使我们已经按照延时、显示、读写进行了划分,整体感觉是不是有些乱?现在我们看看DS18B20学习实验的第三个程序,这个程序里面有很多函数,这些函数的声明和定义在整个程序里面占了很大的比例。
我们在编写和使用这些函数的时候,需要不停的翻找相关的程序部分。
显得很麻烦。
而且整个程序显得有些乱。
那么能不能把程序精简一下,能不能把具有相关功能的函数放在一起,能不能向我们使用头文件的时候,直接使用一个包含命令就把一些相关功能包含到程序里,而我们在程序里只要调用我们用到的函数就能够实现我们想要达到的目的呢?答案是肯定的!那么该怎么办?今天我们就学习一下模块化程序设计,把程序进行合理的规划!本实例的目的:了解模块化程序设计的思路和方法。
1.2. 设计思路本实例的设计思路是:将《基于proteus的51单片机开发实例29-单总线DS18B20的读写》中的程序代码按照延时功能、LCD1602液晶显示功能、DS18B20的读写控制功能这三个部分,使用模块化程序设计的方法,将这三个部分分别封装为三个.c和.h文件,然后在main.c文件中使用宏定义语句调用。
[附]单片机Proteus仿真-流水灯
1)编译器设置 单击菜单【Source】(源代码)→【Define Code Generation Tools】,设置结果如图
2)编译源程序,生成目标代码文件 单击菜单【Source】(源
代码)→【Bulid All】(编译全部)。如果出现错误则修改;无
错误则生成目标代码“.HEX”文件。
基于PROTEUS的单片机仿真
嵌入式系统与接口技术
北京理工大学光电学院 2018-9-10
1
基于PROTEUS的单片机仿真
基于PROTEUS的单片机仿真
循环点亮发光二极管程序仿真
说明:要点亮一个发光二极 管,必须在其两端加上足够 的电压,一般为5V,而且二 极管必须要正向接法,同时 还要加上限流电阻。 【例】用51系列单片机的I/O 口点亮发光二极管。
3.1 添加目标代码到电路 2)选择要添加的目标代码文件,单击“打开”按钮,目标代码 就添加到了电路中。
最后按 “确定”
22
基于PROTEUS的单片机仿真
3 单片机电路的仿真与调试
3.2 电路调试
全速启动仿真
23
基于PROTEUS的单片机仿真
3 单片机电路的仿真与调试
3.2 电路调试
Led灯点亮 24
由上图可知,若要使灯点亮,
根据发光二极管点亮条件,只
要P2.0引脚输出为低电平即可,
即P2.0=0。
2
基于PROTEUS的单片机仿真
1 单片机电路的建立
1.1 51系列单片机应用电路图(流水灯)
3
基于PROTEUS的单片机仿真
1 单片机电路的建立
1.2 元器件的选取
在桌面上选择【开始】→【程序】→“Proteus 7 Professional”,单击蓝色图标“ISIS 7 Professional” 打开应用程序。ISIS Professional的编辑界面如图
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调试器等虚拟终端。
基于proteus的51单片机仿真lcd1602
基于proteus的51单片机仿真实例六十三、字符液晶LCD1602显示单个字符实例1、字符液晶LCD1602显示字符的过程:使用1602型液晶显示字符必须解决三个问题:代县字符ASCII标准妈的产生;液晶显示模式的设置;字符显示位置的指定。
1)字符ASCII标准码产生常用字符的标准ASCII码无需人工产生,在程序中定义字符常量或字符串常量时,C语言在编译后会自动产生其标准ASCII码。
职演讲澄澄的标准ASCII码通过单片机的IO口送入数据线使用存储器(DDRAM),部控制线路就会自动将字符传送到显示器上。
2)液晶显示模式的设置要让液晶显示字符,必须对有无光标、光标的移动方向、光标是否闪烁及字符的移动方向等进行设置。
这样才能获得所需的显示效果。
1602液晶显示模式的设置是通过控制指令对部的控制器进行控制而实现的。
常用的控制指令需要查询液晶的数据手册获得。
3)字符显示位置的指定想要在液晶的某一位置显示特定的字符,则必须指定其显示位置,显示位置的地址需要查询1602型LCD部地址获得。
2、1602型LCD的读写操作LCD是一个慢速显示器件,所以在写每一条指令之前一定要先读取LCD的忙碌状态(当然也可以通过加入一个比较长的延时时间来避开液晶的忙状态,但是这种方法并不合理)。
如果LCD正忙于处理其他指令,就需要等待处理结束;如果不忙,再执行写操作。
为此,1602型液晶专门设了一个忙碌标志位BF,该位位于从1602读取的8位数据的最高位,如果BF为0,表示LCD处于空闲状态,反之则处于忙碌状态。
3、1602液晶显示一个字符的操作过程为:读状态--写指令--写数据--自动显示。
1)读状态要将待显字符写入液晶模块,首先就要检测LCD是否忙碌,只有在LCD处于空闲状态的时候,才能够将待显字符写入2)写指令写指令包括写显示模式控制指令和写入地址。
3)写数据写数据实际上是将待显字符的标准ASCII码写入LCD的数据显示存储器(DDRAM)4)自动显示数据写入液晶模块后,字符产生器(CGROM)将自动读出字符的字形点阵数据,并将字符显示在液晶屏上,这个过程由LCD自动完成,无需人工干预4、1602液晶的初始化过程使用1602液晶显示字符之前,需要对其显示模式进行初始化设置,过程如此下:1)延时15ms,给液晶一段反应时间2)写指令0x38H,尚未开始工作,所以这里不需要检测忙信号,将液晶的显示模式设置为“16*2显示,5*7点阵,8位数据接口”3)延时5ms4)写指令,不需要检测忙信号5)延时5ms6)写指令,不需要检测忙信号7)延时5ms(连续设置3次,确保设置成功)8)以后每次写指令,读/写数据操作都要检测忙信号5、在keil c51中新建工程ex51,编写如下程序代码,编译并生成ex51.hex文件//用LCD显示字符'A'#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本人对单片机的一些了解,在这里和大家分享。
(1)基于AT89C52的同步串口通信①单片机1程序(程序在Kile C51上运行通过。
)/******************************************************************** * 文件名:液晶1602显示.c* 描述: 该程序实现了对液晶1602的控制。
* 创建人:东流,2009年4月10日* 版本号:2.0***********************************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned int//这三个引脚参考资料sbit E=P3^5; //1602使能引脚sbit RW=P3^6; //1602读写引脚sbit RS=P3^7; //1602数据/命令选择引脚sbit aaa=P1^0;sbit bbb=P1^1;sbit aa=P3^0;sbit bb=P3^1;/******************************************************************** * 名称: delay()* 功能: 延时,延时时间大概为140US。
* 输入: 无* 输出: 无***********************************************************************/void delay(){int i,j;for(i=0; i<=100; i++)for(j=0; j<=20; j++);}/********************************************************************* 名称: enable(uchar del)* 功能: 1602命令函数* 输入: 输入的命令值* 输出: 无***********************************************************************/void enable(uchar del){P2 = del;RS = 0;RW = 0;E = 0;delay();E = 1;delay();}/********************************************************************* 名称: write(uchar del)* 功能: 1602写数据函数* 输入: 需要写入1602的数据* 输出: 无***********************************************************************/void write(uchar del){P2 = del;RS = 1;RW = 0;E = 0;delay();E = 1;delay();/********************************************************************* 名称: L1602_init()* 功能: 1602初始化,请参考1602的资料* 输入: 无* 输出: 无***********************************************************************/ void L1602_init(void){enable(0x01);enable(0x38);enable(0x0c);enable(0x06);enable(0xd0);}/********************************************************************* 名称: L1602_char(uchar hang,uchar lie,char sign)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')* 输入: 行,列,需要输入1602的数据* 输出: 无***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign){uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;enable(a);write(sign);}/********************************************************************* 名称: L1602_string(uchar hang,uchar lie,uchar *p)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")* 输入: 行,列,需要输入1602的数据* 输出: 无***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p)uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;enable(a);while(1){if(*p !='\0')write(*p);else break;p++;}}/********************************************************************* 名称: Main()* 功能: 主函数* 输入: 无* 输出: 无***********************************************************************/ void Main(){uchar k[]="sbuf data:";uchar i = 122,j=1,ti=14;aaa=1;bbb=1; aa=1;bb=1;SM0=0;SM1=0;SM2=0;REN=1;L1602_init();L1602_char(1,5,SBUF);L1602_string(1,1,k);while(ti>=0){ while(1){if(aaa==0){bbb=0;break;}}aaa=1;bbb=1;i--;i--;i--;i--;i--;RI=0;while(1){if(RI!=0)break;}L1602_char(2,j,SBUF);j++;ti--;}REN=0;RI=1;while(5)i=0;}②单片机2程序#include<reg52.h>sbit a=P2^0;sbit b=P2^1;sbit C=P3^1;void main(){int i=0 ,j=0;char str[20]=" ";a=1;b=1;SM0=0;SM1=0;SM2=0;//RI=0;while(j<=14){for(i=0;i<=100;i++);a=0;//SBUF=0;while(1){ if(b==0)break;}b=1;a=1;SBUF=str[j];TI=0;j++;}while(1);(2)基于MSP430的科学计算器单片机程序:(程序在IAR430上运行通过。
)#include <msp430x24x.h>#include <STDLIB.h>#include <STRING.h>#include <float.h>#include <math.h>unsigned char dis1[]="WORK START"; //状态显示unsigned char dis2[]="ALCOHOL TEST";char dis,j,a,c,cls[]=" ";char ak,ch=1,aa[20],bb[20];char i=0,n=0,m=0,flag=1,pf=1,dnf=0,deng=0,du=0;double sum=0,sum1=0;//int c=7;void delay(unsigned char ms)//延时1{ unsigned char i,j;while(ms--){ for(i=0;i<65;i++)for(j=0;j<50;j++){}}}void delay2(unsigned int time ) //延时2{unsigned int n;n=0;while (n<time){ n++;}return;}char lcd_bz() //LCD判忙{char result;P4OUT=0X8E;//rs=0;//rw=1;//ep=1;P1DIR=0X00;result=P1IN&0x80;//ep=0;P4OUT=0X8A;return result;}lcd_wcmd(unsigned char cmd) //写指令数据到LCD {while(lcd_bz())//rs=0;//rw=0;//ep=1;P4OUT=0X8c;P1DIR=0XFf;P1OUT=cmd;//ep=1;P4OUT=0X8C;//ep=0;P4OUT=0X88;lcd_pos(unsigned char pos)//设定显示位置{lcd_wcmd(pos | 0x80);}lcd_wdat(unsigned char dat)//写入显示数据到LCD{while(lcd_bz());//rs=1;//rw=0;//ep=0;P4OUT=0X89;P1DIR=0Xff;P1OUT=dat;//ep=1;P4OUT=0X8D;//ep=0;P4OUT=0X89;}lcd_init() //LCD初始化{lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x01);delay(1);}unsigned char key_scan(){unsigned char t,k1,k2,key;unsigned int kt;P3DIR=0X00;P5DIR=0Xff;// P3OUT=0XFF;P5OUT=0x00;// P3DIR=0X00;// P3IN|=0XFF;// P3DIR=0X00;t=P3IN;// P3DIR=0XFF;// P6DIR=0XFF;if(t!=0xFF){delay(10);// P3DIR=0X00;t=P3IN;// P3DIR=0XFF;// P6DIR=0X00;if(t!=0xFF){//P3DIR=0XFF;// P3DIR=0X00;k1=P3IN;P5OUT=0X00;P3DIR=0XFF;P5DIR=0X00;// P6OUT|=0xFF;P3OUT=0x00;// P3DIR=0XFF;// P3OUT=0xff;// P3OUT=0x00;P5DIR=0X00;// P6DIR=0X00;// P6IN|=0XFF;k2=P5IN;P2DIR=0XFF;P2OUT=k2;P3OUT|=0X00;// k2|=0xC0;kt=k1;kt=kt<<8;kt+=k2;switch(kt){case 0xFEFE: key='3';break;case 0xFDFE: key='2';break;case 0xfbfe: key='1';break;case 0xf7fe: key='B';break;case 0xeffe: key='U';break;//2ndf// case 0xdffe: key=23;break;// case 0xbffe: key=22;break;case 0xfEFD: key='6';break;case 0xFDFD: key='5';break;case 0xfbfd: key='4';break;case 0xf7fd: key='t';break;case 0xeffd: key='r';break;//du/rad // case 0xdffd: key=16;break;// case 0xbffd: key=15;break;case 0xfefb: key='9';break;case 0xfdfb: key='8';break;case 0xfbfb: key='7';break;case 0xf7fb: key='s';break;case 0xeffb: key='Z';break;//sin// case 0xdffb: key=9;break;// case 0xbffb: key=8;break;case 0xfef7: key='c';break;case 0xfdf7: key='.';break;case 0xfbf7: key='0';break;case 0xf7f7: key='k';break;//^ycase 0xeff7: key='y';break;//cos// case 0xdff7: key=2;break;// case 0xbff7: key=1;break;case 0xfeef: key='/';break;case 0xfdef: key='-';break;case 0xfbef: key='P';break;case 0xf7ef: key='D';break;// 1/xcase 0xefef: key='a';break;//tan// case 0xdfef: key=2;break;// case 0xbfef: key=1;break;case 0xfedf: key='=';break;case 0xfddf: key='*';break;case 0xfbdf: key='+';break;case 0xf7df: key='p';break;//pi/ecase 0xefdf: key='l';break;//log // case 0xdfdf: key=2;break;// case 0xbfdf: key=1;break;default: key=32;break;}return key;}else return(32);}else return(32);}void gcvt(){char p[20]="",p1[20]="",k=0;char i=0,b=0;double z;unsigned long y;if(sum<0){p[k]='-';sum=0-sum;k++;}y=(unsigned long)sum;z=sum-y;if(y){while(y){p1[b]=y%10+0x30;y/=10;b++;}}elsep1[0]=0+0x30;b=strlen(p1);for(i=0;i<strlen(p1);i++,k++,b--)p[k]=p1[b-1];for(i=0;i<20;i++){aa[i]=0;p1[i]=0;}k=0;i=0;p1[k]='.';k++;while((z!=0.0)&&(i!=6)){z=z*10;y=(int)(z);z-=y;p1[k]=y+0x30;k++;i++;}for(i=0;i<20;i++)aa[i]=0;strcat(p,p1);strcpy(aa,p);}void cls_one(){char cl=0,cc=16;lcd_pos(0);while(cc) //显示开始工作{lcd_wdat(cls[cl]);cl++;cc--;}return;}void cls_two(){char cl=0,cc=16;lcd_pos(0x40);while(cc) //显示开始工作{lcd_wdat(cls[cl]);cl++;cc--;}return;}void main(){//double dou;char jj=0, p='-',di=0;P4DIR=0Xff;P1DIR=0Xff;P6DIR=0Xff;P6OUT=0X00;P6OUT|=BIT4;//数据初始化lcd_init();delay(3);lcd_pos(0);dis=0;while(dis1[dis]!='\0') //显示开始工作{lcd_wdat(dis1[dis]);dis++;}delay(3);dis=0;lcd_pos(0x43);while(dis2[dis]!='\0') //显示开始测试{lcd_wdat(dis2[dis]);dis++;}delay(100);lcd_init();delay(3);lcd_pos(0x40);lcd_wdat(0x30);dis=0;while(1){ak=key_scan();switch(ak) //选择键值{case 32:break; // 无case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':if(flag){lcd_init();for(j=0;j<20;j++)aa[j]=0;flag=0;}if(m==1)i=n;a=ak;aa[i]=ak;i++;deng=0;m=0;lcd_pos(dis);if(dis==15)dis=0x3f;dis++;lcd_wdat(a);break;case '+':case '-':case '*':case '/':if(deng)cls_one();c=ak;strcpy(bb,aa);n=i;for(j=0;j<20;j++)aa[j]=0;i=0;flag=0;pf=2;m=0;lcd_pos(dis);dis++;lcd_wdat(c);if(dis==15)dis=0x3f;break;case '=':sum1=atof(aa);sum=atof(bb);switch(c){case '+':sum=sum+sum1;break;case '-':sum=sum-sum1;break;case '*':if(sum==sum1){sum=sum-1;sum=sum*sum1+sum1;} else sum=sum*sum1;break;case '/':sum=sum/sum1;break;case '^':sum=pow(sum,sum1);break;case '@':sum1=1/sum1;sum=pow(sum,sum1);break;default:goto lloop;}gcvt();flag=1;lloop://lcd_init();cls_two();delay(1);lcd_pos(0x40);dis=strlen(aa);j=0;while(dis) //显示开始测试{// aa[j]+=0x30;lcd_wdat(aa[j]);dis--;j++;}for(j=0;j<20;j++)bb[j]=0;i=0;c=0;pf=1;n=0;dis=0;deng=1;m=0;sum=0;sum1=0;break;case '.':a='.';aa[i]='.';i++;lcd_pos(dis);if(dis==15)dis=0x3f;dis++;lcd_wdat(a);break;case 'c':lcd_init();for(int j=0;j<20;j++){ aa[j]=0;bb[j]=0;}i=0;flag=1;c=0;du=0;pf=1;n=0;dnf=0,deng=0,dis=0;sum=0;sum1=0;m=0;lcd_pos(0x40);lcd_wdat(0x30);if(du){P6OUT&=~BIT4;P6OUT|=BIT2;} else {P6OUT&=~BIT2;P6OUT|=BIT4;}if(dnf)P6OUT|=BIT0;else P6OUT&=~BIT0;break;case 'D':sum1=atof(aa);sum=1/sum1;gcvt();flag=1;goto lloop;case't':sum1=atof(aa);sum=atof(aa);sum=sum-1;sum=sum*sum1+sum1;gcvt();flag=1; goto lloop;case's':sum1=atof(aa);;sum=atof(aa);sum=sum-1;sum=sum*sum1+sum1;sum*=sum1;gcvt();flag=1;goto lloop;case 'B':if(i!=0){i--;aa[i]='\0';cls_one();delay(1);di=0;di=strlen(bb);jj=0;if(c!=0){lcd_pos(0);while(di) //显示开始测试{lcd_wdat(bb[jj]);di--;jj++;}di=strlen(bb);lcd_pos(di);lcd_wdat(c);jj=0;di++;delay(1);}lcd_pos(di);di=strlen(aa);while(di) //显示开始测试{lcd_wdat(aa[jj]);di--;jj++;}}else{if(c!=0){c=0;cls_one();delay(1);di=0; lcd_pos(0);di=strlen(bb);jj=0;while(di) //显示开始测试{lcd_wdat(bb[jj]);di--;jj++;}}elseif(n!=0){n--;bb[n]='\0';cls_one();delay(1);di=0;lcd_pos(0);di=strlen(bb);jj=0;while(dis) //显示开始测试{lcd_wdat(bb[jj]);dis--;jj++;}m=1;}strcpy(aa,bb);}flag=0;if(c!=0)dis=strlen(bb)+i+1;else dis=strlen(aa);break;case 'P':if(i==0){if(pf==1){cls_one();}for(jj=0;jj<20;jj++)aa[jj]=0;aa[0]='-';i++;flag=0;pf=2;lcd_pos(dis);lcd_wdat(p);dis++;}else{dis=0;sum=atof(aa);sum=0-sum;gcvt();cls_one();di=strlen(bb);jj=0;if(c!=0){lcd_pos(dis);while(di) //显示开始测试{lcd_wdat(bb[jj]);di--;jj++;}di=strlen(bb);lcd_pos(dis+di);lcd_wdat(c);jj=0;dis++;delay(1);}lcd_pos(dis+di);di=strlen(aa);while(di) //显示开始测试{lcd_wdat(aa[jj]);di--;jj++;}}flag=0;if(c!=0)dis=strlen(bb)+i+1;else dis=strlen(aa); break;case 'U':dnf=1-dnf;if(dnf)P6OUT|=BIT0;else P6OUT&=~BIT0;break;case 'Z':sum=atof(aa);if(du)sum=sum/180*3.1415926535897932384626433;if(dnf==0)sum=sin(sum);else {sum=atof(aa);;sum=asin(sum);if(du)sum=sum*180/3.14159265;}if(-0.000001<sum&&sum<0.000001)sum=0;gcvt();jj=0;cls_two();delay(1);lcd_pos(0x40);di=strlen(aa);while(di) //显示开始测试{lcd_wdat(aa[jj]);di--;jj++;}case 'y':sum=atof(aa);if(du)sum=sum/180*3.14159265;if(dnf==0)sum=cos(sum);else {sum=atof(aa);sum=acos(sum);if(du)sum=sum*180/3.14159265;}if(-0.000001<sum&&sum<0.000001)sum=0; gcvt();jj=0;cls_two();delay(1);lcd_pos(0x40);di=strlen(aa);while(di) //显示开始测试{lcd_wdat(aa[jj]);di--;jj++;}flag=1;i=0;dis=0;break;case 'a':sum=atof(aa);if(du)sum=sum/180*3.14159265;if(dnf==0)sum=tan(sum);else {sum=atof(aa);sum=atan(sum);if(du)sum=sum*180/3.14159265;}if(-0.000001<sum&&sum<0.000001)sum=0; gcvt();jj=0;cls_two();delay(1);lcd_pos(0x40);di=strlen(aa);while(di) //显示开始测试{lcd_wdat(aa[jj]);di--;jj++;}case 'p':if(dnf==0)sum=3.14159265;else sum=2.718281828;gcvt();jj=0;cls_one();delay(1);lcd_pos(0);di=strlen(aa);while(di) //显示开始测试{lcd_wdat(aa[jj]);di--;jj++;}flag=1;i=0;deng=1;break;case 'l':sum=atof(aa);if(dnf==0)sum=log10(sum);else sum=log(sum);gcvt();jj=0;cls_two();delay(1);lcd_pos(0x40);di=strlen(aa);while(di) //显示开始测试{lcd_wdat(aa[jj]);di--;jj++;}flag=1;i=0;deng=1;break;case 'k':if(dnf==0)c='^';else c='@';strcpy(bb,aa);n=i;for(int j=0;j<50;j++)aa[j]=0;i=0;flag=0;pf=2;m=0;lcd_pos(dis);dis++;lcd_wdat(c);if(dis==15)dis=0x3f;break;case 'r':du=1-du;if(du){P6OUT&=~BIT4;P6OUT|=BIT2;} else {P6OUT&=~BIT2;P6OUT|=BIT4;} break;default:break;}}}。