Proteus仿真单片机实例
基于Proteus的单片机设计仿真
第三, 实例的难度要由浅入深、 循序渐进, 并呈
础。 教学实践证明, VB 是一 门 集 知 识 和 技 能 于 一 体 、 现出一定的梯度。
逻辑分析和实践操作都很强的课程, 且由于教学内容
总之, 实例要以教学的内容为依据, 以现实的对
枯燥、 难懂, 学生学起来非常困难, 甚至会产生放弃 象为材料, 既要包含基本的教学知识点, 又要调动学
·职 业 教 育
2009年1月 总第138期
149
览对象方位控制按钮、 仿真进程控制按钮、 预览窗口、 对象选择器窗口、 图形编辑窗口等。
标 (不用拖动), 将鼠标的指针靠近另一个元件的连接 点时, 接着鼠标的指针就会又出现一个 “×” 号, 表明 找到了该元件的连接点, 同时屏幕上出现了粉红色的 连接, 单击鼠标左键, 粉红色的连接线就变成了深绿 色, 该条连线绘制完成。 再用同样的方法绘制其他连 接线, 电路原理图的编辑就完成了。 如图 4 所示。
图 3 元件选择窗口 在 “Results” 的列表项中 , 双击 “AT89C51”, 则 可 将 “AT89C51” 添 加 至 对 象 选 择 器 的 窗 口 中 。 用 同 样的方法将 “CD4094” 和 “led-bargraph-red” 添加至 对象选择器窗口, 单击 “OK” 按钮, 结束对象选择。 经过以上操作, 在对象选择器窗口中, 已有了 CD4094、 AT89C51、 led-bargraph-red 这三个元器件对 象。 在对象选择器的窗口中, 选中 CD4094, 将鼠标置 于图形编辑窗口该对象的欲放位置、 单击鼠标左键, 从而完成放置。 同理, 将 AT89C51 和 led-bargraph-red 放置到图形编辑窗口中。 接下来, 用导线连接各接点: Proteus 的 智 能 化 可 以在你想要画线的时候进行自动检测。 当鼠标的指针 靠近元件的连接点时, 跟着鼠标的指针就会出现一个 “×” 号, 表明找到了连接点; 单击鼠标左键, 移动鼠
基于Proteus的单片机系统的仿真设计
如 模 拟 分 析 、 字 分析 、 合 信 号 分 析 、 率 分 析 等 有 各种 虚 拟 数 混 频
仪器 , 如示 波 器 、 辑 分 析 仪 、 号 发 生 器 、 数 器 、 表 等 。 和 可 简 化单 片机 程序 在 目标 硬 件 上 的调 试 工 作 .加 快 工 程 项 目的 逻 信 计 电 能 K i Ma a e , f b等 编 译 软 件 整 合 使 用 。 到 更 好 的 仿 真效 果 。 仿 真 开 发 过 程 , 低 开 发 成 本 。 需 要 注 意 的 是 , 真 不 能 完 全 代 替 实 l l 达 该 降 仿
空航 天 大 学 出版社 . 0 . 2 6 0 3 王锋 . 于 P oe s 数 字 时 钟 设 计 与 仿 真 卟 福 建 电 脑 ,0 91 : 5 . 基 rtu 的 2 0 ,01 - 3
1 6 3 .
4王 瑞 萍 . 于 Poe s 单 片 机 虚 拟 开 发 环 境 o. 代 电 子 技 术 , 0 ,: . 基 rtu 的 】现 2 98 0
16 4
福
建 电
脑
21 0 0年 第 6期
基 于 Po u 的 单 片 机 系统 的仿真 设计 rt s e
刘 艳 ,张 文 超 ,秦 鑫
(新 乡 医 学 院生 命 科 学技 术_ 河 南 新 乡 4 3 0 系 5 0 31 【 摘 要 】 介 绍 了利 用 P o u 开 发 单 片机 系 统 的 仿 真 设 计 方 法 。基 于 Po u 的 单 片 机 虚 拟 开 发 环 境 可 以 完 成 单 片 : rt s e rt s e
l i是 德 国 K i公 司 开发 的单 片机 编译 器 .是 一 种 集 成 化 (l e e l 参考文献: . 沈 郭 8 1单 片机 实 践 与 应 用 [ . 京 : 华 大学 0 M】北 清 的 文 件 管 理 编 译 环 境 , 编 辑 、 译 和 程 序 仿 真 等 于 一 体 。 用 1昊 金 戌 , 庆 阳春 , 庭 吉 . 5 集 编 可
仿真单片机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语言进行程序设计的基本步骤和要点。
不过请注意,由于具体的硬件和开发环境可能会有所不同,因此具体的步骤可能会有所不同。
《单片机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此后变红灯,东西向变绿灯,如此重复。
单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1
《单片机C说话程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基本程序设计01 闪耀的LED/* 名称:闪耀的LED解释:LED按设定的时光距离闪耀*/#include<reg51.h>#define uchar unsignedchar#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,0 xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0 xc3,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,0xff,0 x0f,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,0 xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0 xf8,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,0 x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0 xc3,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,0xff,0 x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0 xdf,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,0 xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0 xff,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此后变红灯,器械向变绿灯,如斯反复.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit 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; //闪耀次数,操纵类型变量//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//交通灯切换void Traffic_Light(){switch(Operation_Type){case 1: //器械向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case 2: //器械向黄灯闪耀,绿灯封闭DelayMS(300);YELLOW_A=~YELLOW_A;GREEN_A=1;if(++Flash_Count!=10) return; //闪耀5次Flash_Count=0;Operation_Type=3;break;case 3: //器械向红灯,南北向绿灯亮RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;DelayMS(2000);Operation_Type=4;break;case 4: //南北向黄灯闪耀5次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1;if(++Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}06 单只数码管轮回显示0~9/* 名称:单只数码管轮回显示0~9解释:主程序中的轮回语句反复将0~9的段码送至P0口,使数字0~9轮回显示*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar 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(){uchar i=0;P0=0x00;while(1){ /* for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);} //注:另一计划 */P0=~DSY_CODE[i];i=(i+1)%10;DelayMS(300);}}07 8只数码管滚动显示单个数字/* 名称:8只数码管滚动显示单个数字解释:数码管从左到右依次滚动显示0~7,程序经由过程每次仅轮回选通一只数码管*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff; //封闭显示wei=_crol_(wei,1);P0=DSY_CODE[i]; //发送数字段码P2=wei; //发送位码DelayMS(300);}}}08 8只数码管动态显示多个不合字符电路如上图/* 名称:8只数码管动态显示多个不合字符解释:数码管动态扫描显示0~7.*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff;P0=DSY_CODE[i]; //发送段码wei=_crol_(wei,1);P2=wei; //发送位码DelayMS(2);}}}09 8只数码管闪耀显示数字串电路如上图/* 名称:8只数码管闪耀显示数字串解释:数码管闪耀显示由0~7组成的一串数字本例用动态刷新法显示一串数字,在停滞刷新时所稀有字显示消掉.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//位码表uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j;while(1){for(i=0;i<30;i++){for(j=0;j<8;j++){P0=0xff;P0=DSY_CODE[j]; //发送段码P2=DSY_IDX[j]; //发送位码DelayMS(2);}}P2=0x00; //封闭所稀有码管并延时DelayMS(1000);}}10 8只数码管滚动显示数字串电路如上图/* 名称:8只数码管滚动显示数字串解释:数码管向左滚动显示3个字符组成的数字串*/#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 };//下面数组看作环形队列,显示从某个数开端的8个数(10暗示黑屏)uchar Num[]={10,10,10,10,10,10,10,10,2,9,8};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j,k=0,m=0x80;while(1){ //刷新若干次,保持一段时光的稳固显示for(i=0;i<15;i++){for(j=0;j<8;j++){ //发送段码,采取环形取法,从第k个开端取第j个P0=0xff;P0=DSY_CODE[Num[(k+j)%11]];m=_crol_(m,1);P2=m; //发送位码DelayMS(2);}}k=(k+1)%11; //环形队列首支针k递增,Num下标规模0~10,故对11取余}}11 K1-K4 掌握LED移位/* 名称:K1-K4 掌握LED移位解释:按下K1时,P0口LED上移一位;按下K2时,P0口LED下移一位;按下K3时,P2口LED上移一位;按下K4时,P2口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++);}//依据P1口的按键移动LEDvoid Move_LED(){if ((P1&0x10)==0) P0=_cror_(P0,1); //K1else if((P1&0x20)==0) P0=_crol_(P0,1); //K2else if((P1&0x40)==0) P2=_cror_(P2,1); //K3else if((P1&0x80)==0) P2=_crol_(P2,1); //K4 }//主程序void main(){uchar Recent_Key; //比来按键P0=0xfe;P2=0xfe;P1=0xff;Recent_Key=0xff;while(1){if(Recent_Key!=P1){Recent_Key=P1; //保管比来按键Move_LED();DelayMS(10);}}}12 K1-K4 按键状况显示/* 名称:K1-K4 按键状况显示解释:K1.K2按下时LED点亮,松开时熄灭,K3.K4按下并释放时LED点亮,再次按下并释放时熄灭; */#include<reg51.h>#define ucharunsigned char#define uintunsigned intsbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit K1=P1^0;sbit K2=P1^1;sbit K3=P1^2;sbit K4=P1^3;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//主程序void main(){P0=0xff;P1=0xff;while(1){LED1=K1;LED2=K2;if(K3==0){while(K3==0);LED3=~LED3;}if(K4==0){while(K4==0);LED4=~LED4;}DelayMS(10);}}13 K1-K4 分组掌握LED/* 名称:K1-K4 分组掌握LED解释:每次按下K1时递增点亮一只LED,全亮时再次按下则再次轮回开端,K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后封闭所有LED*/#include<reg51.h>#define ucharunsigned char#define uintunsigned int//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//主程序void main(){uchar k,t,Key_State;P0=0xff;P1=0xff;while(1){t=P1;if(t!=0xff){DelayMS(10);if(t!=P1) continue;//取得4位按键值,由模式XXXX1111(X中有一位为0,其他均为1)//变成模式0000XXXX(X中有一位为1,其他均为0)Key_State=~t>>4;k=0;//检讨1地点地位,累加获取按键号kwhile(Key_State!=0){k++;Key_State>>=1;}//依据按键号k进行4种处理switch(k){case 1: if(P0==0x00) P0=0xff;P0<<=1;DelayMS(200);break;case 2: P0=0xf0;break;case 3: P0=0x0f;break;case 4: P0=0xff;}}}}14 K1-K4 掌握数码管移位显示/* 名称:K1-K4 掌握数码管移位显示解释:按下K1时加1计数并增长显示位,按下K2时减1计数并削减显示位,按下K3时清零.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff };//位码uchar code DSY_Index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //待显示到各数码管的数字缓冲(开端仅在0位显示0,其他黑屏)uchar Display_Buffer[]={0,10,10,10,10,10,10,10};//延时void DelayMS(uint x){uchar i;while(x--)for(i=0;i<120;i++);}void Show_Count_ON_DSY(){uchar i;for(i=0;i<8;i++){P0=0xff;P0=DSY_CODE[Display_Buffer[i]];P2=DSY_Index[i];DelayMS(2);}}//主程序void main(){uchar i,Key_NO,Key_Counts=0;P0=0xff;P1=0xff;P2=0x00;while(1){Show_Count_ON_DSY();P1=0xff;Key_NO=P1;//P1口按键状况分离为K1-0xfe,K2-0xfd,K3-0xfbswitch(Key_NO){case 0xfe: Key_Counts++;if(Key_Counts>8) Key_Counts=8;Display_Buffer[Key_Counts-1]=Key_Counts;break;case 0xfd: if(Key_Counts>0)Display_Buffer[--Key_Counts]=10;break;case 0xfb: Display_Buffer[0]=0;for(i=1;i<8;i++)Display_Buffer[i]=10;Key_Counts=0;}//若键未释放则仅刷新显示,不进行键扫描while(P1!=0xff) Show_Count_ON_DSY();}}15 K1-K4 掌握数码管加减演示/* 名称:K1-K4 掌握数码管加减演示解释:按下K1后加1计数,按下K2后减1计数,按下K3后清零.*/#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 };//待显示的3位缓冲uchar Num_Buffer[]={0,0,0};//按键代码,按键计数uchar Key_Code,Key_Counts=0;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++); }//显示函数void Show_Counts_ON_DSY(){uchar i,j=0x01;Num_Buffer[2]=Key_Counts/100;Num_Buffer[1]=Key_Counts/10%10;Num_Buffer[0]=Key_Counts%10;for(i=0;i<3;i++){j=_cror_(j,1);P0=0xff;P0=DSY_CODE[Num_Buffer[i]];P2=j;DelayMS(1);}}//主程序void main(){uchar i;P0=0xff;P1=0xff;P2=0x00;Key_Code=0xff;while(1){Show_Counts_ON_DSY();P1=0xff;Key_Code=P1;//有键按下时,数码管刷新显示30次,该行代码同时起到延时感化if(Key_Code!=0xff)for(i=0;i<30;i++) Show_Counts_ON_DSY();switch(Key_Code){case 0xfe: if(Key_Counts<255) Key_Counts++;break;case 0xfd: if(Key_Counts>0) Key_Counts--;break;case 0xfb: Key_Counts=0;}Key_Code=0xff;}}16 4X4矩阵键盘掌握条形LED显示/* 名称:4X4矩阵键盘掌握条形LED显示解释:运行本例时,按下的按键值越大点亮的LED越多.*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//矩阵键盘按键特点码表uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88}; //延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//键盘扫描uchar Keys_Scan(){uchar sCode,kCode,i,k;//低4地位0,放入4行P1=0xf0;//若高4位消失0,则有键按下if((P1&0xf0)!=0xf0){DelayMS(2);if((P1&0xf0)!=0xf0){sCode=0xfe; //行扫描码初值for(k=0;k<4;k++) //对4行分离进行扫描{P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++) //查表得到按键序号并返回if(kCode==KeyCodeTable[i])return(i);}elsesCode=_crol_(sCode,1);}}}return(-1);}//主程序void main(){uchar i,P2_LED,P3_LED;uchar KeyNo=-1; //按键序号,-1暗示无按键while(1){KeyNo=Keys_Scan(); //扫描键盘获取按键序号KeyNoif(KeyNo!=-1){P2_LED=0xff;P3_LED=0xff;for(i=0;i<=KeyNo;i++) //键值越大,点亮的LED越多{if(i<8)P3_LED>>=1;elseP2_LED>>=1;}P3=P3_LED; //点亮条形LEDP2=P2_LED;}}}17 数码管显示4X4矩阵键盘按键号/* 名称:数码管显示4X4矩阵键盘按键号解释:按下随意率性键时,数码管都邑显示其键的序号,扫描程序起首断定按键产生在哪一列,然后依据所产生的行附加不合的值,从而得到按键的序号.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbit BEEP=P3^7;//前次按键和当前按键的序号,该矩阵中序号规模0~15,16暗示无按键uchar Pre_KeyNo=16,KeyNo=16;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//矩阵键盘扫描void Keys_Scan(){uchar Tmp;P1=0x0f; //高4地位0,放入4行DelayMS(1);Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,经由过程异或把3个1变成0,独一的0变成1switch(Tmp) //断定按键产生于0~3列的哪一列{case 1: KeyNo=0;break;case 2: KeyNo=1;break;case 4: KeyNo=2;break;case 8: KeyNo=3;break;default:KeyNo=16; //无键按下}P1=0xf0; //低4地位0,放入4列DelayMS(1);Tmp=P1>>4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到转变的值switch(Tmp) //对0~3行分离附加肇端值0,4,8,12{case 1: KeyNo+=0;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;}}//蜂鸣器void Beep(){uchar i;for(i=0;i<100;i++){DelayMS(1);BEEP=~BEEP;}BEEP=0;}//主程序void main(){P0=0x00;BEEP=0;while(1){P1=0xf0;if(P1!=0xf0) Keys_Scan(); //获取键序号if(Pre_KeyNo!=KeyNo){P0=~DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;}DelayMS(100);}}18 开关掌握LED/* 名称:开关掌握LED解释:开关S1和S2分离掌握LED1和LED2. */#include<reg51.h>sbit S1=P1^0;sbit S2=P1^1;sbit LED1=P0^0;sbit LED2=P0^1;//主程序void main(){while(1){LED1=S1;LED2=S2;}}19 继电器掌握照明装备/* 名称:继电器掌握照明装备解释:按下K1灯点亮,再次按下时灯熄灭*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K1=P1^0;sbit RELAY=P2^4;//延时void DelayMS(uint ms){uchar t;while(ms--)for(t=0;t<120;t++);}//主程序void main(){P1=0xff;RELAY=1;while(1){if(K1==0){while(K1==0);RELAY=~RELAY;DelayMS(20);}}}20 数码管显示拨码开关编码/* 名称:数码管显示拨码开关编码解释:体系显示拨码开关所设置的编码000~255*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//各数字的数码管段码(共阴)uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示缓冲uchar DSY_Buffer[3]={0,0,0};//延时void DelayMS(uint ms){uchar t;while(ms--)for(t=0;t<120;t++);}//主程序void main(){uchar i,m,Num;P0=0xff;P2=0xff;while(1){m=0xfe;Num=P1; //读取拨码开关的值DSY_Buffer[0]=Num/100;DSY_Buffer[1]=Num/10%10;DSY_Buffer[2]=Num%10;for(i=0;i<3;i++)//刷新显示在数码管上{m=_crol_(m,1);P2=m;P0=DSY_CODE[DSY_Buffer[i]];DelayMS(10);}}}21 开关掌握报警器/* 名称:开关掌握报警器解释:用K1开关掌握报警器,程序掌握P1.0输出两种不合频率的声音,模仿很传神的报警后果*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit SPK=P1^0;sbit K1=P1^7;//发声函数void Alarm(uchar t){uchar i,j;for(i=0;i<200;i++){SPK=~SPK;for(j=0;j<t;j++); //由参数t行成不合的频率}}void main(){SPK=0;while(1){if(K1==1){Alarm(90);Alarm(120);}}}22 按键发音/* 名称:按键发音解释:按下不合的按键会是SOUNDER发出不合频率的声音.本例运用延时函数实现不合频率的声音输出,今后也可运用准时器*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit BEEP=P3^7;sbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++); }//按周期t发音void Play(uchar t){uchar i;for(i=0;i<100;i++){BEEP=~BEEP;DelayMS(t);}BEEP=0;}void main(){P1=0xff;BEEP=0;while(1){if(K1==0)Play(1);if(K2==0) Play(2);if(K3==0) Play(3);if(K4==0) Play(4);}}23 播放音乐/* 名称:播放音乐解释:程序运行时播放诞辰快活歌, 未运用准时器中止,所有频率完整用延时实现*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit BEEP=P3^7;//诞辰快活歌的音符频率表,不合频率由不合的延时来决议uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};//诞辰快活歌节奏表,节奏决议每个音符的吹奏长短uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//播放函数void PlayMusic(){uint i=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){ //播放各个音符,SONG_LONG为拍子长度for(j=0;j<SONG_LONG[i]*20;j++){BEEP=~BEEP;//SONG_TONE延时表决议了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);}DelayMS(10);i++;}}void main(){BEEP=0;while(1){PlayMusic(); //播放诞辰快活DelayMS(500); //播放完后暂停一段时光}}24 INT0中止计数/* 名称:INT0中止计数解释:每次按下计数键时触发INT0中止,中止程序累加计数, 计数值显示在3只数码管上,按下清零键时数码管清零*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//0~9的段码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 };//计数值分化后各个待显示的数位uchar DSY_Buffer[]={0,0,0};uchar Count=0;sbit Clear_Key=P3^6;//数码管上显示计数值void Show_Count_ON_DSY(){DSY_Buffer[2]=Count/100; //获取3个数DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0) //高位为0时不显示{DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0) //高位为0,若第二位为0同样不显示DSY_Buffer[1]=0x0a;}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];P2=DSY_CODE[DSY_Buffer[2]];}//主程序void main(){P0=0x00;P1=0x00;P2=0x00;IE=0x81; //许可INT0中止IT0=1; //降低沿触发while(1){if(Clear_Key==0) Count=0; //清0Show_Count_ON_DSY();}}//INT0中止函数void EX_INT0() interrupt{Count++; //计数值递增}。
单片机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此后变红灯,东西向变绿灯,如此重复。
实验一:单片机仿真初步(二)-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,如果元器件的方向不符合要求可使用预览对象方向控制按钮进行操作。
如用按钮对元器件进行顺时针旋转,用按钮对元器件进行逆时针旋转,用按钮对元器件进行左右反转,用按钮对元器件进行上下反转。
单片机c语言程序设计实例100例--基于805i+proteus仿真
以下是一个基于8051单片机和Proteus仿真环境的C语言程序设计实例:实例1:点亮LED灯
在这个例子中,我们将使用C语言编写一个简单的程序来控制8051单片机的一个I/O引脚,使其驱动一个LED灯。
c代码:
要使用Proteus进行仿真,你需要按照以下步骤操作:
1. 打开Proteus软件,创建一个新的设计工程。
2. 在元件库中搜索并添加相应的8051单片机型号(如AT89C51)和LED 元件到工作区。
3. 根据实际硬件连接,正确配置单片机的引脚和LED的连接。
4. 右键单击单片机元件,选择“Edit Component”打开编辑窗口。
5. 在“Program File(s)”区域,点击右侧的浏览按钮,选择你的C语言源文件(如上述的main.c)。
6. 点击“OK”关闭编辑窗口,然后点击工具栏上的“Play”按钮开始仿真。
在仿真过程中,你应该能看到LED灯被点亮,这表明你的C语言程序已经在Proteus环境中成功运行。
以上只是一个基础的例子,实际的"单片机C语言程序设计实例100例--基于8051+Proteus仿真"会包含更复杂和多样化的应用场景,包括定时器/计数器
应用、中断处理、串口通信、ADC/DAC转换、液晶显示等等。
每个实例都会详细介绍程序设计思路、代码实现以及如何在Proteus中进行仿真调试。
通过这些实例的学习和实践,你可以逐步掌握8051单片机的C语言编程技巧和Proteus仿真环境的使用方法。
基于Proteus的Arduino单片机仿真设计实践
• 19•研究了在Proteus 8.5电路仿真平台上进行Arduino单片机仿真设计的四种方法,并通过具体实例介绍了仿真中需要注意的问题。
其中两种方法是在Proteus中设计好仿真电路后,加载运行已有的HEX程序文件。
另外两种方法是在Proteus的同一个工程中实现电路的仿真设计和控制程序编写。
仿真电路中采用的Arduino单片机模型分原理图模块和仿真元件两种。
控制程序编写有C语言和可视化两种方式。
Proteus8.5具有仿真多款Arduino 单片机的功能,其中包括了Arduino Nano 3.x 、Arduino Nano 2.x 、Arduino Mega 2560、Arduino 328、Arduino 168以及Arduino UNO 等。
如果我们手头有一款Arduino UNO R3开发板用于学习单片机控制系统开发,那么结合Proteus 的Arduino 单片机仿真技术,可以帮助我们更快、更好地掌握Arduino 单片机开发技术。
下面以Arduino 328或Arduino UNO 为例介绍在Proteus 8.5中进行Arduino 单片机仿真设计的方法,并结合具体仿真实例介绍仿真中需要注意的问题(伍冯洁,Proteus 与Arduino 的整合在单片机系统开发中的应用:电子世界,2013)。
1 在Proteus8.5中进行Arduino单片机仿真设计的方法1.1 基于开发板或者固件创建项目如果想要直接在Proteus8.5中采用C 语言编写控制程序,并进行程序的编译和仿真运行,可以基于开发板或者固件创建仿真设计项目。
基于开发板创建仿真项目的方法是:选择File 菜单或者快捷工具栏中的New Project 命令,在New Project Wizard 窗口中选择From Development Board 选项,然后在出现的Development Board 列表中选择Arduino 328,设置好项目文件名称和保存路径后点击Finish 按钮,就创建了一个基于Arduino 328开发板的仿真设计项目。
单片机C语言程序设计实训100例_基于8051+Proteus仿真
《基于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 intvoid 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此后变红灯,东西向变绿灯,如此重复。
单片机C语言程序的设计实训100例_基于8051+PROTEUS仿真1
单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例目录第一篇基础程序设计 (1)01 闪烁的LED (1)02 从左到右的流水灯 (1)03 8只LED左右来回点亮 (2)04 花样流水灯 (3)05 LED模拟交通灯 (4)06 单只数码管循环显示0~9 (5)07 8只数码管滚动显示单个数字 (6)08 8只数码管动态显示多个不同字符 (7)09 8只数码管闪烁显示数字串 (8)10 8只数码管滚动显示数字串 (9)11 K1-K4 控制LED移位 (10)12 K1-K4 按键状态显示 (11)13 K1-K4 分组控制LED (12)14 K1-K4 控制数码管移位显示 (13)15 K1-K4 控制数码管加减演示 (14)16 4X4矩阵键盘控制条形LED显示 (16)17 数码管显示4X4矩阵键盘按键号 (17)18 开关控制LED (19)19 继电器控制照明设备 (20)20 数码管显示拨码开关编码 (21)21 开关控制报警器 (22)22 按键发音 (22)23 播放音乐 (23)24 INT0中断计数 (24)25 外部INT0中断控制LED (26)26 INT0及INT1中断计数 (26)27 定时器控制单只LED (28)28 TIMER0控制流水灯 (29)29 定时器控制4个LED滚动闪烁 (30)30 T0控制LED实现二进制计数 (31)31 TIMER0与TIMER1控制条形LED (31)32 10s的秒表 (32)33 用计数器中断实现100以的按键计数 (34)34 100 000s以的计时程序 (35)35 定时器控制数码管动态显示 (37)36 8X8LED点阵显示数字 (38)37 按键控制8X8LED点阵屏显示图形 (39)38 用定时器设计的门铃 (40)39 演奏音阶 (41)40 按键控制定时器选播多段音乐 (42)41 定时器控制交通指示灯 (44)42 报警与旋转灯 (46)43 串行数据转换为并行数据 (47)44 并行数据转换为串行数据 (48)45 甲机通过串口控制乙机LED (49)46 单片机之间双向通信 (51)47 单片机向主机发送字符串 (55)48 单片机与PC通信 (56)第二篇硬件应用 (58)01 74LS138译码器应用 (58)02 74HC154译码器应用 (58)03 74HC595串入并出芯片应用 (59)04 74LS148扩展中断 (60)06 24C04与数码管 (64)07 用6264扩展存 (67)08 用8255实现接口扩展(仿真未成功) (67)09 555定时器实验 (69)10 BCD译码数码管显示数字 (69)11 MAX7221控制数码管动态显示 (70)12 LCD1602字符液晶滚动演示程序 (71)19 用ADC0808控制PWM输出 (76)20 ADC0809数模转换与显示 (77)第一篇基础程序设计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单片机仿真实例八十三-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仿真51单片机串口双机通讯
51单片机的串口双机通讯一、什么是串口串口是串行发送数据的接口,是相对于并口来说的,是一个广泛的定义。
本期我们说的串口指的是指UART或是RS232。
二、什么是波特率波特率是指串行端口每秒内可以传输的波特位数。
这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位。
一个字节需要8个二进位,如用串口模式1来传输,那么加上起始位和停止位,每个数据字节就要占用10个二进位。
9600bps用模式1传输时,每秒传输的字节数是9600÷10=960个字节,发送一个字节大概需要1ms时间。
三、51单片机串口相关寄存器1、SCON串口控制寄存器(1)SM0和SM1:方式选择寄存器SM0 SM1 工作方式功能波特率0 0 方式0 8位同步移位寄存器晶振频率/ 120 1 方式1 10位UART 可变1 0 方式2 11位UART 晶振频率/32或晶振频率/64 1 1 方式3 11位UART 可变多机通信是工作在方式2和方式3的,所以SM2主要用于方式2和方式3,多级通信时,SM2=1,当SM2=1时,只有当接收到的数据帧第9位(RB8)为1时,单片机才把前八位数据放入自己的SBUF中,否则,将丢弃数据帧。
当SM2=0时,不论RB8的值是什么,都会把串口收到的数据放到SBUF中。
(3)REN:允许接收位REN用于控制是否允许接收数据,REN=1时,允许接收数据,REN=0时,拒绝接收数据。
(4)TB8:要发送的第9位数据位在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址。
(5)RB8:接收到的第9位数据位当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到RB8中。
方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。
(6)TI:发送中断标志位方式0中,不用管他。
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);}}}。
Arduino单片机的Proteus仿真项目实例
digitalWrite(B,HIGH); } //如果按下K3(停止)按钮 if(digitalRead(K3)==LOW)
{ //电机停止 digitalWrite(A,LOW); digitalWrite(B,LOW); } int
sensorValue = analogRead(potpin); //读取电位计采样值
父、子类别检索方法是:先选择元件模式库,再点击“P”按钮,打开元件查询提取对话框,如 图10所示,例如提取的元件是单片机芯片ATMEGA328P,先在类别里找到Microprocessor ICs, 在子类别里找到AVR Family,再在制造商里找到Atmel,然后在缩小了寻找范围的结果中找到这 个单片机芯片ATMEGA328P,找到后双击芯片,就可以把芯片提取到ISIS界面左侧的DEVICES栏中, 供原理图绘制时随时选用
//任务:通过按钮控制电机启停和正反转,通过电位计调节电机转速。
int K1=5; //把K1(正转)按钮连在数字端口5int K2=6; //把K2(反转)按钮连在数字端口
6int K3=7; //把K3(停止)按钮连在数字端口7int potpin = 3; //把电位计连在模拟端口
3int A=2; //数字端口2、3控制电机启停和转向int B=3; int PWMpin = 9; //数字端口9
Arduino单片机的Proteus仿真项 目实例
《单片机应用设计案例——C51+Proteus仿真》是由张毅刚主编,高等教育出版社于2021年11月 5日出版的高等学校电气名师大讲堂推荐教材、iCourse·教材。该教材可作为工科院校、职业 技术学院电气类、电子信息类、自动化类、计算机类、仪器类及机械类专业的单片机课程教材, 也可供从事单片机应用设计的工程技术人员参考。
Proteus仿真5单片机
模拟电子
Lan
SDNU
弹出“Pick Devices”页面,在 “Keywords”输入AT89C51,系统在对 象库中进行搜索,并将搜索结果显示在 “Results”中,如图所示。
模拟电子
Lan
SDNU
在“Results”栏中的列表项中,双 击“AT89C51”,则可将“AT89C51” 添加至对象选择器窗口。然后用同 样的步骤添加其他器件,完成后单 击“OK”按钮,结束对象选择。 最终结果:
U1
19 XTAL1 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 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 18
U1
19 XTAL1 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 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 18 XTAL2
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单片机的基本方法
使用软件Proteus仿真51单片机的基本方法初学者学习单片机的一个比较好的方法是进行实践。
可以采用单片机芯片,也可以采用软件仿真。
Proteus是比较常用的仿真软件,下面介绍如何使用Proteus 软件仿真51系列单片机。
添加最主要的仿真元件——单片机。
点击左侧工具栏中的Component Mode(元件模式)按钮,再单击Pick form Libraries(从库中选择)按钮,如下图红框所示位置。
该按钮仅显示一个字母“P”。
会弹出如下图所示对话框,在Keywords文本框(下图红框区域)输入“89C”,就可以在右侧看见大量的单片机型号。
Proteus7.8中可以仿真89C51/89C52以及89C55等多种型号的单片机。
可以根据自己仿真的单片机型号进行选择。
对于初学者,选择89C51就可以。
点击89C51后,点击上图中的OK按钮。
此时鼠标会变成一支笔的形状,在绘图区域的蓝色框内直接点击鼠标左键,鼠标会变为一个单片机的预览,此时将鼠标移动到合适的位置点击鼠标左键,就可以将单片机放置在该位置。
至此我们就已经将AT89C51单片机放置到仿真软件中了。
搭建单片机最小系统读者注意,单片机最小系统可以说是单片机可以正常运行所需要最少的元件组成的系统。
在仿真软件Proteus中,即使没有搭建单片机最小系统,单片机也可以正常仿真运行。
为了让仿真图更加规范合理,建议大家把单片机最小系统搭建出来。
添加电容、电阻以及晶振等电子元件方法类似于单片机,这里不再赘述。
绘制电路图如下图所示。
其中X1为晶振,关键词为“crystal”;C1和C2为瓷片电容,关键词为“cap”,C3为有极性电容,一般为电解质电容,关键词为“cap-elec”;R1为电阻,关键词为“res”。
在上图所示的单片机最小系统中,搭建的自动复位电路需要连接VCC以及GND。
点击左侧工具栏中Terminal Mode按钮,选择按钮右侧的POWER或GND就可以添加了,如下图所示,添加方法与添加元件方法类似。
172例-Proteus仿真设计-单片机毕业设计项目汇总(合集)电子类毕业设计分享
172例-Proteus仿真设计-单片机毕业设计项目汇总(合集)电子类毕业设计分享001【Proteus仿真设计】基于51单片机智能模拟电梯设计Proteus仿真C语言程序资料14-083 002【Proteus仿真设计】基于51单片机智能S型热电偶高温测量设计Proteus仿真资料14-133003【Proteus仿真设计】基于51单片机智能十字路口交通灯设计Proteus仿真C语言资料14-135004【Proteus仿真设计】基于51单片机智能电子密码锁设计Proteus仿真C语言程序资料14-143005【Proteus仿真设计】基于51单片机智能温度控制器设计Proteus仿真C语言程序资料14-161006【Proteus仿真设计】基于51单片机智能音乐盒音乐播放器设计Proteus仿真资料14-197 007【Proteus仿真设计】基于51单片机智能光控窗帘设计Proteus仿真C语言程序资料14-204 008【Proteus仿真设计】基于51单片机智能交通灯设计Proteus仿真C语言程序资料14-208 009【Proteus仿真设计】基于纯模拟电路220V充电器仿真Multisim仿真设计资料14-362010【Proteus仿真设计】基于纯模拟电路拨码开关控制数码管显示Multisim仿真资料16-009 011【Proteus仿真设计】基于51单片机智能恒温箱设计Proteus仿真C语言程序资料16-085 012【Proteus仿真设计】基于51单片机智能红外视力保护坐姿设计Proteus仿真资料16-510013【Proteus仿真设计】基于AVR16单片机的多功能数据采集设计Proteus仿真程序资料16-579014【Proteus仿真设计】基于51单片机智能数字温度计设计Proteus仿真C语言程序资料16-672015【Proteus仿真设计】基于51单片机智能CO温度报警风扇设计Proteus仿真C语言资料17-037016【Proteus仿真设计】基于AVR16单片机智能八键电子琴设计Proteus仿真程序资料17-039 017【Proteus仿真设计】基于51单片机智能门铃设计Proteus仿真C语言程序资料17-090018【Proteus仿真设计】基于51单片机太阳能风能锂电池路灯设计Proteus仿真资料17-111019【Proteus仿真设计】基于51单片机智能温湿度光照控制设计Proteus仿真程序资料17-120020【Proteus仿真设计】基于51单片机智能红外遥控器设计Proteus仿真C语言程序资料17-125021【Proteus仿真设计】基于51单片机智能超声波盲人报警器设计Proteus仿真资料17-139 022【Proteus仿真设计】基于51单片机智能自动化定氮仪设计Proteus仿真程序资料17-184 023【Proteus仿真设计】基于51单片机智能大棚花卉生长检测设计Proteus仿真资料17-205 024【Proteus仿真设计】基于51单片机智能太阳能电池板清洁设计Proteus仿真资料17-207025【Proteus仿真设计】基于51单片机智能点阵LED广告系统设计Proteus仿真程序资料17-210026【Proteus仿真设计】基于51单片机智能太阳能追光设计Proteus仿真C语言程序资料17-217027【Proteus仿真设计】基于51单片机智能电子称HX711设计Proteus仿真程序资料17-246 028【Proteus仿真设计】基于51单片机智能可燃气报警ADC0809设计Proteus仿真资料17-261 029【Proteus仿真设计】基于51单片机智能电动机保护装置震动设计Proteus仿真资料17-296 030【Proteus仿真设计】基于51单片机智能模拟电梯设计Proteus仿真C语言程序资料17-307031【Proteus仿真设计】基于51单片机智能数字电压表设计Proteus仿真C语言程序资料17-333032【Proteus仿真设计】基于51单片机智能铁路信号机设计Proteus仿真C语言程序资料17-351033【Proteus仿真设计】基于51单片机智能大气质量检测设计Proteus仿真程序资料17-361 034【Proteus仿真设计】基于51单片机智能皮带传输位置控制设计Proteus仿真资料17-362 035【Proteus仿真设计】基于51单片机智能交流电频率检测设计Proteus仿真程序资料17-367 036【Proteus仿真设计】基于51单片机智能物料搬运设计Proteus仿真程序资料17-371 037【Proteus仿真设计】基于51单片机智能锅炉温度控制设计Proteus仿真程序资料17-375038【Proteus仿真设计】基于51单片机智能光控路灯设计Proteus仿真C语言程序资料17-406039【Proteus仿真设计】基于51单片机智能台灯设计Proteus仿真C语言程序资料17-432 040【Proteus仿真设计】基于51单片机智能数控可调电源设计Proteus仿真程序资料17-475 041【Proteus仿真设计】基于51单片机智能刹车控制系统设计Proteus仿真程序资料17-547042【Proteus仿真设计】基于51单片机智能光照度计ADC0832设计Proteus仿真程序资料17-557043【Proteus仿真设计】基于51单片机智能光照度计PCF8591设计Proteus仿真程序资料17-557044【Proteus仿真设计】基于51单片机智能热水器DS18B20设计Proteus仿真程序资料18-636 045【Proteus仿真设计】基于51单片机智能台灯节能照明灯设计Proteus仿真程序资料18-652 046【Proteus仿真设计】基于51单片机室内人体红外感应灯设计Proteus仿真程序资料18-677 047【Proteus仿真设计】基于51单片机智能温度检测系统设计Proteus仿真程序资料18-706 048【Proteus仿真设计】基于51单片机智能遮阳篷窗户衣架设计Proteus仿真程序资料18-742049【Proteus仿真设计】基于51单片机智能加湿器控制设计Proteus仿真C语言程序资料18-752050【Proteus仿真设计】基于51单片机智能步进电机控制设计Proteus仿真程序资料18-754 051【Proteus仿真设计】基于51单片机智能豆浆机控制设计Proteus仿真程序资料18-779 052【Proteus仿真设计】基于51单片机智能太阳能充电控制设计Proteus仿真程序资料18-787 053【Proteus仿真设计】基于51单片机智能全自动洗衣机设计Proteus仿真程序资料18-798 054【Proteus仿真设计】基于51单片机智能出租车计价器设计Proteus仿真程序资料18-856 055【Proteus仿真设计】基于51单片机智能火灾报警器烟雾设计Proteus仿真程序资料18-863056【Proteus仿真设计】基于51单片机智能心率计检测设计Proteus仿真C语言程序资料18-928057【Proteus仿真设计】基于51单片机数控直流稳压电源设计Proteus仿真程序资料18-983058【Proteus仿真设计】基于51单片机直流电机红外测速设计Proteus仿真程序资料18-1111059【Proteus仿真设计】基于51单片机智能火灾报警设计Proteus仿真C语言程序资料18-1127060【Proteus仿真设计】基于51单片机太阳能锂电池路灯光照设计Proteus仿真资料18-1148 061【Proteus仿真设计】基于51单片机汽车防疲劳驾驶瞌睡报警设计Proteus仿真资料19-055 062【Proteus仿真设计】基于51单片机智能洗衣机设计Proteus仿真资料19-071-不带浸泡063【Proteus仿真设计】基于51单片机智能洗衣机设计Proteus仿真资料19-071-带浸泡064【Proteus仿真设计】基于51单片机智能热释红外报警器设计Proteus仿真程序资料19-099065【Proteus仿真设计】基于51单片机智能电子血压计设计Proteus仿真C语言程序资料19-103066【Proteus仿真设计】基于51单片机智能温湿度检测粮仓控制设计Proteus仿真资料19-105 067【Proteus仿真设计】基于51单片机智能热敏电阻温度计设计Proteus仿真程序资料19-198 068【Proteus仿真设计】基于51单片机智能空调设计Proteus仿真C语言程序资料19-277 069【Proteus仿真设计】基于51单片机智能鞋柜仿真设计Proteus仿真C语言程序资料19-287 070【Proteus仿真设计】基于51单片机智能动车烟雾报警器设计Proteus仿真程序资料19-291 071【Proteus仿真设计】基于51单片机智能停车场管理车位引导设计Proteus仿真资料19-353 072【Proteus仿真设计】基于51单片机智能步进电机正反转转速设计Proteus仿真资料19-365 073【Proteus仿真设计】基于51单片机智能核辐射脉冲检测设计设计Proteus仿真资料19-373 074【Proteus仿真设计】基于51单片机智能窗户控制系统设计Proteus仿真C程序资料19-414 075【Proteus仿真设计】基于51单片机红外洗手器干手烘干设计Proteus仿真程序资料19-499 076【Proteus仿真设计】基于51单片机智能超市无人售货售卖机设计Proteus仿真资料19-519 077【Proteus仿真设计】基于51单片机智能无线数字温度计设计Proteus仿真程序资料19-536 078【Proteus仿真设计】基于51单片机智能交通信号灯设计Proteus仿真C语言程序资料19-569079【Proteus仿真设计】基于51单片机智能太阳能蓄电池路灯设计Proteus仿真资料19-621080【Proteus仿真设计】基于51单片机智能电机PWM调速霍尔设计Proteus仿真程序资料19-664081【Proteus仿真设计】基于51单片机智能GSM红外防盗报警器设计Proteus仿真资料19-707 082【Proteus仿真设计】基于51单片机智能HX711电子称设计Proteus仿真程序资料19-710 083【Proteus仿真设计】基于51单片机智能病床呼叫设计Proteus仿真C语言程序资料19-744 084【Proteus仿真设计】基于51单片机智能家居甲醛检测设计Proteus仿真程序资料19-829 085【Proteus仿真设计】基于51单片机智能台灯设计Proteus仿真C语言程序资料19-830 086【Proteus仿真设计】基于51单片机智能自行车智能辅助设计Proteus仿真程序资料19-895 087【Proteus仿真设计】基于51单片机智能PM2.5报警器设计Proteus仿真程序资料19-897 088【Proteus仿真设计】基于51单片机智能八路无线抢答器设计Proteus仿真程序资料19-899089【Proteus仿真设计】基于51单片机智能万年历系统设计Proteus仿真C语言程序资料19-914090【Proteus仿真设计】基于51单片机智能电子琴系统设计Proteus仿真C语言程序资料19-938091【Proteus仿真设计】基于51单片机智能超声波测距系统设计Proteus仿真程序资料19-939 092【Proteus仿真设计】基于51单片机智能超声波测距报警设计Proteus仿真程序资料19-955 093【Proteus仿真设计】基于51单片机智能火灾报警系统设计Proteus仿真程序资料19-965094【Proteus仿真设计】基于51单片机智能脉搏心率计设计Proteus仿真C语言程序资料19-980095【Proteus仿真设计】基于51单片机智能空调设计Proteus仿真C语言程序资料19-993096【Proteus仿真设计】基于51单片机智能多路超声波报警设计Proteus仿真程序资料19-1024097【Proteus仿真设计】基于51单片机智能音乐盒花样流水灯设计Proteus仿真资料19-1032098Matlab仿真图程序智能车牌识别除雾系统设计仿真资料20-055099【Proteus仿真设计】基于51单片机智能泵站供水仿真设计Proteus仿真程序资料20-116 100【Proteus仿真设计】基于51单片机智能仿自然风风扇设计Proteus仿真程序资料20-497 101【Proteus仿真设计】基于51单片机智能纱线张力检测设计Proteus仿真程序资料20-558102【Proteus仿真设计】基于MSP430F149单片机智能压力变送器设计Proteus仿真资料20-573103【Proteus仿真设计】基于51单片机智能单相无功补偿控制器设计Proteus仿真资料20-605 104【Proteus仿真设计】基于51单片机智能工频交流电参数测量设计Proteus仿真资料20-639 105【Proteus仿真设计】基于51单片机智能污水监测采集设计Proteus仿真程序资料20-652106【Proteus仿真设计】基于51单片机智能温度控制仪设计Proteus仿真C语言程序资料20-669107【Proteus仿真设计】基于51单片机智能紫外线强度检测仪设计Proteus仿真资料20-672108【Proteus仿真设计】基于STM32单片机智能交通灯红绿灯设计Proteus仿真程序资料21-013109【Proteus仿真设计】基于NE555多谐振荡器温度热敏电阻报警设计Proteus仿真资料21-016110【Proteus仿真设计】基于51单片机智能大棚温湿度报警检测设计Proteus仿真资料21-031 111【Proteus仿真设计】基于STM32单片机智能单相电频率检测设计Proteus仿真资料21-077 112【Proteus仿真设计】基于51单片机智能电子称重压力检测设计Proteus仿真资料21-186113【Proteus仿真设计】基于51单片机智能指纹密码锁设计Proteus仿真C语言程序资料21-200114【Proteus仿真设计】基于51单片机智能数控可调电源设计Proteus仿真程序资料21-260 115【Proteus仿真设计】基于51单片机智能大棚浇花浇水土壤设计Proteus仿真资料21-471 116【Proteus仿真设计】基于51单片机智能太阳能光伏充电器设计Proteus仿真资料21-681117【Proteus仿真设计】基于51单片机智能函数信号发生器设计Proteus仿真程序资料21-699118【Proteus仿真设计】基于51单片机智能函数信号发生器设计Proteus仿真程序资料21-804 119【Proteus仿真设计】基于51单片机远程智能大棚设计Proteus仿真C语言程序资料21-807 120【Proteus仿真设计】基于51单片机智能空气PM2.5检测设计Proteus仿真程序资料21-845121【Proteus仿真设计】基于51单片机智能贪吃蛇游戏设计Proteus仿真C语言程序资料21-850122【Proteus仿真设计】基于51单片机智能无线环境检测设计Proteus仿真程序资料21-862123【Proteus仿真设计】基于51单片机智能多功能LED显示广告屏设计Proteus仿真资料21-868124【Proteus仿真设计】基于51单片机智能太阳能路灯设计Proteus仿真C语言程序资料21-887125【Proteus仿真设计】基于51单片机智能控制分时测温仪设计Proteus仿真程序资料21-902 126【Proteus仿真设计】基于51单片机智能自动寻光小车设计Proteus仿真言程序资料21-933127【Proteus仿真设计】基于51单片机智能交通灯数码管设计Proteus仿真资料22-090报警128【Proteus仿真设计】基于51单片机智能交通灯数码管设计Proteus仿真资料22-090无报警129【Proteus仿真设计】基于51单片机智能汽车防盗系统设计Proteus仿真程序资料23-021130【Proteus仿真设计】基于51单片机智能光照度计PCF8591设计Proteus仿真程序资料23-025131【Proteus仿真设计】基于STM32单片机智能热电偶锅炉恒温箱设计Proteus仿真资料23-083132【Proteus仿真设计】基于51单片机智能蓄电池充电器过充放设计Proteus仿真资料23-105 133【Proteus仿真设计】基于51单片机地铁闸机门控制自动检票设计Proteus仿真资料23-157 134【Proteus仿真设计】基于51单片机智能蓄电池容量检测电压设计Proteus仿真资料23-165 135【Proteus仿真设计】基于51单片机智能台灯控制热释设计Proteus仿真程序资料23-186136【Proteus仿真设计】基于51单片机智能台灯控制设计Proteus仿真C语言程序资料23-211137【Proteus仿真设计】基于STM32单片机智能无线手机充电器设计Proteus仿真资料23-214 138【Proteus仿真设计】基于51单片机智能音乐喷泉频谱音乐盒设计Proteus仿真资料23-219 139【Proteus仿真设计】基于51单片机锂电池电压流容量检测设计Proteus仿真资料23-250 140【Proteus仿真设计】基于51单片机步进电机正反转转速控制设计Proteus仿真资料23-265 141【Proteus仿真设计】基于51单片机智能蓄电池容量检测报警设计Proteus仿真资料23-268 142【Proteus仿真设计】基于51单片机智能三段式电流保护系统设计Proteus仿真资料23-278 143【Proteus仿真设计】基于51单片机煤气天然气CO检测报警设计Proteus仿真资料23-284 144【Proteus仿真设计】基于51单片机智能无线篮球计分器设计Proteus仿真程序资料23-290 145【Proteus仿真设计】基于51单片机风能太阳能锂电池充电器设计Proteus仿真资料23-311 146【Proteus仿真设计】基于51单片机智能声音噪音检测设计Proteus仿真程序资料23-320 147【Proteus仿真设计】基于51单片机智能自行车码表霍尔里程设计Proteus仿真资料23-324148【Proteus仿真设计】基于51单片机智能16键电子琴乐谱音箱设计Proteus仿真资料23-325149【Proteus仿真设计】基于51单片机智能声光控灯楼道灯设计Proteus仿真程序资料23-326 150【Proteus仿真设计】基于51单片机智能酒精浓度检测报警设计Proteus仿真资料23-327 151【Proteus仿真设计】基于51单片机红外遥控定时开关插座设计Proteus仿真资料23-328 152【Proteus仿真设计】基于51单片机电子打铃定时闹铃万年历设计Proteus仿真资料23-329 153【Proteus仿真设计】基于51单片机红外计数器商场统计人数设计Proteus仿真资料23-330154【Proteus仿真设计】基于51单片机智能温控风扇PWM调速设计Proteus仿真程序资料23-331155【Proteus仿真设计】基于51单片机智能出租车计价器计费设计Proteus仿真资料23-332 156【Proteus仿真设计】基于51单片机智能篮球计积分器计时器设计Proteus仿真资料23-333157【Proteus仿真设计】基于51单片机智能八路抢答器报警设计Proteus仿真程序资料23-334158【Proteus仿真设计】基于51单片机智能电子密码锁设计Proteus仿真C语言程序资料23-335159【Proteus仿真设计】基于51单片机智能计算器矩阵键盘设计Proteus仿真程序资料23-341 160【Proteus仿真设计】基于51单片机智能台灯设计Proteus仿真C语言程序资料23-342 161【Proteus仿真设计】基于51单片机智能烟雾温度报警风扇设计Proteus仿真资料23-344 162【Proteus仿真设计】基于51单片机智能热释红外报警器设计Proteus仿真程序资料23-345 163【Proteus仿真设计】基于51单片机智能窗帘窗户设计Proteus仿真C语言程序资料23-347 164【Proteus仿真设计】基于51单片机智能热敏电阻体温计设计Proteus仿真程序资料23-348 165【Proteus仿真设计】基于51单片机锂电池电压电量电流检测设计Proteus仿真资料23-349166【Proteus仿真设计】基于纯模拟电路交通灯倒计时显示故障设计Multisim仿真资料23-350167【Proteus仿真设计】基于STM32单片机智能热电偶设计Proteus仿真C语言程序资料23-351168【Proteus仿真设计】基于51单片机智能土壤湿度温湿度设计Proteus仿真程序资料23-352 169【Proteus仿真设计】基于51单片机智能光控窗帘窗户设计Proteus仿真程序资料23-354 170【Proteus仿真设计】基于51单片机智能环境监测设计Proteus仿真C语言程序资料23-355171【Proteus仿真设计】基于51单片机智能密码存储柜设计Proteus仿真C语言程序资料23-372172【Proteus仿真设计】基于51单片机超声波测距倒车雷达报警设计Proteus仿真资料23-469。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
引言
单片机体积小,重量轻,具有很强的灵活性而且价格便宜,具有逻辑判断,定时计数等多种功能,广泛应用于仪器仪表,家用电器,医用设备的智能化管理和过程控制等领域。
以单片机为核心的嵌入式系统已经成为目前电子设计最活跃的领域之一。
在嵌入式系统的中,开发板成本高,特别是对于大量的初学者而言,还可能由于设计的错误导致开发板损坏。
利用Proteus我们可以很好地解决这个问题,由此我们可以快速地建立一个仿真系统。
2.Proteus介绍
Proteus是英国Labcenter Electro-nics公司开发的一款电路仿真软件,软件由两部分组成:一部分是智能原理图输入系统ISIS(Intelligent Schematic Input System)和虚拟系统模型VSM(Virtual Model System);另一部分是高级布线及编辑软件ARES(Adv-Ancd Routing And Editing Software)也就是PCB.
2.1 Proteus VSM的仿真
Proteus可以仿真模拟电路及数字电路,也可以仿真模拟数字混合电路。
Proteus可提供30多种元件库,超过8000种模拟、数字元器件。
可以按照设计的要求选择不同生产厂家的元器件。
此外,对于元器件库中没有的元件,设计者也可以通过软件自己创建。
除拥有丰富的元器件外,Proteus还提供了各种虚拟仪器,如常用的电流表,电压表,示波器,计数/定时/频率计,SPI调试器等虚拟终端。
支持图形化的分析功能等。
Proteus特别适合对嵌入式系统进行软硬件协同设计与仿真,其最大的特点是可以仿真8051,PIA,A VR,ARM等多种系列的处理器。
Protues包含强大的调试工具,具有对寄存器和存储器、断点和单步模式IAR C-SPY,Keil、MPLAB等开发工具的源程序进行调试的功能;能够观察代码在仿真硬件上的实时运行效果;对显示,按钮,键盘等外设的交互可视化进行仿真。
2.2 Proteus PCB
Proteus 的PCB设计除了有自动布线仿真功能外,还集成了PCB设计,支持多达16个布线层,可以任意角度放置元件和焊接连线;集成了高智能的布线算法,可以方便地进行PCB设计。
3. 基于Protesus的简单数据采集系统。
3.1 软件的编写
本例题采用可调电阻调节电压值作为模拟信号的输入量,通过A/D转换芯片AD0808把模拟信号转换为数字量传送到单片机的P1口,并在P0口把转换的结果显示出来。
软件的编写可以在Keil C51 环境下进行,芯片的型号选择AT89C51,编写data.c文件,利用Keil C51进行编译,编译成功后生成data.hex文件。
3.2 绘制电路图
运行Proteus的ISIS,进入仿真软件的主界面,如图1所示。
主界面分为菜单栏,工具栏,模型显示窗口,模型选择区,元件列表区等。
图1 ISIS启动界面
通过左侧的工具栏区的P(从库中选择元件)命令,在Pick devices窗口中选择系统所需元器件,还可以选择元件的类别,生产厂家等。
本例所需主要元器件有:A T89C51芯片,ADC0808芯片,一个四位七段数码显示器,一个可变电阻,详见表1。
表1 元器件清单
选择元器件后连接图2所示电路。
图2 电路原理图
Microproccessor ICs类的芯片的引脚与实际的芯片基本相同,唯一的差别是隐去了GND 和VCC引脚,系统默认的是把它们分别连接到地和+5V直流电源。
故在电路连线时可以不考虑电源和地的连接。
为了快速进行仿真,系统所需的时钟电路,复位电路可以省略。
电路连接完成后,选中AT89C51单击鼠标左键,打开“Edit Component”对话窗口如图3所示,可以直接在“Clock Frequency”后进行频率设定,设定单片机的时钟频率为12MHz。
在“Program File”栏中选择已经生成的data.hex文件,把在Keil编写的程序导入Proteus,然后单击“OK”按钮保存设计。
至此,就可以进行单片机的仿真。
图 3 单片机属性的设定
3.3 Proteus仿真结果
单片机的仿真结果图如图4,模拟信号经A/D转换后,结果送入单片机,再在数码管上显示;通过调节可调电阻的阻值,可以得到不同的显示结果。
仿真结果表明,系统达到了预先的设计要求。
在仿真的过程中每个管脚旁边会出现一个小方块,红色的方快表示高电平,蓝色的表示低电平。
通过方快颜色的变化可以很方便地知道每个管脚电平的变化,从而能对系统的运行有更直观的了解,这对程序的调试有很大的帮助。
图4 仿真结果
4.结束语
本文结合一个简单的数据采集系统详细说明了Proteus在单片机开发中的应用。
可以看出,Proteus功能十分强大,能仿真各种数字模拟电路,且操作简单,使用方便。
能快速地进行单片机仿真,加快系统开发的过程,降低开发成本。