EDN首页   博客首页

最新日志

发表于:2008-9-30 15:36:54
标签:51单片机  DS18B20  序列号  LCD显示  报警上下限  

0

基于CEPark 51学习板的DS18B20测温+报警的汇编程序

待机状态:
点击开大图

报警上限设置:
点击开大图


报警下限设置:
点击开大图


DS18B20序列号显示:
点击开大图

HEX文件下载:rar

源代码到这里下载

系统分类: 单片机   |    用户分类: 无分类    |    来源: 整理

评论(0) | 阅读(127)
发表于:2008-9-21 9:11:34
标签:温度测试  DS18B20  51单片机  Cepark  

1

DS18B20的几个测试好用的程序

下面几个都是在Cepark51实验板测试可用的,有的还配上了比较模糊的照片为证,需要的兄弟可以看看(放在王老大的地盘上的)

在数码管上显示温度(A版本)

在数码管上显示温度(C版本)


在LCD1602上显示温度(A版本)






系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(200)
发表于:2008-9-18 12:48:23
标签:keil  光标错位  光标显示错位  

1

Keil 里光标错位的解决

新装了keil的8.15版本,发现光标老是显示一个字符的中间位置,一番搜索,找到了Heart朋友的解决方法,与可能碰到此问题的兄弟姐妹共享,Heart朋友原文如下:

很容易,只要修改一下keil安装目录下的tools.ini文件就行

用记事本打开tools.ini后在第三行后增加一行:ANSI=1

如:原内容是

[UV2]
ORGANIZATION="China"
NAME="User", "HeartFly"
EMAIL="dong-heart@163.com"
BOOK0=UV3\RELEASE_NOTES.HTM("uVision Release Notes",GEN)
[C51]

修改后为

[UV2]
ORGANIZATION="China"
NAME="User", "HeartFly"
ANSI=1
EMAIL="dong-heart@163.com"
BOOK0=UV3\RELEASE_NOTES.HTM("uVision Release Notes",GEN)
[C51]

 

 

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(224)
发表于:2008-9-17 10:05:07
标签:STC单片机  Keil嵌入软件  

2

STC单片机keil嵌入软件共享^_^

安装以后的效果^_^

点击看大图

点击这里下载

 

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(3) | 阅读(307)
发表于:2008-8-27 12:47:51
标签:keil  c  移位  乘除  

1

keil c 的乘除与移位问题

看看下面的这个程序

#include "at89x51.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//#define bus P0  //lcd1602 êy?Y×ü??

void main()
{
while(1)
{
  uchar L="0x55";
  uchar M="0xaa";
  uchar H="0x05";
  ulong X;
  X=H*65536+M*256+L;
//  X=(H<<16)|(M<<8)|L;
}
}


本着确认的态度测试了一下keil 的移位代替乘除的效果,其中L,M,H后的数字只是我用来验证结果正误的,理论上说最后两句无论采用那句最终的X值都应该是0005aa55,但实际运行下来结果是不一样的,采用移位的方法的结果是0000aa55,

在华仔兄弟的提醒下,因为我这里的L,M,H都是uchar型,M*256已经溢出,更不用说H*65536了,正确的方法是把M定义位uint型,H定义为ulong型即可

仍以上面的为例进行编译,按照移位计算X值,最终code=118,而直接乘的话code=175,还是挺可观的!

实践是检验“理论”的唯一标准^_^

举手之劳,希望热心的兄弟姐妹帮忙点击宣传一下CEPark电子爱好者家园网站,给咱的宣传积分加点力^_^

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(422)
发表于:2008-8-22 14:24:16
标签:LCD1602  51  4位驱动  

1

LCD1602 4位总线显示问题

这两天想用AT89C2051+LCD1602做点东西,本着节省管脚的原则,想用4位控制,按照LCD1602的手册上说的把在自己的Cepark51实验板(以下简称51实验板)上8位正常的程序的初始化部分和写指令和数据部分改了一下,结果在51实验板无显示,原程序如下:

 

//Cepark51实验板LCD1602显示程序
//日期:2008年8月20日 四位控制
//文件名:lcd1602_c.c
//作者:yanwuxu


#include "at89x51.h"
#define uchar unsigned char
#define uint unsigned int
#define lcd_bus P0  //lcd1602 数据总线
sbit lcd_rs=P1^0; //lcd1602 数据/命令选择端,1数据,0指令
sbit lcd_rw=P1^1; //lcd1602 读写控制端,1读,0写
sbit lcd_en=P1^2; //lcd1602 使能端,高脉冲有效


void Delay1ms(uint mDelay1) //1ms延时
{
 uint mDelay2;
 for(;mDelay1>0;mDelay1--)
 { for(mDelay2=0;mDelay2<114;mDelay2++)
   {;}
 }
}


void lcd_wdata(uchar lcd_data) //lcd1602写数据
{
 lcd_bus=lcd_data;  //先送高4位
 lcd_rs=1;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;
// Delay1ms(1);
 lcd_bus=(lcd_data<<=4); //再送低4位
 lcd_rs=1;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;


}

void lcd_wcmd(uchar lcd_cmd)  //lcd写指令
{
 lcd_bus=lcd_cmd;
 lcd_rs=0;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;
// Delay1ms(1);
 lcd_bus=(lcd_cmd<<=4);
 lcd_rs=0;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;
}

void lcd_disp_byte(uchar x,uchar y,uchar lcd_dat)  //lcd写字符,x横位置1-16,y行,y为1为显示在第一行,其它的为显示在第2行
{
 uchar lcd_address;

 if(y==1)
  lcd_address=0x80+x-1;  //从1-16
 else
  lcd_address=0xc0+x-1;  //从1-16
 
 lcd_wcmd(lcd_address);
 lcd_wdata(lcd_dat);

}

void lcd_disp_str(uchar x,uchar y,uchar code *s)  //lcd写字符串,x横位置1-16,y行,y为1为显示在第一行,其它的为显示在第2行
{
 uchar lcd_address;

 if(y==1)
  lcd_address=0x80+x-1;  //从1-16
 else
  lcd_address=0xc0+x-1;  //从1-16
 lcd_wcmd(lcd_address);

 while(*s>0)
 {
  lcd_wdata(*s);
  s++;    
 };
}


void lcd_init()  //lcd初始化
{
  Delay1ms(15);  //延时15ms
 lcd_wcmd(0x28);    //4位是0x28,8位是0x38
 Delay1ms(15);
 lcd_wcmd(0x28);
 Delay1ms(15);
 lcd_wcmd(0x28);

 lcd_wcmd(0x0c);
 lcd_wcmd(0x06);
 lcd_wcmd(0x01);
}


void main()
{
  lcd_init();
  while(1)
  {
   lcd_disp_byte(3,1,'K');    //测试
   lcd_disp_str(4,2,"123456");  

  }

}

 

后来在网上查阅了别人的一些关于4位驱动的文章,在LCD初始化部分0x28之前再加入0x02这条这条指令(LCD1602的归位指令),编译下载后开机显示正常了,但奇怪的是按复位键后显示不对,显示的现象就像是初始化没好一样,上面一行显示一排黑块,搞了一下午没明白为什么,问了几个兄弟都存在这个情况,很不解,手册里也没提到太多关于4位驱动注意事项...

Delay1ms(15);
 lcd_wcmd(0x02);

这是LCD初始化部分加了02指令后的完整部分:

//Cepark51实验板LCD1602显示程序
//日期:2008年8月20日 四位控制版本
//文件名:lcd1602_c.c
//作者:yanwuxu


#include "at89x51.h"
#define uchar unsigned char
#define uint unsigned int
#define lcd_bus P0  //lcd1602 数据总线
sbit lcd_rs=P1^0; //lcd1602 数据/命令选择端,1数据,0指令
sbit lcd_rw=P1^1; //lcd1602 读写控制端,1读,0写
sbit lcd_en=P1^2; //lcd1602 使能端,高脉冲有效


void Delay1ms(uint mDelay1) //1ms延时
{
 uint mDelay2;
 for(;mDelay1>0;mDelay1--)
 { for(mDelay2=0;mDelay2<114;mDelay2++)
   {;}
 }
}


void lcd_wdata(uchar lcd_data) //lcd1602写数据
{
 lcd_bus=lcd_data;  //先送高4位
 lcd_rs=1;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;
// Delay1ms(1);
 lcd_bus=(lcd_data<<=4); //再送低四位
 lcd_rs=1;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;


}

void lcd_wcmd(uchar lcd_cmd)  //lcd写指令
{
 lcd_bus=lcd_cmd;
 lcd_rs=0;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;
// Delay1ms(1);
 lcd_bus=(lcd_cmd<<=4);
 lcd_rs=0;
 lcd_rw=0;
 lcd_en=0;
 Delay1ms(3);
 lcd_en=1;
}

void lcd_disp_byte(uchar x,uchar y,uchar lcd_dat)  //lcd写字符,x横位置1-16,y行,y为1为显示在第一行,其它的为显示在第2行
{
 uchar lcd_address;

 if(y==1)
  lcd_address=0x80+x-1;  //从1-16
 else
  lcd_address=0xc0+x-1;  //从1-16
 
 lcd_wcmd(lcd_address);
 lcd_wdata(lcd_dat);

}

void lcd_disp_str(uchar x,uchar y,uchar code *s)  //lcd写字符串,x横位置1-16,y行,y为1为显示在第一行,其它的为显示在第2行
{
 uchar lcd_address;

 if(y==1)
  lcd_address=0x80+x-1;  //从1-16
 else
  lcd_address=0xc0+x-1;  //从1-16
 lcd_wcmd(lcd_address);

 while(*s>0)
 {
  lcd_wdata(*s);
  s++;    
 };
}


void lcd_init()  //lcd初始化
{
 Delay1ms(20);
 lcd_wcmd(0x02);

 Delay1ms(15);  //延时15ms
 lcd_wcmd(0x28);    //
 Delay1ms(15);
 lcd_wcmd(0x28);
 Delay1ms(15);
 lcd_wcmd(0x28);

 lcd_wcmd(0x0c);
 lcd_wcmd(0x06);
 lcd_wcmd(0x01);
}


void main()
{
  lcd_init();
  while(1)
  {
   lcd_disp_byte(3,1,'K');    //测试
   lcd_disp_str(4,2,"123456");  

  }

}



举手之劳,希望热心的兄弟姐妹帮忙点击宣传一下CEPark电子爱好者家园网站,给咱的宣传积分加点力^_^

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(174)
总共 , 当前 /