懂80C51单片机的进~

条件:80C51单片机,ADC0809,LCD1602及按键。目的:8路PT100温度巡检0~100度。1)电路图2)说明(大致主要的引脚功能等设计说明)3)流程图4)A... 条件:80C51单片机,ADC0809,LCD1602及按键。
目的:8路PT100温度巡检0~100度。
1)电路图 2)说明(大致主要的引脚功能等设计说明)
3)流程图 4)ADC0809和LCD1602的驱动子程序

我知道不可能有人全做出来,那很费时间的,但不管你懂不懂,自己写的或网上搜的,只要你留下我可能需要的,分就是你的!!!

懂这的大哥如果可以帮我更详细的做出来请发我消息,我重谢!!分不是问题~在此先谢谢了~
展开
 我来答
百度网友f0c8137
2008-12-07 · TA获得超过954个赞
知道小有建树答主
回答量:239
采纳率:0%
帮助的人:336万
展开全部
贴上两个自己用过的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++; //下一个通道
}
}
君子子斜斜s
2008-12-07
知道答主
回答量:35
采纳率:0%
帮助的人:0
展开全部
<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 />
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shff0123
2008-12-08 · TA获得超过257个赞
知道小有建树答主
回答量:433
采纳率:0%
帮助的人:298万
展开全部
你好 这个是我做过的一个实验 我已经发你消息了 请查收
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匡秀越By
2008-12-08 · TA获得超过1220个赞
知道小有建树答主
回答量:805
采纳率:0%
帮助的人:384万
展开全部
我是做实物的。如果是只要论文的话就不要找我了。QQ654790769。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yade1234
2008-12-07 · TA获得超过948个赞
知道小有建树答主
回答量:1033
采纳率:0%
帮助的人:444万
展开全部
不会
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式