51单片机仿真实例
基于Proteus的51单片机的动态仿真
煤量指令同煤质的乘积代表折算为标准煤质的煤量指令, 或煤量 经延时折算进入炉内的煤量, 两者经大选形成总风量指令。
FTAF = f9 [MAX (M Z DM , M Z DELA Y (M ) ]
( 23)
式中, FPAP 、FPAF 、FTAF 分别为一 次风压、一 次风量、总风量 自动
设定值; f7 ~ f9为多段 折线函数; M 为锅炉总给 煤量; DM 为锅
1 仿真原理
单从仿真 角 度 来看, P ro teus 除 具有 基 本 仿 真功 能 之 外。 还具有两个独特 之处: 一 是对动 态元 件的 实时 仿真, 即 # 人机 交互 ∃的仿真; 二 是虚拟 仪表 箱的 功能, 能 对电 路及 各元 器件 参数进行实时测量, 增加了系统真实性。 1. 1 实时动态仿真
∀ 经验交流 ∀
4 2MW /m in, 负荷动态偏差为 [ 2. 6, - 4. 4] MW, 负荷稳 态偏差 为 [ 1. 7, - 0. 3]MW, AGC 响应 迟延 时间 为 10 秒, 主 汽压 力的 动态偏差为 [ 0. 6, - 0. 5]M P a, 稳态偏差为 [ 0. 2, 0 2] M P a。
关键词: 单片机; 元件库; 实时; 动态; 仿真 中图分类号: TP36 文献标识码: B
On dynam ic sim u lation of 51 simp le ch ip
computers by proteus
W ANG Yu ye ( Anhui Vocationa l and T echn ica l College, H efei 230051, China )
89 92. [ 8 ] 陈文敏. 煤的发 热量 和计 算公 式 [ M ]. 北京: 煤炭 工业 出版
51单片机密码锁仿真C程序
#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbitjdq=P3^0;ucharcount,buf[6],pw[6];uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; delay(unsigned int j){while(j--);}init() //清缓存子函数{pw[0]=pw[1]=pw[2]=pw[3]=pw[4]=pw[5]=10;count=0;}display() //数码显示子函数{unsigned char i,wk=0xfb;buf[0]=tab[pw[0]];buf[1]=tab[pw[1]];buf[2]=tab[pw[2]];buf[3]=tab[pw[3]];buf[4]=tab[pw[4]];buf[5]=tab[pw[5]];for (i=0;i<=5;i++){P3=P3|0xfc; //熄灭所有数码管并使最低2位保持不变P2=buf[i]; //依次输出段码P3=P3&wk; //输出位控并使最低2位保持不变delay(100); //延时wk=_crol_(wk,1); //位控左移一位P3=P3|0xfc; //熄灭所有数码管}}ucharkeypress() //按键处理子函数{unsigned char temp,num;num=15;temp=0xff;P1=0xf0;if (P1!=0xf0) //判断是否有按键按下{delay(300); //延时去抖if (P1!=0xf0) //再次判断是否有按键按下{P1=0xf0; //行作输出,列作输入temp=P1; //读取列值P1=0x0f; //列作输出,行作输入temp=temp|P1; //读取行值并和列值合并switch (temp){case 0xee:num=1; break;case 0xde:num=2; break;case 0xbe:num=3; break;case 0xed:num=4; break;case 0xdd:num=5; break;case 0xbd:num=6; break;case 0xeb:num=7; break;case 0xdb:num=8; break;case 0xbb:num=9; break;case 0xe7:num=0; break;case 0xd7:num=10; break;case 0xb7:num=11; break;}P1=0xf0;while (P1!=0xf0)display();}}returnnum;}button(){ucharkeyNum;keyNum=keypress(); //返回按键号,带返回值的函数的应用if (keyNum<10) //按下的是数字键{count++;if (count<7) //按键次数少于6次{pw[5]=pw[4]; //按下数字键后,将数字存入pw[0],而pw[4]=pw[3]; //将pw[i](i=0、1、2、3、4)中的数pw[3]=pw[2]; //依次送入pw[i+1]中,实现数码管上显示pw[2]=pw[1]; //的数字逐个左移的效果pw[1]=pw[0];pw[0]=keyNum;}}else{if (keyNum==10) //按下的是清除键{init(); //数码管清屏}if (keyNum==11) //按下的是确定键{if(pw[0]==6&&pw[1]==5&&pw[2]==4&&pw[3]==3&&pw[4]==2&&pw[5]==1) {jdq=0; //继电器吸合,开锁delay(50000);jdq=1;}init(); //数码管清屏}}}int main() //主程序{init(); //初始化程序while(1){display();button();}}。
51单片机C语言实例(350例)Proteus仿真和代码都有
51单片机C语言实例(350例)Proteus仿真和代码都有51单片机C语言实例(400例)所有实例程序均经测试过,适合新手学习。
1-IO输出-点亮1个LED灯方法1 10-LED循环左移100-24c02记忆开机次数101-24c02存储上次使用中状态102-DS1302 时钟原理103-DS1302可调时钟104-DS1302时钟串口自动更新时间105-1602液晶显示DS1302时钟106-字库ST7920 12864液晶基础显示107-按键 12864显示108-PCF8591 1路AD数码管显示109-PCF8591 4路AD数码管显示11-LED循环右移110-PCF8591 DA输出模拟111-PCF8591 输出锯齿波112-PCF8591 1602液晶显示113-串口通讯114-串口通讯中断应用115-RS485基本通讯原理116-红外接收原理117-红外解码数码管显示118-红外解码1602液晶显示119-红外发射原理12-查表显示LED灯120-红外收发测试121-双红外发射避障原理测试122-1个18B20 温度传感器数码管显示123-1个18b20温度传感器1602液晶显示124-多个18b20温度传感器1602液晶显示125-超温报警测试126-温度可调上下限1602126-温度可调上下限1602显示127-PS2键盘输入1602液晶显示128-双色点阵1种颜色显示测试129-双色点阵2种颜色显示测试13-双灯左移右移闪烁130-双色点阵显示特定图形131-双色点阵交替图形显示132-双色点阵双色交替动态显示133-热敏电阻测试数码管显示134-光敏电阻测试数码管显示135-自动调光测试136-串转并数字芯片测试137-非门数字芯片测试138-电子琴139-实用99分钟倒计时器14-花样灯140-外部频率测试141-定时做普通时钟可调142-1602液晶显示的密码锁143-实用密码锁144-1602液晶显示的计算器145-秒表146-串口测温电脑显示147-交通灯测试148-点阵模拟电梯上行下行149-点阵流动广告模拟15-PWM调光150-综合测试程序151-12位AD_DS1621与12864液晶152-闪烁灯一153-闪烁灯二154-流水灯A155-51单片机12864大液晶屏proteus仿真156-流水灯B157-数码管显示158-12864LCD显示计算器键盘按键实验159-数码管显示(锁存器)16-共阳数码管静态显示160-数码管动态显示161-数码管滚动显示162-数码管字符显示163-独立按键164-矩阵键盘165-矩阵键盘(LCD)166-用DS1302与12864LCD设计的可调式中文电子日历167-定时器的使用(方式1)168-12864LCD图形滚动演示169-用PG12864LCD设计的指针式电子钟17-1个共阳数码管显示变化数字170-定时器的使用(方式2)171-外部中断的使用172-定时器和外部中断173-开关控制12864LCD串行模式显示174-点阵显示175-液晶1602显示176-12864带字库测试程序177-串行12864显示178-遥控键值解码-12864LCD显示179-液晶12864并行18-单个数码管模拟水流180-液晶12864并行2181-串口发送试验182-串口接收试验183-串口接收(1602)184-蜂鸣器发声185-直流电机调速186-蜂鸣器间断发声187-lcd-12864应用188-继电器控制189-直流电机调速19-按键控制单个数码管显示190-步进电机191-存储AT24C02192-PCF8591T AD实验193-PCF8591T芯片DA实验194-温度采集DS18B20195-EEPROM_24C02196-12864LCD显示24C08保存的开机画面197-红外解码198-12864LCD显示EPROM2764保存的开机画面199-时钟DS1302(LCD)2-IO输出-点亮1个LED灯方法220-单个数码管指示逻辑电平200-宏晶看门狗201-SD卡202-秒表203-普通定时器时钟204-彩屏控制205-彩屏图片显示206-12864+DS1302时钟+18B20温度计207-12864测试程序208-12864串行驱动演示209-12864生产厂程序21-8位数码管显示其中之一210-12864中文显示测试211-LCD12864212-12864M液晶显示(有字库)程序(汇编)213-超声波测距LCD12864显示214-红外遥控键值解码12864液晶显示(汇编语言)215-用DS1302与12864LCD设计的可调式中文电子日历216-中文12864217-中文12864LCD显示红外遥控解码实验218-IO端口输出219-IO端口输入22-8位数码管静态显示其中之二220-流水灯221-数码管显示223-独立按键224-独立按键去抖动225-定时器0226-定时器1227-定时器2228-外部中断0电平触发229-外部中断0边沿触发23-8位数码管动态扫描显示230-外部中断1231-矩阵键盘232-液晶LCM1602233-LCD1602动态显示234-EEPROM24c02235-开机次数记忆236-红外解码LCD1602液晶显示237-红外解码数码管显示238-喇叭239-液晶背光控制24-8位数码管动态扫描原理演示240-与电脑串口通信241-步进电机242-字库LCD12864液晶测试243-液晶数码综合显示244-99秒计时245-99倒计时246-抢答器247-PWM调光248-LED点阵249-直流电机调速250-按键计数器251-秒表252-数码管移动253-花样灯254-红绿灯255-音乐播放256-红外收发演示257-普通定时器时钟258-继电器控制259-ps2键盘LCD1602液晶显示26-9累加260-RTC实时时钟DS1302液晶显示261-单线温度传感器18b20262-串口测温263-带停机步进电机正反转264-步进电机正反转265-AD_DA_PCF8591266-液晶AD_DA_PCF8591267-秒手动记数268-功能感受269-流水登27-99累加270-点亮一个二极管271-用单片机控制一个灯闪烁272-将P1口状态送入P0、P2、P3273-P3口流水灯274-通过对P3口地址的操作流水点亮8位LED 275-用不同数据类型控制灯闪烁时间276-用P0口、P1 口分别显示加法和减法运算结果277-用P0、P1口显示乘法运算结果278-用P1、P0口显示除法运算结果279-用自增运算控制P0口8位LED流水花样28-999累加280-用P0口显示逻辑与运算结果281-用P0口显示条件运算结果282-用P0口显示按位异或运算结果283-用P0显示左移运算结果284-万能逻辑电路实验285-用右移运算流水点亮P1口8位LED286-用if语句控制P0口8位LED的流水方向287-用swtich语句的控制P0口8位LED的点亮状态288-用for语句控制蜂鸣器鸣笛次数289-包含单片机寄存器的头文件29-9999累加290-用do-while语句控制P0口8位LED流水点亮291-用字符型数组控制P0口8位LED流水点亮292-用P0口显示字符串常量293-用P0 口显示指针运算结果294-用指针数组控制P0口8位LED流水点亮295-用数组的指针控制P0 口8 位LED流水点亮296-用P0 、P1口显示整型函数返回值297-用有参函数控制P0口8位LED流水速度298-用数组作函数参数控制流水花样299-用数组作函数参数控制流水花样3-IO输出-点亮多个LED灯方法130-9累减300-用函数型指针控制P1口灯花样301-用指针数组作为函数的参数显示多个字符串302-字符函数ctype.h应用举例303-内部函数intrins.h应用举例304-标准函数stdlib.h应用举例305-字符串函数string.h应用举例306-宏定义应用举例307-文件包应用举例308-条件编译应用举例309-用定时器T0查询方式P2口8位控制LED闪烁31-99累减310-用定时器T1查询方式控制单片机发出1KHz音频311-将计数器T0计数的结果送P1口8位LED显示311-用定时器T0的中断控制1位LED闪烁312-用定时器T0的中断实现长时间定时313-用定时器T1中断控制两个LED以不同周期闪烁314-用计数器T1的中断控制蜂鸣器发出1KHz音频315-用定时器T0的中断实现渴望主题曲的播放316-输出50个矩形脉冲317-输出正脉宽为250微秒的方波318-用定时器T0控制输出高低宽度不同的矩形波319-用外中断0的中断方式进行数据采集32-999累减320-输出负脉宽为200微秒的方波321-方式0控制流水灯循环点亮322-数据发送程序323-数据接收程序324-单片机向PC发送数据325-单片机接收PC发出的数据326-用LED数码显示数字5327-用LED数码显示器循环显示数字0~9328-用数码管慢速动态扫描显示数字1234329-用LED数码显示器伪静态显示数字123433-9999累减330-用数码管显示动态检测结果331-数码秒表设计332-数码时钟设计333-用LED数码管显示计数器T0的计数值334-静态显示数字“59”335-无软件消抖的独立式键盘输入实验336-软件消抖的独立式键盘输入实验337-CPU控制的独立式键盘扫描实验338-定时器中断控制的独立式键盘扫描实验339-独立式键盘控制的4级变速流水灯34-显示小数点340-独立式键盘的按键功能扩展:以一当四341-独立式键盘调时的数码时钟实验342-独立式键盘控制步进电机实验343-矩阵式键盘按键值的数码管显示实验344-矩阵式键盘按键音345-简易电子琴346-矩阵式键盘实现的电子密码锁347-用LCD显示字符'A'348-用LCD循环右移显示Welcome to China 349-将数据0x0f写入AT24C02再读出送P1口显示35-数码管消隐350-液晶时钟设计36-数码管递加递减带消隐37-数码管左移38-数码管右移38-数码管右移139-数码管右移24-IO输出-点亮多个LED灯方法240-数码管循环左移41-数码管循环右移41-数码管循环右移142-数码管循环右移243-数码管闪烁44-数码管局部闪烁45-定时器046-定时器147-定时器248-产生1mS方波49-产生200mS方波5-闪烁1个LED50-产生多路不同频率方波51-1个独立按键控制LED52-1个独立按键控制LED状态转换53-2按键加减操作53-2按键加减操作数码管显示54-多位数按键加减(闪烁)54-多位数按键加减(闪烁)数码管显示55-多位数按键加减(不闪烁)55-多位数按键加减(不闪烁)数码管显示56-定时器扫描数码管(不闪烁)57-按键长按短按效果58-抢答器59-独立按键依次输入数据6-不同频率闪烁1个LED灯60-按键从右至左输入61-8位端口检测8独立按键62-矩阵键盘行列扫描63-矩阵键盘反转扫描64-矩阵键盘中断扫描65-矩阵键盘密码锁66-矩阵键盘简易计算器67-外部中断0电平触发68-外部中断1电平触发69-外部中断0下降沿触发7-不同频率闪烁多个LED灯70-外部中断1下降沿触发71-T0外部计数输入72-T1外部计数输入73-看门狗溢出测试74-按键喂狗75-喇叭发声原理76-警车声音77-救护车声音78-喇叭滴答声79-报警发声8-8位LED左移80-消防车警报81-音乐播放82-步进电机转动原理83-步进电机正反转84-步进电机按键控制85-步进电机转速数码管显示86-双步进电机综合控制86-步进电机调速原理87-双步进电机综合控制87-步进电机综合控制87-步进电机调速原理88-直流电机按键控制89-直流电机调速控制9-8位LED右移90-继电器控制原理91-双继电器模拟洗衣机电机控制92-1602液晶静态显示93-1602液晶动态显示94-1602液晶滚动显示95-1602液晶移动显示96-1602液晶按键输入显示97-2402存储1个数据98-24c02存储多个数据99-24c02存储花样流水灯。
Proteus仿真51单片机
一 概述
Proteus软件是英国Labcenter electronics公司出版的 EDA工具软件。它不仅具有其它EDA工具软件的仿真功
能,还能仿真单片机及外围器件。它是目前最好的仿真单
片机及外围器件的工具。
第一个实验
用proteus实 现这个实验
用 开关K0 控制 灯L0 的亮/灭。 取一根连接线连接P10和L0,另取一根连接线连接P11和K0,打 开实验箱电源。
4. 仿真并查看结果
单击
开始仿真,单击
19
停止仿真。
U1
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
(3)放置电源和地
切换到“终端模式”下,选择电源和接地,POWER、 GROUND,放置到原理图编辑窗口中了,并右键编辑属性,
标号栏选择为VCC、GND。
(4)元器件之间的连线
单击鼠标左键,移动鼠标,靠近连接点时,可以完成自动连
线。ESC键或者单击鼠标的右键来放弃画线。
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
基于proteus的51单片机仿真实例九、51单片机的最小工作系统
基于proteus的51单片机仿真实例九、51单片机的最小工作系统1、前面我们已经利用proteus和keil c51建立了第一个仿真实例,并通过仿真运行验证了我们的实例的正确性。
现在我们已经了解了proteus和keil c51的基本操作。
2、但是毕竟是初学单片机,对于我们前面编写的程序所实现的功能可就是一头雾水,不知所云了。
那么接下来我们就了解一下51单片机的知识吧3、先来简单说说怎么学习单片机。
前面已经说过,单片机是一种软件和硬件紧密结合的技术,对于一个单片机应用系统来说,硬件电路是单片机系统运行的基础和保障,软件程序是单片机系统的灵魂。
相对于人来说,人的身体、四肢是一个硬件系统,大脑就是软件系统,只有通过大脑发出指令,身体的各个部分才会做出相应的动作,但是如果手被绑住了,大脑即使发出让手去拿一个杯子的指令,手也无法完成这个指令。
所以软件和硬件需要相互结合才能够去完成一项任务。
1)就像我们新买了一台电视机一样,买回来后我们会首先了解一下这个电视机的功能特点,看一下遥控器的说明书,给电视机加上电源和天线(或有线电视信号线),然后按照说明书的使用方法来一步一步熟悉和操作电视机。
单片机的学习也一样,我们接触到一种单片机后,首先要了解这种单片机的功能和性能特点,然后才能进行相应的开发设计。
怎么来了解一种单片机呢?单片机厂家提供的数据手册是第一手也是最准确的资料。
但是很多数据手册是英文的,对于我们很多人来说,看起来会比较吃力。
不过幸运的是,现在很多资料都已经被翻译过来了。
我们到网上搜索一下,会搜索到很多的中文数据手册和应用实例,所以网络现在已经成为我们学习的一个非常重要的工具和平台了。
2)单片机的结构是十分复杂的,我们打开一个单片机的数据手册,会发现前面里面到处充斥着结构图和理论知识的介绍,相信对于一个新手来说,看数据手册不到10分钟就想放弃。
但是很多人说,这些是最基础的,必须要理解和掌握。
确实,这些东西我们必须精通,但是是不是一开始就要完全精通这些呢?大可不必。
基于proteus的51单片机仿真实例六十四
基于proteus的51单片机仿真实例六十四、字符液晶LCD1602显示字符串实例标签: proteus单片机实例液晶字符2010-02-20 00:121、本例用1602液晶循环右移显示一串字符串。
显示模式设置如下1)16*2显示,5*7点阵,8位数据接口2)开显示,有光标且光标闪烁3)光标右移,字符不移动2、由于一次只能向液晶写入一个字符,因此如果需要显示字符串的话,需要用到指针或者字符串数组,然后再设置一个循环,从第一个字符开始写入液晶,直到写到字符串结束标志“\0”为止。
字符显示地址的确定:由于1602液晶在第一个地址显示完毕后,能够自动指向先一个地址,因此只需要指定字符串的第一个字符显示的地址即可,3、在keil c51中新建工程ex52,编写如下程序代码,编译并生成ex52.hex文件//LCD1602.C//液晶控制与显示程序#include <reg51.h>#include <intrins.h>sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚//延时函数void delayms(unsigned int ms){unsigned char i;while(ms--){for(i = 0;i < 120;i++);}}//忙检测函数unsigned char busy_check(void){unsigned char LCD_Status; //定义忙状态变量RS = 0; //RW = 1;EN = 1;delayms(1);LCD_Status = P0; //读取忙状态EN = 0;return LCD_Status; //返回忙状态}//写命令void write_LCD_Command(unsigned char cmd){while((busy_check() & 0x80) == 0x80); //等待忙状态结束 RS = 0;RW = 0;EN = 0;P0 = cmd;EN = 1;delayms(1);EN = 0;}//写数据void write_LCD_data(unsigned char dat){while((busy_check() & 0x80) == 0x80);RS = 1;RW = 0;EN = 0;P0 = dat;EN = 1;delayms(1);EN = 0;}//初始化void init_LCD(void){write_LCD_Command(0x38); //显示模式设置 delayms(1);write_LCD_Command(0x01); //清屏delayms(1);write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移delayms(1);write_LCD_Command(0x0c); //显示开,关光标delayms(1);}//显示字符串void ShowString(unsigned char x,unsigned char y,unsigned char *str) {unsigned char i = 0;//设置起始位置if(y == 0){write_LCD_Command(0x80 | x);}if(y == 1){write_LCD_Command(0xc0 | x);}//输出字符串for(i = 0; i < 16;i++){write_LCD_data(str[i]);}}4、在proteus中新建仿真文件ex52.dsn,电路原理图如下所示5、将ex52.hex文件载入at89c51中,启动仿真,观察运行结果。
基于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的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单片机仿真实例六十
基于proteus的51单片机仿真实例五十九、1位数码管显示实例1、数码管实际上是由7个发光二极管组成一个8字形,另外一个发光二极管做成圆点型,这样就构成了一个数码管。
所有的8个二级管的正极或者负极都连到一个公共端点上,对于公共端连在正极的数码管,称为共阳极数码管,反之称为共阴极数码管。
根据数码管的部结构原理,可以很清楚的知道数码管显示数字的原理。
2、由于单片机的IO口的驱动能力有限,而数码管点亮时需要较大的电流,所以在用单片成数码管显示系统时,需要增加驱动电路,最简单的驱动电路就是利用三极管的电流放大能力来输出较大的电流,3、让数码管显示数字的步骤为:1)使数码管的公共端连到电源(共阳极)或者地(共阴极)上。
2)向数码管的各个段输出不同的电平。
本例使用单个数码管循环显示0-9这10个数字。
4、在keil c51中新建工程ex47,编写如下程序代码,编译并生成ex47.hex文件#include <reg51.h> //包含头文件//延时函数,延时约200msvoid delay(void){unsigned char i,j;for(i = 0; i < 255;i++){for(j = 0;j < 255;j++);}}//主函数void main(void){unsigned char i;unsigned char code Tab[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90};//定义数字0-9的段码表P2 = 0xfe; //P2.0输出低电平,数码管电源导通while(1){for(i = 0;i < 10;i++) //循环10次。
数码管循环显示数字0-9{P0 = Tab[i]; //P0口输出数字0-9对应的段码delay(); //延时}}}5、在proteus中新建仿真文件ex47.dsn,电路原理图如下所示:需要说明的是在proteus中,查找排阻(不带公共端)和数码管的方法。
51单片机仿真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 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 unsignedchar#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的51单片机仿真实例及应用开发说明一、单片机系统的开发流程1、搭建硬件电路;2、编写控制程序;3、将程序“装”到单片机里面;4、运行单片机系统,并检查、调试运行结果。
二、学习单片机的基本条件单片机是一门实践性很强的技术,它牵涉到软件和硬件的学习。
软件指的是单片机控制程序;硬件则是保证单片机运行的基本电路。
无论是程序设计还是电路设计,都需要经过大量的实践练习才能够准确理解和熟练掌握。
1、软件条件:单片机软件的开发流程是:1)编写控制程序;2)对程序进行编译、排错、仿真、调试;3)生成可以用特定软件能烧写到单片机里面的二进制或十六进制文件。
一般的单片机的软件开发用到以下软件:程序编写、编译软件(其中用到最广泛的Keil51):用来编写、编译单片机的控制程序(其中用到最广泛的是AVR fighter或者是STCISPV38A);仿真软件:proteus软件能很好地模拟展示单片机程序是否完成了既定功能;2、硬件条件:程序编写调试完成后,需要在硬件系统中运行,才能够组成一个完整的单片机系统。
一般的必备硬件有:编程器:用来将程序烧录到单片机中的工具;单片机学习板:用来演示和检验单片机系统是否实现了既定功能。
三、对于单片机的硬件电路的设计需要指出的是,单片机的硬件电路是千差万别的,尤其是在制作电路板的时候,牵涉到元器件的布局、走线、抗干扰等多种环境问题,所以单单依靠一个仿真软件是很难真实模拟单片机系统的工作的。
所以在这里的学习,只是作为一种辅助开发的手段,我们可以先将我们的电路和程序在该软件上进行验证,验证通过后在制作电路板进行实际验证。
四、下面简单地对proteus软件的入门进行以下介绍PROTEUS软件是英国Labcenter electronics公司研发的EDA工具软件。
它是一个集模拟电路、数字电路、模/数混合电路以及多种微控制器系统为一体的系统设计和仿真平台。
是目前同类软件中最先进、最完整的电子类仿真平台之一。
proteus I2C DEBUGGER 仿真 51单片机 光强模块 BH1750fvi
proteus I2C DEBUGGER 仿真 51单片机光强模块 BH1750fvi
先上效果图
先说一下怎样使用 I2C DEBUGGER:
(1)连接方法:如上图,和单片机连好即可,在程序中设置相应端口。
(2)设置I2C DEBUGGER 的地址如在本例子中 BH1750 是从机器件,所以要设置地址码 0x46. other porperties 里面不用设置,全是自动的。
等你在后面在predefined sequences 里面设置以后就会自动出现。
(3)仿真开始后I2C DEBUGGER 会自动运行,并会在需要从机器件相应的时候自动暂停。
(4)在I2C DEBUGGER 窗口的右下角输入对应的命令。
S (启动主机用) A(应答) N (不应答) Sr(重新开始) P(停止)
命令格式如上面输入的格式 16位H码以 0x 开头,(必须是小写 x)。
然后按 Add 添加到列表
例如输入上面的样子分别对应初始化;开启电源;设置模式;传回数据;
A ; A ; A ; A 0x83 0x90;
当仿真暂停后选中 A 按 Queue 键再按暂停键,继续运行仿真,就会进入吓一条命令。
然后再选中下一步的A 或者其他语句,就可以逐渐完成仿真。
也可一次将好几步的命令通过 Queue键全部添加到 Queued Sequences 窗口中。
一次完成多步仿真。
当然也可以一次把全部应答码都写成一条语句
效果如上图。
代码源自网络,大家自己找一下吧。
自己动手丰衣足食。
51单片机制作的电子时钟的proteus仿真
通过proteus仿真51单片机制作的电子钟----------by lyz这是一个利用proteus仿真简易电子钟的例子,通过c51单片机和一块1602液晶显示屏来工作,十分简单,这样的实践是初学者不错的练习。
第一步:首先,点开isis.exe(切记不是ARES.EXE),如图1通过proteus把原理图布好。
单片机可以选用AT89c51,液晶显示可通过搜索关键字LM016L得到。
由于本电路选用P0口,因此加上了RP1排阻作为上拉电阻。
图1第二步:编写程序如下,时间略有误差(us级),可通过keil中的debug调试地更为精确:#include<reg52.h>typedef unsigned char uchar;typedef unsigned int uint;sbit rs=P3^2;sbit wr=P3^3;sbit lcden=P3^4;uchar timecount=0;void delay(uint i){uint a,b;for(a=i;a>0;a--)for(b=10;b>0;b--);}/********************1602*****************/ void write_com(uchar com){P0=com;rs=0;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void write_date(uchar date){P0=date;rs=1;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void init(){wr=0;write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x01);delay(20);}/*********************************************************主函数**********************************************************/void main(){uchar a,second=0,minute=0,hour=0;uchar table[8];TMOD|=0x01; //定时/计数器0工作于定时器模式,方式1TH0=(65536-5000)/256;TL0=(65536-5000)%256; //50ms定时常数EA=1; //开总中断ET0=1; //允许定时/计数器0 中断TR0=1; //启动定时/计数器0 中断P0=0;P2&=0x1F;init();while(1){if(timecount>19) //*****20乘50为1000ms {timecount=0;second++;}if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(hour==24){hour=0;}table[0]=hour/10+48; //***数字加上48对应的它的ascll码,用来显示在液晶上table[1]=hour%10+48;table[2]=58; //***58对应冒号table[3]=minute/10+48;table[4]=minute%10+48;table[5]=0;table[6]=second/10+48;table[7]=second%10+48;write_com(0x80);delay(20);for(a=0;a<8;a++){write_date(table[a]);delay(20);}}}/*********************************************************中断服务函数**********************************************************/void Time0(void) interrupt 1 // using 0{TH0=(65536-5000)/256;TL0=(65536-5000)%256; //50ms定时常数timecount++;}/*********************************************************/第三步:双击电路图中的单片机,如下添加hex文件。
3基于proteus的51单片机仿真实例二、关于proteus
基于proteus的51单片机仿真实例二、关于proteus一、proteus的使用proteus软件能对单片机系统同时进行软件和硬件仿真。
是初学单片机而又没有硬件工具的一个很好的选择。
后面的学习将以protwus 7.4中文版为学习平台。
1、软件的下载、安装、破解该软件可在本论坛搜索找到,这里给出链接:/thread-71645-1-1.html关于软件的安装、注册在这里就不再多说了。
2、proteus的主要功能特点Proteus是英国Labcenter公司开发的电路分析与实物仿真及印制电路板设计软件,它可以仿真、分析各种模拟电路与集成电路,软件提供了大量模拟与数字元器件及外部设备,各种虚拟仪器,特别是它具有对单片机及其外围电路组成的综合系统的交互仿真功能。
Proteus主要由ISIS和ARES两部分组成,ISIS的主要功能是原理图设计及与电路原理图的交互仿真,ARES主要用于印制电路板的设计。
1)实现单片机程序仿真和电路仿真的的结合。
proteus可以进行模拟电路、数字电路的仿真;更主要的是,它可以进行单片机软硬件系统的综合仿真。
可以对单片机系统的各种功能进行仿真,如串口、I2C、SPI、按键、数码管、液晶等。
2)支持多种单片机和嵌入式系统的仿真目前可以支持51系列,6800系列,PIC系列、AVR系列、MSP430系列以及部分ARM系列。
同时支持上千种外围器件。
3)提供软件调试功能proteus仿真系统具有全速、单步、设置断点等调试功能。
同时在程序的运行过程中还可以观察变量、寄存器的当前状态。
还支持第三方的软件编译和调试环境,对于51单片机来说,proteus可以和keil c51实现联调。
4)强大的原理图和PCB图绘制功能。
在protes中,可以快速、方便的绘制单片机应用系统的电路原理图。
3)proteus软件的操作介绍在以后的学习中,主要进行的是原理图设计及与电路原理图的交互仿真,所以这里只介绍智能原理图输入系统ISIS的工作环境和操作。
基于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。
基于proteus的51单片机仿真实例四、第一个proteus仿真实例
基于proteus的51单片机仿真实例四、第一个proteus仿真实例现在来做第一个基于proteus的仿真实例,同时也了解、熟练一下proteus的使用方法1、打开proteus的智能原理图输入系统ISIS,进入工作环境,2、这个实例中,我们建立如下的电路图。
下面就开始一步一步的实现这个目标吧。
3、单击菜单栏“文件”--“新建设计”选项,弹出模板选择窗口,如下图所示,选择默认模板“DEFAULT”,选择“OK”按钮,即可创建一个新的设计文件。
4、文件创建成功后,要养成立即保存的习惯。
点击“保存”选项,选择保存的路径和文件名。
5、元件的选取。
操作步骤如下图6、点击“P”按钮后,弹出元器件选择对话框。
元器件的选取有两种方法:输入关键字查找、在分类元件中查找。
如下图所示7、添加单片机,在关键字文本框中输入“at89c51”,然后从搜索结果中选择所需要的型号,如下图所示。
选中元件后双击该元件名,该元件就被自动添加到对象选择器。
8、添加电阻。
输入关键字“resistors 470r”,搜索结果栏中将显示所有的匹配元件。
在这里我们选择参数为470R,0.6W的电阻,双击元件名将其添加到对象选择器中。
用同样的方法添加10K电阻(0.6W)到对象选择器中。
9、添加发光二极管。
输入关键字“led-yellow”,在搜索结果栏中选择所需的发光二极管,双击将其放入对象选择器。
10、添加晶振。
输入关键字“cycrtal”,结果搜索栏内只有一种晶振类型,双击将其加入对象选择器。
11、添加电容。
添加33P电容:输入关键字“capacitors”,在搜索结果栏内列出了各种类型的电容,接着输入“33pF”。
则列出各种33pF的电容,选择耐压为50V的电容,双击将其加入对象选择器。
添加10U电容,输入关键字“capactions 10u”,选择“50V radial electrolytic”(圆柱形电解电容),双击将其添加到对象选择器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机仿真实例
l示例6—扫描与判断—(单端口)位扫描与字节(多端口)扫描
这是一个常用程序段—子程序—标准程序,
通过端口扫描而获得输入数据或控制输出数据,达到节
省位或字节的目的—节约硬件资源。
关于扫描,可以从位及其取反实现流水灯着手来理解。
可以通过移位实现流水灯—扫描。
可以通过字节数据(01H,02H,04H,08H,10H,20H,40H,80H—阳极管)的端口发送实现流水灯—扫描。
可以通过数据表(DB01H,02H,04H,08H,10H,20H,40H,80H—阴极管)实现流水灯—扫描。
可以通过循环跳转实现流水灯—扫描。
扫描注意入比出查—获得输入要比
较数据、发送输出要检查出口
扫描获取端口字节
扫描输出位移动产生动态效果(01、02、04、08、10、20、40、80),可以用字节表
扫描输出字符字节,通过延时可以变换字符以便造成数
字进位效果
ORG 0000H
START:
dbufequ30h;置存储区首址tempequ40h;置缓冲区首址org 00h
mov 30h,#2 ;存入数据mov 31h,#0
mov 32h,#1
mov 33h,#0
mov 34h,#7
mov 35h,#1
mov r0,#dbuf
mov r1,#temp
mov r2,#6;六位显示器
mov dptr,#segtab ;段码表首地址dp00:mov a,@r0
;取要显示的数据
movc a,@a+dptr ;查表取段码mov @r1,a;段码暂存
inc r1
inc r0
djnz r2,dp00
disp0:mov r0,#temp;显示子程序mov r1,#6;扫描6次
mov r2,#01h;从第一位开始
dp01:mov a,@r0
mov p2,a;段码输出
mov a,r2 ;取位码
mov p1,a;位码输出
acall delay;调用延时
mov a,r2
rl a
mov r2,a
inc r0
djnz r1,dp01
sjmp disp0
segtab:db 0C0H,0F9H,0A4H,0B0H,99H,92H;共阳极管
db 82H,0F8H,80H,90H,88H,88H,83H
delay:mov r4,#29h;延时子程序
aa1:mov r5,0ffh
aa:djnz r5,aa
djnz r4,aa1
ret
end
************************************************* ***********************
还可以用其他程序形式进行扫描,像循环、递增或递减判断程序等。
扫描技术可以用于点阵显示,液晶板(LCD)显示。
这些都需要字符编码、显示延时、扫描端口以充分利用资源(节约资源)。
l实例1—关于动态显示—LED闪烁
ORG 0000H
START:
MOVA,#0FFH;字节传送
MOVP3,A;字节传送
MOVP1,A
MOV C, 0A0H;位传送
JNB0A0H,GUAN;判断位电平低为真,则转移;直接地址
位为0转移
MOVP1,#00H;P1口先赋#0FFH,再赋#00H,则产生闪烁RET
GUAN :
MOVP3,#00H;P3口先赋#0FFH,再赋#00H,则产生闪烁,也可以使用取反指令
RET;可以产生闪烁效果
END
其他方法(如:延时子程序)也可以实现动态显示。
l实例2—单个LED灯-单个按键的仿真
ORG0000H;这是伪指令,机器并不执行,用于程序的交流。
指令执行的起始地址,十进制用D表示,十六进制
用H表示,二进制用B表示。
一个字节(8位机、16位机、32位机、64位机)一次执行。
也可以按位来执行,也就是一个bit。
ORG00000000B与ORG0000H作用相同。
注意8位(bit)
一个字节。
16位的处理器需要用0000 0000H表示。
16
或32位以上,使用操作系统(Wince、Linux等)更有效,可以利用大量的、底层的、专业化、标准化的面向控制
的库函数(如:API等)。
START:;这是伪指令,机器并不执行。
只是为了汇编语
言讲故事的可理解性
MAIN:
;伪指令,主程序,用于区别子程序
PC→MOVA,#00H;将立即数00000000B(常数0D)
传送给累加器ACC(专用寄存器,可用于存放计算结果等)。
要通过累加器A和其它存储地址进行数据交换。
注意PC是自动移位(自动+1)到下一个语句的地址。
使用该语句实质上是让PC具有初始位置。
PC→MOVP1,A;将累加器中的数(常数0D)传送给端
口P1(P1口8位全部置0,低电平,P1端口各位处于关闭状态,LED灯处于系统响应的准备状态),按字节传送数据。
特别记忆:PC→表示指针所指地址,并会自
动加1。
PC→MOVC,0A0H;检测P2.0口的状态,将P2.0口的状态(由按键状态决定)传送给位累加器C,位累加器C 的地址是PSW(程序状态字寄存器)的进位标志位
CY(D7H\PSW.7)。
P2.0口可以是开或关,也就是置1或0,高电平或低电平),按字节传送数据。
要通过位累加器C 和其它存储地址进行数据交换。
该语句也可以写成:MOVC,P2.0,比较字节数据传送MOVA,#00H或MOVA,P1。
PC→MOVP1.0,C;等价于MOV90H,C;将位累加器C 地址中的值传送给P1.0口(90H是其直接地址),也就
是将P2.0口的状态(由直接地址0A0H状态决定)传送给直接地址90H,P1.0口
PC→MOVP1.1,C ;等价于MOV91H,C
PC→MOVP1.2,C ;等价于MOV92H,C
PC→MOVP1.3,C ;等价于MOV93H,C等等END;伪指令,程序结束标志
l实例3—扫描实现数字移动变化的仿真l实例4—双数码管双端口数字进位仿真
l实例5—双四数码管组双端口数字显示—单端口扫描移动仿真—点阵
双四数码管组双端口数字显示—单端口扫描移动仿真,可以被分解为
a)双四数码管组双端口数字显示—单端口无扫描无移动—>;数字变化(依靠数表和指针),
b)双四数码管组双端口数字显示—单端口扫描移动—>;数字不变化(依靠数表和指针),
c)双四数码管组双端口数字显示—单端口扫描移动—>;数字变化(依靠数表和指针),。