单片机I2C通信及LCD1602显示C程序

发布者:fnfeecjknquc最新更新时间:2015-04-29 来源: 51hei关键字:单片机  I2C通信  LCD1602显示 手机看文章 扫描二维码
随时随地手机看文章
本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c52;找到数码管的原理图即可.这是一整个单片机开发板的电路图其他的忽略.本程序keil工程文件下载: http://www.51hei.com/f/1602iic.rar

/*
*功能: 利用iic发送数据,在数码管上显示,并通过串口发生到上位机,
* 且在lcd1602上显示"Han Zhu Ying Xue"
* "1754410821@qq.com";
*作者: 徐冉
*日期: 2013-05-29-22:21 2013-5-2919:15 - 22:17
*备注: 程序已经顺利通过调试,耗时3小时。
*/
/*********51hei开发板***********/
/********AT89C52-RC MCU***********/
#include
#define write_add 0xa0
#define read_add  0xa1
typedef unsigned int uint;
typedef unsigned char uchar;
sbit wela = P2^7;
sbit dula = P2^6;
//i2c
sbit SCL = P2^1;
sbit SDA = P2^0;
//LCD1602
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P2^5;
sbit BUSY = P0^7;
uchar num, flag;
uchar code string_1[] = "Han Zhu Ying Xue";
uchar code string_2[] = "1754410821@qq.com";
uchar code table[] = {


                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F  //"9"
     };


/********************************************************************/
/**********************LCD1602底层驱动程序***************************/
/********************************************************************/
//delay: 延时xms
void delay(uint xms)
{
 uchar i, j;
 for(i = 0; i < xms; i++)
  for(j = 0; j < 110; j++);
}
//wait: 判忙等待
void wait()
{
 P0 = 0xff;
 do
 {
  RS = 0;
  RW = 1;
  EN = 0;
  EN = 1;
 }while(BUSY == 1);
 EN = 0;
}
//write:cmd 写入命令
void write_cmd(uchar cmd)
{
 RS = 0;
 RW = 0;
 EN = 0;
 P0 = cmd;
 EN = 1;
 EN = 0; 
}
//write:data  写入数据
void write_data(uchar datas)
{
 RS = 1;
 RW = 0;
 EN = 0;
 P0 = datas;
 EN = 1;
 EN = 0;
}
//send:string 发送一串字符
void send_string(uchar* str)
{
 while(*str != '')
 {
  write_data(*str++);
 }
}
//lcd1602:init LCD1602 显示初始化
void lcd_init()
{
 delay(15);
 write_cmd(0x38);
 delay(5);
 write_cmd(0x38);
 delay(5);
 write_cmd(0x38);
 wait();
 write_cmd(0x38); //设置16 * 2,5 * 7点阵
 wait();
 write_cmd(0x08);
 wait();
 write_cmd(0x01);//清屏
 wait();
 write_cmd(0x06);
 wait();
 write_cmd(0x0c); //开显示
}[page]
/********************************************************************/
/*******************I2C模拟通信及AT24C02底层驱动程序****************/
/********************************************************************/
//AT24C02
//delayus: 延时约5us
void delayus()
{
 ;;
}
//i2c:init I2C总线初始化
void i2c_init()
{
 SCL = 1;
 delayus();
 SDA = 1;
 delayus(); 
}
//lcd:start  起始信号
void start()
{
 SCL = 1;
 SDA = 1;
 delayus();
 SDA = 0;
 delayus();
}
//i2c:stop 停止信号
void stop()
{
 SCL = 1;
 SDA = 0;
 delayus();
 SDA = 1;
 delayus(); 
}
//i2c:ack 从机应答信号
void ack()
{
 uchar i = 0;
 //在SCL = 1时,读取SDA的数据判忙
 SCL = 1;
 delayus();
 while((SDA == 1)&& i < 250)
 i++;
 //判忙之后,等待发送数据/命令
 SCL = 0;
 delayus();
}
//nack: 主机非应答信号
void nack()
{
 //主机发送非应答信号1
 SCL = 1;
 delayus();
 SDA = 1;
 delayus();
 //等待发送数据/命令
 SCL = 0;
 delayus();
}
//write:byte 写一个字节数据
void write_byte(uchar date)
{ //从最高位发送
 uchar i, temp;
 temp = date;
 for(i = 0; i < 8; i++)
 {
  temp <<= 1;
  SCL = 0;
  delayus();
  SDA = CY;
  delayus();
  SCL = 1;
  delayus();
  SCL = 0;
  delayus();
 }
 //等待从机应答
 SCL = 0;
 delayus();
 SDA = 1;//置1,等待从机应答0
 delayus();
}
//read:byte  读一个字节数据
uchar read_byte()
{
 uchar i, j, k;
 SCL = 0;
 delayus();
 for(i =  0; i < 8; i++)
 {
  SCL = 1;
  delayus();
  j = SDA;
  k = (k << 1) | j;
  delayus();
  SCL = 0;
  delayus();
 }
 delayus();
 return (k);
}
//write:AT24C02  写AT24C02
void write_c02(uchar address, uchar date)
{
 start();
 write_byte(write_add);
 ack();
 write_byte(address);
 ack();
 write_byte(date);
 ack();
 stop();
 delay(12); 
}
//read:AT24C02 读AT24C02
uchar read_c02(uchar add)
{
 uchar date = 0;
 start();
 write_byte(write_add);
 ack();
 write_byte(add);
 ack();
 start();
 write_byte(read_add);
 ack();
 date = read_byte();
 nack();
 return (date);
}
//display: 数码管显示程序
void display(uchar num)
{
 uchar bai, shi, ge;
 bai = num / 100 % 10;
 shi = num / 10 % 10;
 ge = num % 10;


 dula = 1;
 P0 = table[bai];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = 0xfe;
 wela = 0;
 P0 = 0x00;
 delay(1);


 dula = 1;
 P0 = table[shi];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = 0xfd;
 wela = 0;
 P0 = 0x00;
 delay(1);


 dula = 1;
 P0 = table[ge];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = 0xfb;
 wela = 0;
 P0 = 0x00;
 delay(1);
}
/********************************************************************/
/*************************UART串口通信******************************/
/********************************************************************/
//uart:init UART初始化
void uart_init()
{
 TMOD = 0x20;
 TH1 = 0xFD; //9600bps/s
 TL1 = 0xFD;
 TR1 = 1;
 SM0 = 0;
 SM1 = 1;
 REN = 1;
 EA = 1;
 ES = 1;

//main: 主程序
void main(void)
{
 i2c_init();
    lcd_init();
 uart_init();
 //LCD1602
 write_cmd(0x80);
 send_string(string_1);
 write_cmd(0x80 + 0x40);
 send_string(string_2);
 //AT24C02
 write_c02(0x0a, 0xaa);
 num = read_c02(0x0a);
 while(1)
 {
  display(num);
  if(flag == 1)
  {
   ES = 0;
   SBUF = num;
   while(!TI);
   TI = 0; 
   flag = 0;
   ES = 1;
  }
 }
}
//UART:INT 串口中断程序
void uart_int() interrupt 4
{
 RI = 0;
 num = SBUF;
 flag = 1;
}

关键字:单片机  I2C通信  LCD1602显示 引用地址:单片机I2C通信及LCD1602显示C程序

上一篇:单片机驱动矩阵按键与独立按键源代码
下一篇:51单片机读写AT24C02源代码(详细注释)

推荐阅读最新更新时间:2024-03-16 14:00

基于AT89C2051单片机实现超声波倒车雷达系统的设计
倒车雷达(Car Reversing Aid Systems)的全称是“倒车防撞雷达”,也称“泊车辅助装置”,是汽车泊车安全辅助装置,能以声音或者更为直观的显示告知驾驶员周围障碍物的情况,解除了驾驶员泊车和起动车辆时前后左右探视所引起的困扰,并帮助驾驶员扫除了视野死角和视线模糊的缺陷,提高了安全性。 系统工作原理 倒车雷达只需要在汽车倒车时工作,为驾驶员提供汽车后方的信息。由于倒车时汽车的行驶速度较慢,和声速相比可以认为汽车是静止的,因此在系统中可以忽略多普勒效应的影响。在许多测距方法中,脉冲测距法只需要测量超声波在测量点与目标间的往返时间,实现简单,因此本系统采用了这种方法。 如图1所示,驾驶员将手柄转到倒车档后,系统自
[单片机]
基于AT89C2051<font color='red'>单片机</font>实现超声波倒车雷达系统的设计
单片机在多气体检测系统中的应用设计
  采用气体传感器阵列采集气体信息,通过以AT89C51 和ADC0809 组成的核心单元进行数据采集和数据处理,以LED 显示器显示结果,实现了对多种气体的识别和检测。   气体传感器是一种能将气体种类及其与浓度有关的信息转换成电气信号的装置。根据这些电气信号的强弱就可以获得与待测气体在环境中存在情况有关的信息,从而可以进行检测、监控、报警。因此由气体传感器与模式识别系统构成的智能化气味识别仪器有着广泛的应用领域,如食品工业、化学工业、环境监测、医学诊断、安全检查等,越来越受到广泛关注。   传统的气体检测大多采用单气体检测方式, 即每测量一种气体需要一种测量仪表。用一种仪器能够进行多种气体的检测和识别是气体检测仪的发展趋势
[单片机]
<font color='red'>单片机</font>在多气体检测系统中的应用设计
基于单片机的低功耗投影仪的RGB LED驱动器设计
引言 本应用笔记提供了一个低功耗投影仪RGB LED驱动器的参考设计。基于单芯片MAX16821构建大电流LED驱动器,能够为一组降压驱动的RGB LED提供高达10A的电流,通/断时间小于1µs。某一时刻只驱动一个彩色LED,RGB按比例共用PWM周期。 LED驱动器技术指标 输入电源电压:10V至15V LED驱动电流:10A LED正向偏压:4.5V至6V LED电流上升/下降时间: 1µs LED电流纹波:10%峰峰值,最大值 输入 VIN (J4):电源输入 PWMR、PWMB、PWMG (J8的引脚1、3和4):RGB PWM输入信号,幅值应为3.3V至5V。当输出的上升/下降时间保持在1µs以内时,任何超出2µs的P
[单片机]
基于<font color='red'>单片机</font>的低功耗投影仪的RGB LED驱动器设计
MSP430单片机实现秒表,使用proteus8.7仿真
程序中用到两个时钟。 MCLK设置为8MHZ 定时器A0时钟选择SMCLK,32768HZ,可在proteus中设置 功能描述: 数码管显示秒、分。在显示过程中如果按下按键,则触发中断,停止计数, 再按一次,秒表继续计数。 开发中遇到的问题:在同时显示两个以上数码管时,由于P2端口的数据没有全部置位(共阳极数码管), 导致显示不完整,相同部分缺失。 解决办法,在扫描显示切换时,增加中间过渡数据如下 void display(int sec, int min){ //数码管显示数字缓存 uchar buf = {0, 0, 0, 0}; buf = sec%10; buf = sec/10%10; b
[单片机]
MSP430<font color='red'>单片机</font>实现秒表,使用proteus8.7仿真
单总线AT89C51单片机多机通讯系统设计
提出了用单总线完成单片机通讯的方法。结合系统既传输数字信号又传输模拟信号的特点,提出用消侧音电路解决模拟信号的方案,并给出了详细的技术解决方案。 传统的多机通讯系统一般需要四条线完成: 1.电源线;2.地线;3.发送信号线;4.接收信号线。然而,对于主机和分机距离较远、分机台数较多的系统,采用四线制的经费投入较大,安装起来也颇困难。基于这一问题,本文结合为某医院研制的既有模拟信号(语音)又有数字信号的传输呼叫系统,提出用单总线实现多机通讯,并给出了一个完整的技术方案。 1 单总线制多机通讯系统的总线设计方案 本设计实现的多机呼叫系统的主要功能是:分机呼叫主机,利用单片微机向主机发送数字呼叫信息,主机响应后,显示出呼叫
[单片机]
单片机对modem要进行哪些初始化操
一般单片机的MODEM通讯必须要有两个背景知识,一个是AT命令集,另一个是通用非同步接收发送器(UART)。  AT命令集 下面介绍我通讯程式例子中涉及到的AT命令。 Dn:拨号命令。该命令使MODEM立即进入摘机状态,并拨出跟在后面的号码。D命令是基本的拨号命令,它受到其他命令的修饰可构成MODEM何时拨号以及如何拨号等操作。 T:音频拨号。例如,ATDT13632757314,其中13632757314为电话号码。 P:脉冲拨号。例如,ATDT13632757314,其中13632757314为电话号码。 ,:标准暂停。我们常常碰到拨打外线电话时需要暂停一下,等听到二次拨号音(外线)之后才能再拨后续的号码。缺省时暂
[单片机]
世强物联网技术研讨会助力多重创新应用落地
2015年年底,中国本土电子元器件分销商 世强 宣布,其“智能物联创新技术及应用巡回研讨会”深圳站完美收官并取得超预期效果。本次世强研讨会行程以青岛为起点,深圳、北京站紧随其后巡展,全面展示有关物联网的核心技术,涉及到的细分应用领域包括智能可穿戴、 智能家居 、智能监控、智慧医疗、移动支付以及车联网,产品涵盖了动态心率检测 传感器 、全球首款UV(紫外线)传感器、手势传感器、Touch IC、低功耗 MCU 、自组网 ZigBee 、通讯远距离Bluetooth等。 根据IDC的预测,亚太区物联网产业未来几年持续保持强劲增长,截止到2020年,连网设备将增加至86亿台,而市场规模则达到5,830亿元。世强物联网技术论坛旨在帮助参会
[嵌入式]
基于51单片机的锅炉水位温度压力检测系统仿真设计
仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0056 1.主要功能: 基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用) 1.系统实时通过LCD1602显示水位检测值,锅炉炉膛温度值,锅炉内部压力值。 2、可对锅炉的水位上下限、炉膛温度上下限、压力上下限进行设置,第一行显示上限值,第二行显示下限值。 3、如果水位、温度、压力过限则蜂鸣器报警,通过LED指示报警类型。 4、默认水位下限值10cm,上限值40cm,压力下限值30kPa,压力上限值50kPa,温度下限值5℃,温度上限值105℃。 5、温
[单片机]
基于51<font color='red'>单片机</font>的锅炉水位温度压力检测系统仿真设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved