基于protuse的单片机模拟的实例

合集下载

8051单片机Proteus仿真实例2(原理图+C程序)

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软件的单片机软硬件仿真实验

基于Protues软件的单片机软硬件仿真实验
题 。如英 国 L b e t 公 司推 出 的 Po e 软 件采 用虚 拟技 术解决 了单片机 及 其外 围 电路 的设 计 和协 同 a c ne r rt s u 仿 真 的问题 ,无 需硬 件 实验 平 台 ,利 用个 人 计 算机 进 行单 片 机软 硬 件 同步 仿 真 ,仿 真 结 果 可直 接 运 用 于真 实设 计 ,优 点不 言 而喻 。下 面 以 L D流水 广告 灯实 验 为例谈 谈 单 片机 教学 中如何 利 用 Po e E rt s u 进 行 单 片机 软硬件 仿 真 。

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实例

PROTEUS仿真100实例
4
《单片机 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仿真

《单片机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单片机的最小工作系统

基于proteus的51单片机仿真实例九、51单片机的最小工作系统1、前面我们已经利用proteus和keil c51建立了第一个仿真实例,并通过仿真运行验证了我们的实例的正确性。

现在我们已经了解了proteus和keil c51的基本操作。

2、但是毕竟是初学单片机,对于我们前面编写的程序所实现的功能可就是一头雾水,不知所云了。

那么接下来我们就了解一下51单片机的知识吧3、先来简单说说怎么学习单片机。

前面已经说过,单片机是一种软件和硬件紧密结合的技术,对于一个单片机应用系统来说,硬件电路是单片机系统运行的基础和保障,软件程序是单片机系统的灵魂。

相对于人来说,人的身体、四肢是一个硬件系统,大脑就是软件系统,只有通过大脑发出指令,身体的各个部分才会做出相应的动作,但是如果手被绑住了,大脑即使发出让手去拿一个杯子的指令,手也无法完成这个指令。

所以软件和硬件需要相互结合才能够去完成一项任务。

1)就像我们新买了一台电视机一样,买回来后我们会首先了解一下这个电视机的功能特点,看一下遥控器的说明书,给电视机加上电源和天线(或有线电视信号线),然后按照说明书的使用方法来一步一步熟悉和操作电视机。

单片机的学习也一样,我们接触到一种单片机后,首先要了解这种单片机的功能和性能特点,然后才能进行相应的开发设计。

怎么来了解一种单片机呢?单片机厂家提供的数据手册是第一手也是最准确的资料。

但是很多数据手册是英文的,对于我们很多人来说,看起来会比较吃力。

不过幸运的是,现在很多资料都已经被翻译过来了。

我们到网上搜索一下,会搜索到很多的中文数据手册和应用实例,所以网络现在已经成为我们学习的一个非常重要的工具和平台了。

2)单片机的结构是十分复杂的,我们打开一个单片机的数据手册,会发现前面里面到处充斥着结构图和理论知识的介绍,相信对于一个新手来说,看数据手册不到10分钟就想放弃。

但是很多人说,这些是最基础的,必须要理解和掌握。

确实,这些东西我们必须精通,但是是不是一开始就要完全精通这些呢?大可不必。

实验一:单片机仿真初步(二)-Proteus的使用

实验一:单片机仿真初步(二)-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实例

(完整版)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程序)

8051单片机Proteus仿真实例3(原理图+C程序)
while(key==0);
}
}
}
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};
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}}}。

相关文档
最新文档