LED和LCD冲突时,sbit LED = P1^4;LED=0;delayms(1000);LED=1,为什么数码管会亮

时间: 2024-04-01 13:32:02 浏览: 16
这可能是因为LED和LCD使用了相同的芯片引脚,导致在控制LED灯时,不小心改变了LCD的状态。在8051单片机中,LED和LCD的控制一般都使用P1口的不同位,因此可以尝试将LED的控制换成P0口的其他位,或者使用外部扩展芯片来控制LED灯,避免与LCD冲突。同时,也要注意在控制LCD时,不要误操作LED灯的状态。
相关问题

补齐这段C51代码,完成ADC0808的数字电压表虚拟仿真,在LCD1602上显示电压(格式:v=X.XXV,其中“X”对应具体值): #include "reg52.h" #include "intrins.h" typedef unsigned int uint; typedef unsigned char uchar; sbit CLOCK=P3^2; sbit EOC=P3^3; sbit START=P3^4; sbit OE=P3^5; sbit OUT8=P1^0; sbit OUT7=P1^1; sbit OUT6=P1^2; sbit OUT5=P1^3; sbit OUT4=P1^4; sbit OUT3=P1^5; sbit OUT2=P1^6; sbit OUT1=P1^7; sbit D0=P0^0; sbit D1=P0^1; sbit D2=P0^2; sbit D3=P0^3; sbit D4=P0^4; sbit D5=P0^5; sbit D6=P0^6; sbit D7=P0^7; sbit RS=P2^6; sbit RW=P2^5; sbit E=P2^7;

uchar code table[]="0123456789"; // 数码管字符表 void DelayUs2x(uint t) { while(t--); } void DelayMs(uint t) { while(t--) { DelayUs2x(245); DelayUs2x(245); } } void WriteCommand(uchar com) { RS=0; RW=0; P0=com; E=1; _nop_(); _nop_(); _nop_(); E=0; } void WriteData(uchar dat) { RS=1; RW=0; P0=dat; E=1; _nop_(); _nop_(); _nop_(); E=0; } void InitLcd() { WriteCommand(0x38); DelayMs(5); WriteCommand(0x38); DelayMs(5); WriteCommand(0x38); DelayMs(5); WriteCommand(0x38); WriteCommand(0x08); WriteCommand(0x01); WriteCommand(0x06); WriteCommand(0x0c); } uchar ReadADC0808(uchar chn) // 读取ADC0808采集的电压值 { uchar dat=0; OE=1; START=1; CLOCK=0; CLOCK=1; dat|=((D7<<7)|(D6<<6)|(D5<<5)|(D4<<4)|(D3<<3)|(D2<<2)|(D1<<1)|D0); OE=0; return dat; } void main() { uchar value; float voltage; InitLcd(); WriteCommand(0x80); WriteData('v'); WriteData('='); WriteData(' '); while(1) { value=ReadADC0808(0); // 采集通道0的电压值 voltage=value*5.0/255; // 获取实际电压值 WriteCommand(0x87); // 设置光标位置 WriteData(table[(int)voltage]); // 显示整数部分 WriteData('.'); // 显示小数点 voltage=voltage-(int)voltage; // 获取小数部分 voltage*=100; WriteData(table[(int)voltage]); // 显示小数部分的整数部分 WriteData(table[(int)(voltage*10)%10]); // 显示小数部分的小数部分 WriteData('V'); // 显示单位 DelayMs(500); } }

#include<reg51.h> sbit MCP_SCK=P1^0; sbit MCP_MISO=P1^1; sbit MCP_CS=P1^2; sbit qianw= P2^0; sbit baiw = P2^1; sbit shiw = P2^2; sbit wan = P2^3; sbit qian = P2^4; sbit bai = P2^5; sbit shi = P2^6; sbit ge = P2^7; unsigned char date[8];//数码管位选 unsigned char code tb[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char code dx516[3] _at_ 0x003b; void delay(unsigned int j) { unsigned char i=250; for(;j>0;j--) { while(--i); i=249; while(--i); i=250; } } unsigned int read_MCP(void) { unsigned int temp = 0; unsigned char i; MCP_CS=1; delay(1); MCP_CS=0; MCP_SCK=0; for(i=0;i<13;i++) { MCP_SCK=1; temp<<=1; if(MCP_MISO == 1) temp |=0x01; MCP_SCK = 0; } MCP_CS=1; temp &=0x03FF; return temp; } char code dx516[3] _at_ 0x003b; void main() { unsigned int vt; unsigned int R; unsigned char i; P2 |=0xf0; switch(i) //位选,选择点亮的数码管, { case(0): P0 = date[0];qianw= 0;break; case(1): P0 = date[1];baiw = 0;break; case(2): P0 = date[2];shiw = 0;break; case(3): P0 = date[3];wan = 0;break; case(4): P0 = date[4];qian = 0;break; case(5): P0 = date[5];bai = 0;break; case(6): P0 = date[6];shi = 0;break; case(7): P0 = date[7];ge = 0;break; } i++; if(i==8) { i=0; } R=read_MCP; vt = 2.5*R/1024; //测量电压值 date[0] =tb[vt/1000]; date[1] =tb[vt/1000]; date[2] =tb[vt/1000]; date[3] =tb[vt/1000]; date[4] =tb[vt/100%10]; date[5] =tb[vt/10%10]; date[6] =tb[vt%10]; date[7] =0x0a; }怎么改正确

以下是修改后的代码,已经解决了原来代码存在的问题: ```c #include<reg51.h> sbit MCP_SCK=P1^0; sbit MCP_MISO=P1^1; sbit MCP_CS=P1^2; sbit qianw = P2^0; sbit baiw = P2^1; sbit shiw = P2^2; sbit wan = P2^3; sbit qian = P2^4; sbit bai = P2^5; sbit shi = P2^6; sbit ge = P2^7; unsigned char date[8];//数码管位选 unsigned char code tb[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(unsigned int j) { unsigned char i = 250; for(;j>0;j--) { while(--i); i = 249; while(--i); i = 250; } } unsigned int read_MCP(void) { unsigned int temp = 0; unsigned char i; MCP_CS = 1; delay(1); MCP_CS = 0; MCP_SCK = 0; for(i=0; i<13; i++) { MCP_SCK = 1; temp <<= 1; if(MCP_MISO == 1) temp |= 0x01; MCP_SCK = 0; } MCP_CS = 1; temp &= 0x03FF; return temp; } void main() { unsigned int vt; unsigned int R; unsigned char i = 0; // 将 i 初始化为 0 P2 |= 0xf0; while(1) // 加入死循环 { switch(i) // 位选,选择点亮的数码管 { case(0): P0 = date[0]; qianw = 0; break; case(1): P0 = date[1]; baiw = 0; break; case(2): P0 = date[2]; shiw = 0; break; case(3): P0 = date[3]; wan = 0; break; case(4): P0 = date[4]; qian = 0; break; case(5): P0 = date[5]; bai = 0; break; case(6): P0 = date[6]; shi = 0; break; case(7): P0 = date[7]; ge = 0; break; } i++; if(i == 8) { i = 0; } R = read_MCP(); // 加上函数括号 vt = 2.5 * R / 1024.0; // 将 vt 的数据类型声明为 float 或 double,以保留小数部分 date[0] = tb[vt / 1000]; date[1] = tb[vt / 100 % 10]; // 取出百位上的数码 date[2] = tb[vt / 10 % 10]; // 取出十位上的数码 date[3] = tb[vt % 10]; // 取出个位上的数码 date[4] = 0x00; // 将千位上的数码设置为 0 date[5] = 0x00; // 将万位上的数码设置为 0 date[6] = 0x00; // 将亿位上的数码设置为 0 date[7] = 0x0a; delay(500); // 延时 500ms } } ```

相关推荐

#include <reg52.h> unsigned char Table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned char Table_F[] = {0x8e}; sbit SEG1 = P3^7; sbit SEG2 = P3^6; sbit SEG3 = P3^5; sbit SEG4 = P3^4; sbit Irin = P3^2; sbit Irout = P3^3; sbit Key = P2^0; sbit SPK = P1^0; sbit LED = P2^7; unsigned char People = 0; unsigned char ALL = 0; #define uchar unsigned char #define uint unsigned int uint Num = 0; void Timer0Init(void); //50??@11.0592MHz void delay(unsigned int i) { char j; for(i; i > 0; i--) //??6000*200? for(j = 200; j > 0; j--); } void Delay_ms_89xx(unsigned int n_ms) //STC89Cxx ?? @11.0592MHz { unsigned char i, j; for(;n_ms>0;n_ms--) { i = 2; j = 176; do { while (--j); } while (--i); } } void main() { unsigned char count_sta = 0; unsigned char delay_time = 0; // IT0 = 1; //set INT0 int type (1:Falling 0:Low level) // EX0 = 1; //enable INT0 interrupt // EA = 1; //open global interrupt switch LED = 0; while(1) { //???? if(Key == 0) { People = 0; ALL = 0; } //???? if(Irin == 0) { Delay_ms_89xx(50); if(Irin == 0) { People++; ALL++; LED = 1; SPK = 0; while(Irin == 0); Delay_ms_89xx(500);Delay_ms_89xx(500); SPK = 1; LED = 0; } } if(Irout == 0) { Delay_ms_89xx(50); if(Irout == 0) { if(People > 0) { People --; } while(Irout == 0); } } //?? P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG1 = 0; P0 = ~Table[ALL/10]; delay(2); P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG2 = 0; P0 = ~Table[ALL%10]; delay(2); P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG3 = 0; P0 = ~Table[People/10]; delay(2); P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG4 = 0; P0 = ~Table[People%10]; delay(2); } } //External interrupt0 service routine void exint0() interrupt 0 //(location at 0003H) { Delay_ms_89xx(50); Num++; }程序逐步分析

最新推荐

recommend-type

Java 员工管理系统项目源代码(可做毕设项目参考)

Java 员工管理系统项目是一个基于 Java 编程语言开发的桌面应用程序,旨在管理员工的信息、津贴、扣除和薪资等功能。该系统通过提供结构和工具集,使公司能够有效地管理其员工数据和薪资流程。 系统特点 员工管理:管理员可以添加、查看和更新员工信息。 津贴管理:管理员可以添加和管理员工的津贴信息。 扣除管理:管理员可以添加和管理员工的扣除信息。 搜索功能:可以通过员工 ID 搜索员工详细信息。 更新薪资:管理员可以更新员工的薪资信息。 支付管理:处理员工的支付和生成支付记录。 模块介绍 员工管理模块:管理员可以添加、查看和更新员工信息,包括员工 ID、名字、姓氏、年龄、职位和薪资等。 津贴管理模块:管理员可以添加和管理员工的津贴信息,如医疗津贴、奖金和其他津贴。 扣除管理模块:管理员可以添加和管理员工的扣除信息,如税收和其他扣除。 搜索功能模块:可以通过员工 ID 搜索员工详细信息。 更新薪资模块:管理员可以更新员工的薪资信息。 支付管理模块:处理员工的支付和生成支付记录 可以作为毕业设计项目参考
recommend-type

CAD实验报告:制药车间动力控制系统图、烘烤车间电气控制图、JSJ型晶体管式时间继电器原理图、液位控制器电路图

CAD实验报告:制药车间动力控制系统图、烘烤车间电气控制图、JSJ型晶体管式时间继电器原理图、液位控制器电路图
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

优化MATLAB分段函数绘制:提升效率,绘制更快速

![优化MATLAB分段函数绘制:提升效率,绘制更快速](https://ucc.alicdn.com/pic/developer-ecology/666d2a4198c6409c9694db36397539c1.png?x-oss-process=image/resize,s_500,m_lfit) # 1. MATLAB分段函数绘制概述** 分段函数绘制是一种常用的技术,用于可视化不同区间内具有不同数学表达式的函数。在MATLAB中,分段函数可以通过使用if-else语句或switch-case语句来实现。 **绘制过程** MATLAB分段函数绘制的过程通常包括以下步骤: 1.
recommend-type

SDN如何实现简易防火墙

SDN可以通过控制器来实现简易防火墙。具体步骤如下: 1. 定义防火墙规则:在控制器上定义防火墙规则,例如禁止某些IP地址或端口访问,或者只允许来自特定IP地址或端口的流量通过。 2. 获取流量信息:SDN交换机会将流量信息发送给控制器。控制器可以根据防火墙规则对流量进行过滤。 3. 过滤流量:控制器根据防火墙规则对流量进行过滤,满足规则的流量可以通过,不满足规则的流量则被阻止。 4. 配置交换机:控制器根据防火墙规则配置交换机,只允许通过满足规则的流量,不满足规则的流量则被阻止。 需要注意的是,这种简易防火墙并不能完全保护网络安全,只能起到一定的防护作用,对于更严格的安全要求,需要
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

揭秘MATLAB分段函数绘制技巧:掌握绘制分段函数图的精髓

![揭秘MATLAB分段函数绘制技巧:掌握绘制分段函数图的精髓](https://img-blog.csdnimg.cn/direct/3821ea2a63d44e65925d8251196d5ca9.png) # 1. MATLAB分段函数的概念和基本语法** 分段函数是一种将函数域划分为多个子域,并在每个子域上定义不同函数表达式的函数。在MATLAB中,可以使用`piecewise`函数来定义分段函数。其语法为: ``` y = piecewise(x, x1, y1, ..., xn, yn) ``` 其中: * `x`:自变量。 * `x1`, `y1`, ..., `xn`,
recommend-type

如何用python运行loam算法

LOAM (Lidar Odometry and Mapping) 是一种基于激光雷达的SLAM算法,可以用于室内或室外环境的建图和定位。下面是一个基本的步骤来在Python中运行LOAM算法: 1. 安装ROS (Robot Operating System)和LOAM的ROS包 ``` sudo apt-get install ros-<distro>-loam-velodyne ``` 2. 安装Python的ROS客户端库rospy: ``` sudo apt-get install python-rospy ``` 3. 创建ROS工作空间并编译 ``` mkdir -p ~/ca