完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
报名后就一直在做仿真,大部分都仿真结束了,今天下班回家开始焊洞洞板子。
不多说先贴一个24C02的程序和图片吧: /******************************************************************** * 文件名 : EEPROM_24C02.c * 描述 : 该文件实现对24C02的操作。 确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电, 数码管显示的值会从断电钱的那个值开始显示。 * 创建人 : zhengyu209 ***********************************************************************/ #include #include #define uchar unsigned char #define uint unsigned int ***it scl=P1^5; //24c08 SCL ***it sda=P3^6; //24c08 SDA uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar sec; //定义计数值,每过1秒,sec加1 uint write; //写标志位 /******************************************************************** * 名称 : delay1() * 功能 : 短暂延时 * 输入 : x * 输出 : 无 ***********************************************************************/ void delay1(uchar x) { uint i; for(i=0; i } /******************************************************************** * 名称 : flash() * 功能 : 延时,时间为2个NOP,大概为2US * 输入 : 无 * 输出 : 无 ***********************************************************************/ void flash(void) { _nop_(); _nop_(); } /******************************************************************** * 名称 : x24c02_init() * 功能 : 24c02初始化子程序 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void x24c02_init(void) { scl = 1; flash(); sda = 1; flash(); } /******************************************************************** * 名称 : start(void) * 功能 : 启动I2C总线 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void start(void) { sda = 1; flash(); scl = 1; flash(); sda = 0; flash(); scl = 0; flash(); } /******************************************************************** * 名称 : stop() * 功能 : 停止I2C总线 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void stop() { sda = 0; flash(); scl = 1; flash(); sda = 1; flash(); } /******************************************************************** * 名称 : writex() * 功能 : 写一个字节 * 输入 : j(需要写入的值) * 输出 : 无 ***********************************************************************/ void writex(uchar j) { uchar i,temp; temp = j; for(i=0; i<8; i++) { temp = temp << 1; scl = 0; flash(); sda = CY; flash(); scl = 1; flash(); } scl = 0; flash(); sda = 1; flash(); } /******************************************************************** * 名称 : readx() * 功能 : 读一个字节 * 输入 : 无 * 输出 : 读出的值 ***********************************************************************/ uchar readx(void) { uchar i, j, k = 0; scl = 0; flash(); sda = 1; for(i=0; i<8; i++) { flash(); scl = 1; flash(); if(sda == 1) { j = 1; } else j = 0; k = (k << 1) | j; scl = 0; } flash(); return(k); } /******************************************************************** * 名称 : clock() * 功能 : I2C总线时钟 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void clock(void) { uchar i = 0; scl = 1; flash(); while((sda == 1) && (i < 255)) { i++; } scl = 0; flash(); } /******************************************************************** * 名称 : x24c02_read() * 功能 : 从24c02中读出值 * 输入 : address(要在这个地址读取值) * 输出 : 从24c02中读出的值 ***********************************************************************/ uchar x24c02_read(uchar address) { uchar i; start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i = readx(); stop(); delay1(10); return(i); } /******************************************************************** * 名称 : x24c02_write() * 功能 : 想24c02中写入数据 * 输入 : address(地址) , info(值) * 输出 : 无 ***********************************************************************/ void x24c02_write(uchar address, uchar info) { EA = 0; start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); EA = 1; delay1(50); } /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时,延时时间为 1ms * i * 输入 : i(延时1ms的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i) { uchar x, j; for(j=0; j for(x=0; x<=148; x++) ; } /******************************************************************** * 名称 : LED() * 功能 : 显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void LED() //LED显示函数 { P2 = 0x06; P0 = table[sec / 10]; Delay_1ms(5); P2 = 0x07; P0 = table[sec % 10]; Delay_1ms(5); } /******************************************************************** * 名称 : time0() * 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能 * 输入 : del * 输出 : 无 ***********************************************************************/ void time0(void) interrupt 1 using 3 //定时中断服务函数 { static uchar Count = 0; TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值 TL0 = (65536 - 50000) % 256; //重装计数初值 Count++; //每过250ust tcnt加一 if(Count == 20) //计满20次(1秒)时 { Count = 0; //重新再计 sec++; write = 1; //1秒写一次24C08 if(sec == 100) //定时100秒,在从零开始计时 { sec = 0; } } } /******************************************************************** * 名称 : Time0_Init() * 功能 : 定时器0的初始化 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Time0_Init(void) { TMOD = 0x01; //定时器工作在方式1 ET0 = 1; EA = 1; TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值 TL0 = (65536 - 50000) % 256; //使定时器0.05秒中断一次 TR0 = 1; //开始计时 } /******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { P2 = 0x00; x24c02_init(); //初始化24C02 Time0_Init(); sec = x24c02_read(2); //读出保存的数据赋于sec while(1) { LED(); if(write == 1) //判断计时器是否计时一秒 { write =0 ; //清零 x24c02_write(2,sec); //在24c08的地址2中写入数据sec } } } 评分
|
||
相关推荐
5 个讨论
|
||
|
|
|
|
|
|
|
|
|
|
|
|
{:soso_e163:}谢谢~·
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-17 18:01 , Processed in 0.560496 second(s), Total 59, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号