ATMEGA16读写24C02 C51程序

发布者:光速思考最新更新时间:2012-08-04 来源: 61ic关键字:ATMEGA16  24C02  C51程序 手机看文章 扫描二维码
随时随地手机看文章

点击浏览下一页
点击浏览下一页
 
完整代码下载地址: http://www.51hei.com/f/2402avr.rar

main函数:
/*
程序功能:ATMEGA16读写24C02
作者:朱波
时间:2012年1月30日
说明:程序运行后会从0开始自动计数到256(对字节操作的结果)
     当复位或者断电时24C02保存断电时的数据,当重新启动后
计数值会从断电时的值开始计数
*/
#include 
#include 
#include"delay.h"  
#include"display.h"
#include"24C02.h"
#define  uchar unsigned char
#define  uint  unsigned int
 
 uint num;//定义变量用于读取24C02中的数值,注意必须为uint型
 
void  main()
{  
     LCD_init();
twi_init();
while(1)
{
    num=IIC_Read(0x00);//从器件中读取(0x00是器件地址)
    num=num+1;//加1
    num=num%1000;//关键语句,没有此句则不工作*/
IIC_Write(num,0x00);//加1后写入器件
    display();
}
}
延时函数delay.c
#include"delay.h"
void delay(unsigned int ms)
{
        unsigned int i,j;
for(i=0;i
#include 
#include"display.h"
#define  uchar unsigned char
#define  uint  unsigned int

uchar table1[]="0123456789";
uchar table2[]="zhubo-24C02";
uchar table3[]="result:";
extern uint num;//主函数中的值
 
void write_com(uchar com)
{
       PORTD&=~BIT(4);
  PORTD&=~BIT(5);
  PORTB=com;
  PORTD|=BIT(6);
  delay(1);
  PORTD&=~BIT(6);
}

void write_dat(uchar dat)
{     
       PORTD|=BIT(4);
  PORTD&=~BIT(5);
  PORTB=dat;
  PORTD|=BIT(6);
  delay(1);
  PORTD&=~BIT(6);
}
void LCD_init()
{ 
   DDRB=0XFF;
 DDRD|=BIT(4)|BIT(5)|BIT(6);
 PORTD&=~BIT(6);
 
 write_com(0X38);
 delay(5);
 write_com(0X01);
 delay(5);
 write_com(0X0C);
 delay(5);
 write_com(0X06);
 delay(5);
 
}
void display()
{
   uint i;
 
write_com(0X80+0);
delay(5);
   for(i=0;i<7;i++)
 {
    write_dat(table3[i]);
delay(5);
 } 
 //这是在1602液晶中显示数值的方法
  write_com(0X80+8);
  delay(5);
  write_dat(table1[num/1000]);
  delay(5);
  write_com(0X80+9);
  delay(5);
  write_dat(table1[num%1000/100]);
  delay(5);
   write_com(0X80+10);
  delay(5);
  write_dat(table1[num%100/10]);
  delay(5);
  write_com(0X80+11);
  delay(5);
  write_dat(table1[num%10]);
  delay(5);
 
 
 write_com(0X80+0X40);//仿真与实际1602有区别
 
 delay(5);
   for(i=0;i<11;i++)
 {
    write_dat(table2[i]);
delay(5);
 }
}
 24C02.c:
#include 
#include 
#include"24C02.h"
#define  uchar unsigned char
#define  uint  unsigned int

//主机模式启动状态码
#define I2C_START                       0x08   //启动总线
#define I2C_RESTART      0x10   //重新启动总线

//主机发送模式状态码
#define I2C_MT_SLA_ACK   0x18   //SLA+W写地址已发送,收到应答位
#define I2C_MT_SLA_NACK  0x20   //SLA+W写地址已发送,收到非应答位
#define I2C_MT_DATA_ACK  0x28   //写入数据已发送,收到应答位
#define I2C_MT_DATA_NACK 0x30   //写入数据已发送,收到应答位
#define I2C_MT_ARB_LOST  0x38   //SLA+W或数据仲裁失败

//主机接收模式状态码
#define I2C_MR_ARB_LOST  0x38   //SLA+R或NOT ACK的仲裁失败
#define I2C_MR_SLA_ACK   0x40   //SLA+R已发送,收到应答位
#define I2C_MR_SLA_NACK  0x48   //SLA+R已发送,收到非应答位
#define I2C_MR_DATA_ACK  0x50   //接收到数据,应答位已返回
#define I2C_MR_DATA_NACK 0x58   //接收到数据,非应答位已返回

//从机接收模式状态码
#define I2C_SR_SLA_ACK    0x60   //自己的SLA+W已经被接收ACK已返回
#define I2C_SR_ARB_LOST_SLA_ACK  0x68   //SLA+R/W作为主机的仲裁失败,自己的SLA+W已经被接收ACK已返回
#define I2C_SR_GCALL_ACK   0x70   //接收到广播地址ACK已返回
#define I2C_SR_ARB_LOST_GCALL_ACK 0x78   //SLA+R/W作为主机的仲裁失败,接收到广播地址ACK已返回
#define I2C_SR_DATA_ACK    0x80   //以前以自己的SLA+W被寻址,数据已经被接收ACK已返回
#define I2C_SR_DATA_NACK   0x88   //以前以自己的SLA+W被寻址,数据已经被接收NOT ACK已返回
#define I2C_SR_GCALL_DATA_ACK  0x90   //以前以广播方式被寻址,数据已经被接收ACK已返回
#define I2C_SR_GCALL_DATA_NACK  0x98   //以前以广播方式被寻址,数据已经被接收NOT ACK已返回
#define I2C_SR_STOP     0xA0   //在以从机工作时接收到STOP或重复START

//从机发送模式状态码
#define I2C_ST_SLA_ACK   0xA8   //自己的SLA+R已经被接收ACK已返回
#define I2C_ST_ARB_LOST_SLA_ACK 0xB0   //SLA+R/W作为主机的仲裁失败,自己的SLA+R已经被接收ACK已返回
#define I2C_ST_DATA_ACK   0xB8   //TWDR里数据已经被发送接收到ACK
#define I2C_ST_DATA_NACK 0xC0   //TWDR里数据已经被发送接收到NOT ACK
#define I2C_ST_LAST_DATA  0xC8   //TWDR的一字节数据已经发送(TWAE='0'),接收到ACK

//其他状态码
#define I2C_NO_INFO   0xF8   //没有相关的状态信息,TWINT='0'
#define I2C_BUS_ERROR  0x00   //由于非法的START或STOP引起的总线错误

//定义SLA中读写控制位极性
#define I2C_READ   1
#define I2C_WRITE  0

#define RD_DEVICE_ADDR                  0XA1   //写的器件地址
#define WD_DEVICE_ADDR                  0XA0   //读的器件地址
//常用TWI操作(主模式写和读)
#define Start() (TWCR=(1<
关键字:ATMEGA16  24C02  C51程序 引用地址:ATMEGA16读写24C02 C51程序

上一篇:带字库型12864液晶的简单使用
下一篇:51单片机普通IO口模拟串行口之查询方式

推荐阅读最新更新时间:2024-03-16 13:04

Atmega16与DS1302数码管显示程序
/*本程序为八位共阴极数码管且有两个573控制的动态扫描,本程序只用数码管显示到秒钟, 其他的要显示请自己编写,能用1602显示更好*/ #include iom16v.h #include macros.h //这里面有BIT(),所以要包含 #define uchar unsigned char #define uint unsigned int //#pragma data:code //注code的功能是把后面的数据存在程序存贮器中,不用code就放到了随机存贮器中. const table ={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x3
[单片机]
C51程序设计规范
现在 单片机 的程序设计,C51已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。 作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果了。因此,为了便于源程序的交流,减少合作开发中的障碍,希望大家能够探讨一下C51的编程规范。把各人认为好的建议提出来,然后做一个总结,作为一种大家一致认同的规范,我认为
[单片机]
avr单片机atmega16自动浇花器Proteus仿真+源程序
单片机源程序如下: #include iom16v.h #include macros.h #define key_bz 0b00000111 #define uchar unsigned char #define uint_16 unsigned short char smg_zx ={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x37};// 全局变量 char smg_wx ={0B00000001,0B00000010,0B00000100,0b00001000}; char smg_oFF ={0x3f,0X71,0X71}; unsigned i
[单片机]
avr单片机<font color='red'>atmega16</font>自动浇花器Proteus仿真+源<font color='red'>程序</font>
AVR单片机Atmega16电子时钟程序+仿真,内部定时器实现
Atmega16电子时钟,内部定时器,有可调闹钟。 仿真原理图如下 单片机源程序如下: #include iom16v.h #include macros.h #define key_bz 0b00000111 char smg_zx ={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f};// 全局变量 char hour=12; char min; char sec; char nz_hour=12; char nz_min=1; char mode=0; char set; void delay_ms(unsigned int k)
[单片机]
AVR单片机<font color='red'>Atmega16</font>电子时钟<font color='red'>程序</font>+仿真,内部定时器实现
基于Atmega16单片机的新型智能空调遥控器
  1 引言   近年来,计算机技术、现代通信技术和自动控制技术高速发展,智能化家居系统也随着新技术的发展进入了千家万户,家居系统中如空调、电视、照明系统等,都使用遥控器进行控制。红外线遥控器由于具有结构简单、体积小、功耗低、功能强、成本低等特点,已成为使用最广泛的一种遥控方式。然而,由于各种红外设备采用的技术标准与协议大不相同,使得各种设备的遥控器并不能兼容,给用户和消费者带来了诸多不便。   目前,市场上已有的万能遥控器多是内置了多种品牌的红外控制指令,对内置品牌以外的红外设备则无能为力。为此,本文设计了一款针对空调设备的智能学习型红外遥控器,采用记录脉冲宽度的方法,成功实现了对多种红外空调遥控信号的学习与再现,真正实现了"万
[电源管理]
基于<font color='red'>Atmega16</font>单片机的新型智能空调遥控器
AVR之简单的ADC程序
最近看了ATmega16的ADC,写下这个简单的程序,了解下ADC的简单控制。 程序用Proteus仿真的,用的是ICCAVR7 的编译器(头文件有所不同,自己掂量) 程序的内容是:通过PA1外部电压的读入并动态的显示在3位数码管上 #include iom16v.h #include AVRdef.h unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9 void display(unsigned char smg); unsigned char temp; void delay_1ms(unsigned int z
[单片机]
3个atmega16之间的(TWI互相通信)+(中断形式仿真)
//1号主机: #include avr/signal.h #include avr/io.h #include util/delay.h #include string.h #define uchar unsigned char #define STATUS (TWSR&0xf8) #define SLA_W 0x32 #define SLA_R 0x33 #define SLAVER_ADDRESS 0x32 #define START 0x08 #define RE_START 0x10 #define MT_SLA_WRITE_ACK 0x18 #define MT_SLA_READ_A
[单片机]
STM32单片机学习笔记(4):24C02(模拟IIC)
项目简介 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第四部分针对EEPROM 24C02的一个实例,IIC通信是一种比较典型的串行通信方式,在很多情况下都会有所使用,了解并熟悉IIC通信就显得十分重要。本项目之所以使用模拟IIC,而没有使用STM32单片机内置的硬件IIC,主要由于Half库里IIC的坑太多了,自己一开始也是想通过HAL库来开发,但是始终不成功,也有可能仿真软件也有些坑,如果有能够做出来的大佬,也欢迎评论区或私聊我交流,不过在实物32单片机开发板上网上好像验证过可用,但是手上暂时缺开发板,
[单片机]
STM32单片机学习笔记(4):<font color='red'>24C02</font>(模拟IIC)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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