问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

懂80C51单片机的进~

发布网友 发布时间:2022-05-01 01:57

我来回答

5个回答

热心网友 时间:2022-06-22 03:48

贴上两个自己用过的LCD1602驱动(总线、IO口的都有,肯定派得上用场)
再贴上ADC0809总线上的驱动,只是不知道楼主的具体要求如何显示在LCD上,只能保存在数组里面
硬件连接在代码中已经基本补齐了,其他的应该不用再多说了吧?!^_^
*********************************************************************
/*===========================================================================

KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式 晓奇
=============================================================================
连接线图: LCM-------51 LCM-------51 LCM--------51
DB0-----P0.0 DB4-----P0.4 RW-------P2.0
DB1-----P0.1 DB5-----P0.5 RC-------P2.1
DB2-----P0.2 DB6-----P0.6 E--------P2.7 =>74ls00+wr+rd
DB3-----P0.3 DB7-----P0.7 VLCD接1K2电阻到GND

[注]:AT89C51的晶振频率为12MHz
============================================================================*/
//#pragma src // 产生汇编文件
#include <reg51.h>
#include<intrins.h>

//========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
#define Uchar unsigned char
#define Uint unsigned int

// ================= LCM1602A端口地址定义 =======================
char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0
char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1

#define Busy 0x80 // 忙判别位

code char exampl[]="For an example. - By xiaoqi\n";

void Delay400Ms(void);
void Delay5Ms(void);
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);

//================ 随便写几句测试主程序 ================
void main(void)
{
Uchar temp;

Delay400Ms(); // 启动时必须的延时,等待lcm进入工作状态

LcdReset(); // 这也是必需的....初始化
temp = 32;
ePutstr(0,0,exampl); // 上面一行显示一个预定字符串

Delay400Ms(); // 保留显示内容
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();

while(1)
{
temp &= 0x7f; // 只显示ASCII字符

if (temp<32)temp=32; // 屏蔽控制字符,不予显示
Display( temp++ );

Delay400Ms();
}
}

/*=======================================================
显示字符串
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
Uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;i<l;i++) {
DispOneChar(x++,y,ptr[i]);
if ( x == 16 ){
x = 0; y ^= 1;
}
}
}

/*=======================================================
演示一行连续字符串,配合上位程序演示移动字串
=======================================================*/
void Display( Uchar dd ) {

Uchar i;

for (i=0;i<16;i++) {

DispOneChar(i,1,dd++);

dd &= 0x7f;
if (dd<32) dd=32;
}
}

/*=======================================================
显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {

Uchar temp;

temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LcdWriteCommand(temp,0);
}

/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

LocateXY( x, y ); // 定位显示地址
LcdWriteData( Wdata ); // 写字符
}

/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) {

LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delay5Ms();
LcdWriteCommand( 0x38, 0); // 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();

LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( 0x01, 1); // 显示清屏
LcdWriteCommand( 0x06, 1); // 显示光标移动设置
LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
}

/*=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

if (AttribC) while( Lcd1602StatusPort & Busy ); // 检测忙信号?
Lcd1602CmdPort = CMD;
}

/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW ) {

while( Lcd1602StatusPort & Busy ); // 检测忙信号
Lcd1602WdataPort = dataW;
}

// 短延时
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}

//长延时
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
while(j--);
};
}

*********************************************************************
/*===================================================================

KS0070(44780) 16x2 字符液晶屏驱动演示程序 晓奇
=====================================================================
连接线图: LCM-------51 LCM-------51 LCM--------51
DB0-----P0.0 DB4-----P0.4 RS-------P2.5
DB1-----P0.1 DB5-----P0.5 RW-------P2.6
DB2-----P0.2 DB6-----P0.6 E--------P2.7
DB3-----P0.3 DB7-----P0.7 VLCD接1K2电阻到GND

[注]:AT89C51的晶振频率为12MHz
====================================================================*/

#include <reg51.h>
#include<intrins.h>

//变量类型标识的宏定义,大家都喜欢这么做
#define Uchar unsigned char
#define Uint unsigned int

// 控制引脚定义,不同的连接必须修改的部分
sbit RS = P2^5;
sbit RW = P2^6;
sbit Elcm = P2^7;
#define DataPort P0 // 数据端口,必须上拉电阻

#define Busy 0x80

code char exampl[]="For an example. - By xiaoqi\n";

void Delay400Ms(void);
void Delay5Ms(void);
void WaitForEnable( void );
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);

//测试主程序
void main(void)
{
Uchar temp;

Delay400Ms();

LcdReset();
temp = 32;
ePutstr(0,0,exampl); // 上面一行显示一个预定字符串

Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();

while(1)
{
temp &= 0x7f; // 只显示ASCII字符
if (temp<32)temp=32; // 屏蔽控制字符,不予显示
Display( temp++ );
Delay400Ms();
}
}

/*=======================================================
显示字符串
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
Uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;i<l;i++) {
DispOneChar(x++,y,ptr[i]);
if ( x == 16 ){
x = 0; y ^= 1;
}
}
}

/*=======================================================
演示一行连续字符串,配合上位程序演示移动字串
=======================================================*/
void Display( Uchar dd ) {

Uchar i;

for (i=0;i<16;i++) {
DispOneChar(i,1,dd++);
dd &= 0x7f;
if (dd<32) dd=32;
}
}

/*=======================================================
显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {

Uchar temp;

temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LcdWriteCommand(temp,0);
}

/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

LocateXY( x, y ); // 定位显示地址
LcdWriteData( Wdata ); // 写字符
}

/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) {

LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delay5Ms();
LcdWriteCommand( 0x38, 0); // 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();

LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( 0x01, 1); // 显示清屏
LcdWriteCommand( 0x06, 1); // 显示光标移动设置
LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
}

/*=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

if (AttribC) WaitForEnable(); // 检测忙信号?

RS = 0; RW = 0; _nop_();

DataPort = CMD; _nop_(); // 送控制字子程序

Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允许脉冲信号
}

/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW ) {

WaitForEnable(); // 检测忙信号

RS = 1; RW = 0; _nop_();

DataPort = dataW; _nop_();

Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号

}

/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================*/
void WaitForEnable( void ) {

DataPort = 0xff;

RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();

while( DataPort & Busy );

Elcm = 0;
}

// 短延时
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}

//长延时
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
while(j--);
};
}

*********************************************************************
#include<REG51.H>
#include<ABSACC.H>
#define uchar unsigned char
//通道号,根据硬件实际改动
#define IN0 XBYTE[0X0000] //通道0
#define IN1 XBYTE[0X0001]
#define IN2 XBYTE[0X0002]
#define IN3 XBYTE[0X0003]
#define IN4 XBYTE[0X0004]
#define IN5 XBYTE[0X0005]
#define IN6 XBYTE[0X0006]
#define IN7 XBYTE[0X0007]

sbit ad_busy=P3^5;

void AD0809(uchar idata *x);

//调用该程序后应将模拟量转换成数字量存于一数组adcRes[]之中
void AD0809(uchar idata *adcRes)
{
uchar i;
data uchar xdata *ad_adr;
ad_adr=&IN0; // 指向第一个通道
for(i=0;i<8;i++) {
*ad_adr=0; //启动AD转换
ad_busy=0; //调试后发现0才是正确的
while(ad_busy==0); //等待AD转换结束
adcRes[i]=*ad_adr; //保存转换结果
ad_adr++; //下一个通道
}
}

热心网友 时间:2022-06-22 03:48

<br />第1章 绪论<br /> 1.1 单片机应用的发展与特点<br /> 1.2 单片机系统的设计理念<br /> 1.3 80C51单片机的综合评述<br /> 1.3.1 80C51单片机的内部结构<br /> 1.3.2 80C51单片机的存储器特点<br /> 1.3.3 80C51单片机的端口特点<br /> 1.3.4 80C51单片机的中断系统<br /> 1.3.5 80C51单片机的串行口功能和定时/计数器<br /> 1.3.6 80C51单片机的指令集<br /> 1.4 80C51单片机的主要型号及发展<br /> 1.4.1 ATMEL89系列单片机<br /> 1.4.2 Philips89系列单片机<br /> 1.4.3 其他闪存系列的51单片机<br /> 1.4.4 0TP系列的51单片机<br />第2章 系统的硬件配置与80C51接口电路<br /> 2.1 单片机的接口电路与接*术<br /> 2.2 80C51单片机常用的输入接口电路<br /> 2.2.1 按键输入接口电路<br /> 2.2.2 拨码开关和拨码盘的输入接口电路<br /> 2.2.3 脉冲式传感器类型与输入接口电路<br /> 2.2.4 比较器和施密特输入电路<br /> 2.2.5 A/D转换器输入接口电路<br /> 2.3 80C51单片机常用的输出接口电路<br /> 2.3.1 位输出接口电路<br /> 2.3.2 LED显示接口电路<br /> 2.3.3 LCD显示器接口电路<br /> 2.3.4 D/A转换器接口电路<br /> 2.3.5 变宽脉冲RC滤波调压和数字电位器接口电路<br /> 2.4 外存储器接口电路和串行收发器接口电路<br /> 2.4.1 串行非易失性外存储器的接口电路<br /> 2.4.2 并行非易失性外存储器的接口电路<br /> 2.4.3 串行总线收发器接口电路<br /> 2.5 时钟振荡、复位、μP监控和外接看门狗电路<br />第3章 I/O口的配置技术与对应的编程<br /> 3.1 80C51单片机各I/O口的特点与使用原则<br /> 3.1.1 80C51单片机各I/O口的结构特点与注意事项<br /> 3.1.2 80C51单片机各I/O口的使用原则<br /> 3.2 I/O口的复用技术<br /> 3.2.1 偶尔承担输入任务的输出口复用技术<br /> 3.2.2 第二功能与I/O功能的复用技术<br /> 3.2.3 多用途系统中的I/O口复用技术<br /> 3.2.4 I/O口复用技术举例<br /> 3.3 I/O口的并用技术<br /> 3.3.1 增强驱动能力<br /> 3.3.2 提高功能适应性<br />第4章 80C51的软件编程分析<br /> 4.1 80C51单片机的编程环境<br /> 4.2 程序的错误分析与避免方法<br /> 4.2.1 汇编语言编程的出错问题<br /> 4.2.2 主程序和子程序易犯错误的分析与避免<br /> 4.2.3 中断服务程序易犯错误的分析与避免<br /> 4.2.4 编写特殊指令和程序段易犯的错误<br /> 4.2.5 使用串行口方式0易犯的错误<br /> 4.3 提高程序实时性的措施<br /> 4.3.1 处理随机突发任务提高实时性的措施<br /> 4.3.2 使用定时中断来处理简单但不宜耽搁的循环操作<br /> 4.3.3 优化程序结构和分层查询<br /> 4.4 提高定时精度和软件的细节质量<br /> 4.4.1 提高定时精度的措施<br /> 4.4.2 提高软件细节质量的几点措施<br />第5章 常用程序段的结构与编程<br /> 5.1 程序的合理结构与编程<br /> 5.1.1 主程序的合理结构与编程<br /> 5.1.2 子程序的合理结构与编程<br /> 5.2 键盘扫描程序的编程与分析<br /> 5.2.1 键盘扫描程序的组成及各部分的功能<br /> 5.2.2 几种常用键盘的扫描查询程序<br /> 5.2.3 多功能复用键的编程<br /> 5.3 数码管显示程序的编程与分析<br /> 5.3.1 并行输出动态驱动数码管的显示程序<br /> 5.3.2 译码器输出驱动数码管的显示程序<br /> 5.3.3 串行输出静态驱动数码管的显示程序<br />第6章 80C51设计应用实例<br /> 6.1 高可靠性警示灯续接控制器<br /> 6.1.1 装置原理与硬件最小系统设计<br /> 6.1.2 软件的编程设计<br /> 6.2 加热炉升温速度和温度曲线调节器<br /> 6.2.1 控制续增通电占空比的温升调节器的设计<br /> 6.2.2 通过测量比较进行控制的温度曲线跟随调节器的设计<br /> 6.3 转速-温度测量仪<br /> 6.3.1 装置原理与硬件系统设计<br /> 6.3.2 软件的编程设计<br /> 6.4 基于RS-485通信的变频器运行参数显示调节器<br /> 6.4.1 硬件系统设计<br /> 6.4.2 软件设计与各个功能的协调实现<br /> 6.5 机械平台调节定位控制器<br /> 6.5.1 硬件系统的设计<br /> 6.5.2 软件程序设计<br />第7章 单片机系统的可靠性设计<br /> 7.1 提高安全可靠性的设计原则与措施<br /> 7.1.1 输入/输出接口电路的完善性设计<br /> 7.1.2 电源的合理设计与选用<br /> 7.1.3 器件选择留有适当的负荷充裕度<br /> 7.1.4 充分与合理地使用保安保险元器件<br /> 7.1.5 合理的布线及安装工艺<br /> 7.2 抗干扰措施的选择与使用<br /> 7.2.1 硬件的抗干扰设计<br /> 7.2.2 软件的抗干扰设计<br /> 7.3 系统的容错性设计<br /> 7.3.1 系统与外部连接接口的避错与容错<br /> 7.3.2 软件的容错性设计<br />附录A 80C51指令一览表<br />附录B 80C51的位地址<br />附录C 80C51的中断设置<br />附录D 定时器/计数器的设置<br />附录E 80C51串行口的设置<br />附录F AT89S8252增加的SFR<br />附录G P89LPC938的SFR一览表<br />附录H 测量转速值的部分子程序<br />参考文献 <br />

热心网友 时间:2022-06-22 03:49

你好 这个是我做过的一个实验 我已经发你消息了 请查收

热心网友 时间:2022-06-22 03:49

我是做实物的。如果是只要论文的话就不要找我了。QQ654790769。

热心网友 时间:2022-06-22 03:50

不会
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
雄安 为什么涨 中国对沙特,中国入球了吗 国足vs沙特首发是什么时候? 中国对沙特谁进的球 中国沙特阵容 河北雄县为什么这么火 河北雄县为什么火了 雄县 为什么突然这么火 为什么雄安新区这么火 总是听说好白菜都让猪拱了,到底是什么意思 为啥阿姨街边卖的“特色”米线比吃肉还爽呢? 重庆有哪些比较好吃的米线? 300字美文摘抄!!! lcd1602液晶显示滚动汇编语言具体解释,请说一下这个程序的整个思路,没注释的地方是什么意思 美文摘抄{100到150}字的,还要赏析的{必须要的} 写出编程LCD1602液晶的初始化程序 库车美食 库车县有哪些名小吃? 单片机与DS18B20并用LCD1602显示 c程序 求助。一个关于51单片机的设计程序【遥控LCD1602显示的简易计算器设计】 .....求救 求个C语言的程序 四百字的美文摘抄 单片机LCD1602液晶显示的汇编程序 一篇摘抄 摘抄一篇美文,要有好段,点评(手法等),感受。 每天就要 九江教师资格考试报名是什么时候 主比例尺,局部比例尺的含义,在什么样的地图上会出现 请问含比例尺的图怎么画? 1:400000比例尺怎么画图? 请在红绿灯处,穿过马路,用英语怎么说?(take开头) “她必须注意交通信号灯和牢记交通规则”这句话英语怎么说? 电子狗路过红绿灯说的英语单词是什么意思 单片机控制字符型液晶显示器LCD1602显示字符信息 LCD1602和LCD12864液晶显示屏初始化程序一样吗?有什么不同?哪位大侠告诉我一下啊 成都特色乌鸡米线哪个最出名? 云南的特色过桥米线,米线为什么还要“过桥”? 四川特色米线小吃 之后3剧情 《after之后4》结局是什么? 穿越西元3000后3话讲了什么 关于苏菲的世界 后三章内容(生日宴会、对位法、那轰然一响) 后母的三巴掌主要讲了什么 大战:原力觉醒》新三部曲的后两部会说什么故事 《三部曲》主要讲了什么? 乡村爱情1后三集讲述什么? 金玫瑰洞后3部讲了什么? 怀玉公主最后三集说了什么内容? 《童年》最后三章的主要内容 死亡笔记3讲的是什么内容? 国维集团怎么样,是不是大企业呀? 国维集团是做什么的? 国维集团是大企业吗?