矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: 中国机器

仿真仿到手痒,干脆做出个成品(89C51+LCD1602万年历)

  [复制链接]
     
 楼主| 发表于 2011-4-21 15:19:59 | 显示全部楼层
原帖由 carlhzy 于 2011-4-21 09:33 发表
前辈 好像主程序开始部分中没有包含命令引用这个文件LCD18B20.h


下载下来看了一下,果然如此,引用的是“DS18B20_3.H”,那么文件“DS18B20.H”确实是没有用到的
回复 支持 反对

使用道具 举报

发表于 2011-4-21 23:08:06 | 显示全部楼层
大侠    我的单片机开发板端口和你所给程序定义的不一样,因此我改了程序中的端口定义,然后Proteus的连线图也换了,但是最后仿真失败了,实在不知道什么原因。。。能帮我看下嘛
我把改了的程序贴在下面,proteus连线图也贴出来
程序中换端口所在行      我有做记号  【】中的是原来的端口定义
/*****************************就开头这一部分有端口定义****************************************/

#include<reg51.h>
#include"DS18B20_3.H"
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
//flag用于读取头文件中的温度值,和显示温度值

#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbit rs=P3^5;//【【【【【【sbit rs=P2^0;】】】】】
sbit en=P3^4;//【【【【【【sbit en=P2^2;】】】】】
sbit rw=P3^6; //【【【【【【sbit rw=P2^1;】】】】】 //如果硬件上rw接地,就不用写这句和后面的rw=0了

sbit led=P2^6; //LCD背光开关

//DS1302时钟芯片与C51之间的引脚连接定义
sbit IO=P2^4;//【【【【【【sbit IO=P1^1;】】】】】
sbit SCLK=P2^5;// 【【【【【【sbit SCLK=P1^0;】】】】】
sbit RST=P3^3;//【【【【【【sbit RST=P1^2;】】】】】

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/************************************************************
ACC累加器=A
ACC.0=E0H

ACC.0就是ACC的第0位。Acc可以位寻址。

累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,
是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,
常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。
***************************************************************/

//校时按键与C51的引脚连接定义
sbit key1=P1^0; // 【【【【【【sbit key1=P1^5; 】】】】】 //设置键
sbit key2=P1^1; //【【【【【【sbit key2=P1^6; 】】】】】 //加键
sbit key3=P1^2; //【【【【【【sbit key3=P1^7;】】】】】  //减键

sbit buzzer=P2^3;//【【【【【【sbit buzzer=P1^3; 】】】】】//蜂鸣器,通过三极管9012驱动,端口低电平响

/**************************************************************/

uchar code tab1[]={"20  -  -   "}; //年显示的固定字符
uchar code tab2[]={"  :  :  "};//时间显示的固定字符

//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
{
        uint x,y;
        for(x=xms;x>0;x--)
         for(y=110;y>0;y--);
}

/*****************************就开头这一部分有端口定义****************************************/


【【【【【【【【【【【【【【【【
还有DS18B20_3.h开头一段程序
】】】】】】】】】】】】】】】】


/*****************************就开头这一部分有端口定义****************************************/

sbit DQ = P2^2; //【【【【【【sbit DQ = P3^3;  】】】】】              // 定义DQ引脚为P3.3

/*******************************  延时函数 ********************************
*  功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs
**************************************************************************/
void DS18_delay(int useconds) {
int s;
for (s=0; s<useconds;s++);
}



/*****************************就开头这一部分有端口定义****************************************/

[ 本帖最后由 carlhzy 于 2011-4-21 23:34 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2011-4-21 23:21:14 | 显示全部楼层
zzzzzzzzz.jpg

lcd1602.DSN (95.71 KB, 下载次数: 147)

[ 本帖最后由 carlhzy 于 2011-4-21 23:32 编辑 ]
回复 支持 反对

使用道具 举报

     
发表于 2011-4-21 23:41:24 | 显示全部楼层

回复 33# carlhzy 的帖子

检查DS1302的接线或者程序改为

sbit IO=P2^3;
sbit SCLK=P2^4;
sbit RST=P3^3;
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-4-22 00:11:12 | 显示全部楼层
同意楼上的建议,carlhzy 的仿真图与程序不匹配,低级错误
回复 支持 反对

使用道具 举报

发表于 2011-4-22 10:01:22 | 显示全部楼层

回复 34# 生活的旋律 的帖子

sbit IO=P2^4;//【【【【【【sbit IO=P1^1;】】】】】
sbit SCLK=P2^5;// 【【【【【【sbit SCLK=P1^0;】】】】】
sbit RST=P3^3;//【【【【【【sbit RST=P1^2;】】】】】

以上程序和仿真图没有出入呀        而且我的开发板P2^3是给蜂鸣器用的    哪里来的错误呢
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-4-22 14:45:02 | 显示全部楼层
你看看你的仿真图,是与34楼的定义符合,还是与你的管脚定义符合?分明是34楼说的对么

sbit IO=P2^4;//错的
sbit SCLK=P2^5;// 错的
-----------
sbit IO=P2^3;//与仿真图吻合
sbit SCLK=P2^4;//与仿真图吻合

所谓的仿真图,是参考你帖在33楼的电路图
回复 支持 反对

使用道具 举报

     
发表于 2011-4-22 16:08:13 | 显示全部楼层
做的真好啊!
回复 支持 反对

使用道具 举报

发表于 2011-4-22 18:56:45 | 显示全部楼层
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;


that's an extremely poor programming habit.
回复 支持 反对

使用道具 举报

     
发表于 2011-4-22 21:57:45 | 显示全部楼层

回复 39# millwood 的帖子

为嘛?
回复 支持 反对

使用道具 举报

发表于 2011-4-22 22:31:51 | 显示全部楼层

回复 37# 中国机器 的帖子

原来是我没仔细看引脚数字    P2左右两边数字是不一样的
现在仿真成功了  但是在板上实际字符显示有点差错   正在研究中   谢谢大侠们的指导
左右.jpg

[ 本帖最后由 carlhzy 于 2011-4-22 22:34 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2011-4-22 22:52:32 | 显示全部楼层
这种用电路板法我第一次见过。佩服。
回复 支持 反对

使用道具 举报

发表于 2011-4-22 23:16:50 | 显示全部楼层
为嘛?


at any given point, you don't know if the compiler is using that register for other purposes. so the correct way is to use a variable instead of a special purpose register.

if you have to use a special purpose register like that in your code, you should first push it into the stack, use it and then pop it out of the stack. all of that with interrupt disabled to maintain its atomicity.

[ 本帖最后由 millwood 于 2011-4-22 23:17 编辑 ]
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-4-22 23:46:55 | 显示全部楼层
呵呵,都是小问题,仔细点都好解决
回复 支持 反对

使用道具 举报

发表于 2011-4-26 12:23:00 | 显示全部楼层
中国机器大侠      这个电路好像实际中一断电再开启   时钟数据就得重新设置了    是否可以给他加个备用电源   
如钮扣电池
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-3 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表