使用Proteus进行51程序设计和仿真

使用Proteus进行51程序设计和仿真

1. 绘制原理图

1) 添加元件

在keyword中搜索并添加添加AT89C51.LED-YELLOW,RES零件。
在这里插入图片描述

2) 摆放元件

(1)左击元件列表窗内的AT89C51芯片,然后在原理图编辑窗口内左击摆放。
在这里插入图片描述
(2)左击元件列表内的LED-YELLOW,再点击 旋转按钮 ,在原理图编辑框内摆放LED灯8个。
在这里插入图片描述
(3)再按照(2)的步骤依次摆放8个电阻,左键双击”10K“,弹出修改值的对话框,将10K修改为300,以至于让LED更亮。
在这里插入图片描述
(4)拉一条主线(左击一下起点,让后移动鼠标,然后双击一下终点,即可拉一条主线)
在这里插入图片描述
(5)连接管脚。(左击一下起点,左击一下终点即可连接)
在这里插入图片描述
(6)点击终端接口→选择POWER,放置电源,然后左键双击电源图标,修改为VCC,再点击OK。
在这里插入图片描述
(7)使用LBL为支线标记编号,连接到主线的支线,需要对支线进行编号才能正常连接。
在这里插入图片描述
(8)如此,LED流水灯原理图就制作完成。

2.编写51程序

1)创建一个工程

(1)打开Keil软件,点击Project>>New…
(2)在搜素框中输入AT89C51,再选中AT89C51芯片,然后点击OK。
在这里插入图片描述

2)编写main.c文件

(1)点击左上角新建文件,再在文本框内复制粘贴51程序代码。然后保存代码为.c后缀文件。

//51单片机编程常用的头文件
	#include <reg51.h>
	#include <intrins.h>
	//延迟函数
	void delay_ms(int a)
	{
		int i,j;
		for(i=0;i<a;i++)
		{
			for(j=0;j<1000;j++) _nop_();
	
		}
	}
	
	void main(void)
	{
		while(1)
		{
			P0=0xfe;
			delay_ms(50);
			P0=0xfd;
			delay_ms(50);
			P0=0xfb;
			delay_ms(50);
			P0=0xf7;
			delay_ms(50);
			P0=0xef;
			delay_ms(50);
			P0=0xdf;
			delay_ms(50);
			P0=0xbf;
			delay_ms(50);
			P0=0x7f;
			delay_ms(50);
		}
	}

(2)右键点击 Source Group 1 ,再点击 Add Existing Files to Group “Source Group 1“
在这里插入图片描述
(3)选中刚才创建的.c文件,点击add。
在这里插入图片描述

3)生成.hex文件

(1)点击魔法棒,在弹出的窗口内选择 Output ,再勾选 Create HEX File ,然后点击 OK。
在这里插入图片描述
(2)点击编译按钮,进行编译,编译成功并生成了两个头文件。
在这里插入图片描述

3.开始仿真

(1)回到Proteus软件的原理图内,双击 AT89C51 芯片后,在弹出的窗口的 Program File 一栏从刚才 keil 软件编译后的路径中添加 .hex 文件,再点击 OK 。
在这里插入图片描述
(2)点击调试按钮开始仿真。
结果:

  • 12
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Proteus单片机设计仿真51单片机220个Proteus仿真实例源码文件: 100000秒以内的计时程序.DSN 10秒的秒表 (2).DSN 10秒的秒表.DSN 12864LCD显示24C08保存的开机画面.DSN 12864LCD显示EPROM2764保存的开机画面.DSN 12864LCD显示计算器键盘按键实验.DSN 12864图形液晶滚动演示.DSN 160128LCD中文显示温度与时间.DSN 160128LCD图文演示.DSN 160128液晶中文显示ADC0832两路模数转换结果.DSN 160128液晶显示当前压力.DSN 160128液晶曲线显示ADC0832两路模数转换结果.DSN 1602LCD显示仿手机键盘按键字符.DSN 1602LCD显示电话拨号键盘按键实验.DSN 1602LCD显示的秒表.DSN 1602LCD随机模拟显示乘法口诀.DSN 1602字符液晶滚动演示程序.DSN 1602液晶显示DS1302实时时钟.DSN 16×16点阵屏-四块8x8并排的效果.DSN 24C04与数码管.DSN 2×20串行字符液晶演示.DSN 4×4键盘矩阵控制条形LED显示 (2).DSN 4×4键盘矩阵控制条形LED显示.DSN 555定时器实验.DSN 6264扩展内存.DSN 74HC154译码器应用.DSN 74HC595串入并出芯片应用.DSN 74LS138译码器应用.DSN 74LS148扩展中断.DSN 8×8LED点阵屏仿电梯数字滚动显示.DSN 8×8LED点阵屏显示数字.DSN 8只数码管显示多个不同字符.DSN 8只数码管滚动显示单个数字 (2).DSN 8只数码管滚动显示单个数字.DSN 8只数码管滚动显示数字串.DSN ADC0808 PWM实验.DSN ADC0809模数转换与显示.DSN ADC0832模数转换与显示.DSN BCD译码数码管显示数字.DSN DS1621温度传感器实验.DSN DS18B20温度传感器实验.DSN LED模拟交通灯 (2).DSN LED模拟交通灯.DSN MAX7221控制数码管动态显示.DSN PCF8591模数与数模转换实验.DSN T0控制LED实现二进制计数.DSN TIMER0与TIMER1控制条形LED.DSN TIMER0控制单只LED闪烁 (2).DSN TIMER0控制单只LED闪烁.DSN TIMER0控制四只LED滚动闪烁.DSN TIMER0控制流水灯 (2).DSN TIMER0控制流水灯.DSN tu1.DSN 串口发送数据到2片8×8点阵屏滚动显示.DSN 串行数据转换为并行数据.DSN 交通灯控制器.DSN 从左到右的流水灯 (2).DSN 从左到右的流水灯.DSN 光耦控制点亮和延时关闭照明设备.DSN 单只数码管循环显示0-9 (2).DSN 单只数码管循环显示0-9.DSN 单片机与PC机串口通讯仿真.DSN 单片机之间双向通信.DSN 单片机向主机发送字符串.DSN 单片机系统中自制硬件字库的应用.DSN 可以调控的走马灯.DSN 可演奏的电子琴.DSN 字符液晶显示的频率计.DSN 定时器控制交通指示灯.DSN 定时器控制数码管动态显示 (2).DSN 定时器控制数码管动态显示.DSN 左右来回的流水灯 (2).DSN 左右来回的流水灯.DSN 左右来回的流水灯.PWI 并行数据转换为串行数据.DSN 开关控制12864LCD串行模式显示.DSN 开关控制LED.DSN 开关控制报警器.DSN 报警器与旋转灯.DSN 按键发音.DSN 按键控制8×8LED点阵屏显示图形.DSN 按键控制定时器选播多段音乐.DSN 按键控制定时器选播多段音乐.PWI 按键选播电子音乐.DSN 按键选播电子音乐.PWI 播放一段音乐 (2).DSN 播放一段音乐.DSN 数码管显示4×4键盘矩阵按键 (2).DSN 数码管显示4×4键盘矩阵按键.DSN 数码管显示拨码开关编码.DSN 数码管显示的温控电机.DSN 数码管显示的频率计.DSN 数码管闪烁显示.DSN 数码管随机模拟显示乘法口诀.DSN 模拟射击游戏.DSN 正反转可控的步进电机.DSN 正反转可控的直流电机.DSN 温度控制直流电机转速.DSN 演奏一段音阶.DSN 用1602LCD与DS18B20设计的温度报警器.DSN 用1602LCD设计的可调式电子钟.DSN 用24C04与1602LCD设计电子密码锁.DSN 用74HC595与74LS154设计的16×16点阵屏.DSN 用8051与1601LCD设计的计算器.DSN 用8255与74LS154设计的16×16点阵屏.DSN 用8255实现接口扩展.DSN 用ADC0808设计的调温报警
proteus软件仿真 部分文件原创~~ 资料很全~~学习中各个过程的难题都有例子 文件头—————————————————————————————————————————必要 #include #define uint unsigned int #define uchar unsigned char 移位函数——————————————————————————————————————————走马灯 #include temp=_cror_(temp,1); 数码管数字代码———————————————————————————————————————从0到15 正 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; 反 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90}; 延时函数——————————————————————————————————————————z毫秒 #define uint unsigned int #define uchar unsigned char void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 定时器0使用——————————————————————————————————————工作方式1 TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; void time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; } 定时器1使用———————————————————————————————————————工作方式1 TMOD=0x11; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET1=1; TR1=1; void time1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; } 外部中断0使用————————————————————————————————————————检测下降沿 EA=1; EX0=1; IT0=1; TCON=0x01; 数码管显示数字函数——————————————————————————————————————只显示百十个,可以扩展 void display(uchar bai,uchar shi,uchar ge) { P0=0xff; wela=1; P0=0xfe; wela=0; dula=1; P0=table[bai]; dula=0; delay(1); P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=table[shi]; dula=0; delay(1); P0=0xff; wela=1; P0=0xfb; wela=0; dula=1; P0=table[ge]; dula=0; delay(1); } 控制液晶—————————————————————————————————限16*2小液晶 sbit rs=P3^5; sbit e= P3^4 ; sbit wela=P2^7; sbit dula=P2^6; uchar love1[]={"i say love."}; uchar love2[]={"i love you."}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } int write_com(uchar com) { P0=com; rs=0; e=1; delay(5); e=0; } int write_date(uchar date) { P0=date; rs=1; e=1; delay(5); e=0; } init() { wela=0; dula=0; e=0; write_com(0x38); write_com(0x0e); write_com(0x06); write_com(0x01); write_com(0x80); } 串口通信——————————————————————————————————————————波特率 9600 TMOD=0x20; TH1=0xfd; //9600 TL1=0xfd; PCON=0x00; SCON=0x50;//方式1 EA=1; ES=1; TR1=1; ES=0; SBUF=**; while(!TI); TI=0; ES=1; void ser() interrupt 4 { **=SBUF; RI=0; } IIC总线的应用————————————————————————————————————————————————EEPROM上测试 sbit sck=P2^1; sbit sda=P2^0; sbit ACC7=ACC^7; sbit ACC0=ACC^0; void delay(int z) { uchar i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void deluy() {;;} void start() { sda=1; deluy(); sck=1; deluy(); sda=0; deluy(); } void stop() { sda=0; deluy(); sck=1; deluy(); sda=1; deluy(); } respond() { uchar i; sck=1; while(sda!=0&&i<250)i++; sck=0; deluy(); } void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; sck=0; deluy(); sda=CY; deluy(); sck=1; deluy(); } sck=0; deluy(); sda=1; deluy(); } uchar read_byte() { uchar i; sck=0; deluy(); sda=1; deluy(); for(i=0;i<8;i++) { ACC<<=1; sck=1; deluy(); ACC0=sda; sck=0; } return ACC; } write_date(uchar add,uchar date) { start(); write_byte(0xa0); respond(); write_byte(add); respond(); write_byte(date); respond(); stop(); } read_date(uchar add) { uchar k; start(); write_byte(0xa0); respond(); write_byte(add); respond(); start(); write_byte(0xa1); respond(); k=read_byte(); stop(); return k; } DS18b28的应用—————————————————————————————————————————————一些寄存器可以按需修改 bit DS18B20_init() { bit flag; DQ=1; for(time=0;time<2;time++); DQ=0; for(time=0;time<200;time++); DQ=1; for(time=0;time<10;time++); flag=DQ; for(time=0;time<200;time++); return (flag); } void writecom(uchar com) { uchar i; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; DQ=com&0x01; for(time=0;time<10;time++); DQ=1; for(time=0;time>=1; } for(time=0;time<4;time++); } uchar readdat() { uchar i,dat; dat=0; for(i=0;i>=1; _nop_(); DQ=1; for(time=0;time<2;time++); if(DQ==1) dat|=0x80; else dat|=0x00; for(time=0;time<8;time++); } return(dat); } void get_temp() { DS18B20_init(); writecom(0xCC); writecom(0x44); for(time=0;time<100;time++); DS18B20_init(); writecom(0xCC); writecom(0xBE); } void main() { uchar i,tl,th; uchar zhen,xiao; while(1) { get_temp(); tl=readdat(); th=readdat(); zhen=(th*256+tl)/16; xiao=(tl%16)*10/16; } } AD转换——————————————————————————————————————————————ADC0804,其他不适用,temp 0~255之间 关键是接口 sbit wr=P3^6; sbit rd=P3^7; sbit cs=P3^2; void init() { cs=0; } void start() { wr=1; wr=0; wr=1; } void huoqu () { uchar temp; temp=0; start(); rd=0; temp=P1; rd=1; retrn temp; } DA转换—————————————————————————————————————————————关键是接口 sbit wr=P3^6; sbit da=P3^2; init() { da=0; } start() { wr=1; wr=0; wr=1; } 键盘的使用—————————————————————————————————————————4X4 含消抖效果 uchar key; void scan(void) { uchar scode,rcode; P3=0xf0; if((P3&0xf0)!=0xf0) { delay(5); if((P3&0xf0)!=0xf0) { scode=0xfe; while((scode&0x10)!=0) { P3=scode; if((P3&0xf0)!=0xf0) { rcode=(P3&0xf0)|0x0f; key=(~scode)+(~rcode); switch(key) { case 0x11:key=0;break; case 0x21:key=1;break; case 0x41:key=2;break; case 0x81:key=3;break; case 0x12:key=4;break; case 0x22:key=5;break; case 0x42:key=6;break; case 0x82:key=7;break; case 0x14:key=8;break; case 0x24:key=9;break; case 0x44:key=10;break; case 0x84:key=11;break; case 0x18:key=12;break; case 0x28:key=13;break; case 0x48:key=14;break; case 0x88:key=15;break; default : key=16;break; } } else scode=(scode<<1)|0x01; } } } else key=16; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值