完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是一个刚入门的学生 我在根据一本书做一个i2c总线的小程序 程序编译没有错误 仿真也能实现 但是实际硬件连接后 数码管上电后一直亮 不实现程序 求大神解答
|
|
相关推荐
14个回答
|
|
数码管板子上有带驱动电路 有用AT24C16 E2PROM 按键用万能板连得 数码管是共阴的应该 cpu是at89s52
|
|
|
|
要判断一下单片机是否有跑起来,另外实物电路里,P0口需要接上拉电阻的,程序最好是贴出来,不用附件的方式
|
|
|
|
仿真图可以不接复位电路和晶振以及电源VCC、GND,仿真软件默认它们存在,实际电路这些都不能少,这些是单片机工作的3个基本条件。
|
|
|
|
我估计你是卡在读取24c的地方了,你把程序整个贴出来看看,我想你是想读取24c里边的东西显示出来,但是读取值你能确定吗?
|
|
|
|
一脚复位电路接了没,晶振两边的电容接了没有,还有31脚接电源试试
|
|
|
|
先看你的单片机能否正常工作 然后写个数码管静态程序 如果数码管显示不正常用万用表去测单片机输出脚的电平是否和你预想的一样
|
|
|
|
应该是没有少的 因为用的单片机板子碰巧不是自己焊出来 的 是买的 所以晶振什么的是连好的 但是不排除板子上可能没焊好的情况 |
|
|
|
#include #include ***it SDA=P2^7; ***it SCL=P2^6; #define uint unsigned int #define uchar unsigned char uchar code DIS_CODE[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0x0C}; void delay_ms(uint timer) { uchar j=0; while(timer--) { for(j=124;j>0;j--) {;} } } void delay(void) { _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); } //初始化i2c void init_I2C(void) { SDA=1; delay(); SCL=1; delay(); } //起始信号 SCL高电平期间 SDA一个下降沿表示起始信号 void I2C_start(void) { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } //结束信号 SCL高电平期间 SDA一个上升沿表示结束信号 void I2C_stop(void) { SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); } //应答信号SCL高电平期间 如果SDA被从设备拉低 说明有应答信号 为防止因收不到器件应答信号而发送死循环 加i<250判断 void ack(void) { uchar i=0; SCL=1; delay(); while((SDA==1)&&(i<250)) { i++; } SCL=0; delay(); } //非应答信号 void noack(void) { SDA=1; delay(); SCL=1; delay(); SCL=0; delay(); } //发送一字节 将一个数据按位从高到低发送在SDA数据线上 这里用tmp&0x80判断最高位 void I2C_write_byte(uchar dat) { uchar i,tmp; tmp=dat; for(i=0;i<8;i++) { SCL=0; delay(); if(tmp&0x80) { SDA=1; }else { SDA=0; } tmp=tmp<<1; delay(); SCL=1; delay(); } SCL=0; delay(); SDA=1; delay(); } //读取一字节 uchar I2C_read_byte(void) { uchar i,dat; SCL=0; delay(); SDA=1; delay(); for(i=0;i<8;i++) { SCL=1; delay(); dat=dat<<1; if(SDA) SCL=0; { dat++; } delay(); } return dat; } //按地址写一字节数据 void write_I2C(uchar addr,uchar dat) { I2C_start(); I2C_write_byte(0xa0); ack(); I2C_write_byte(addr); ack(); I2C_write_byte(dat); ack(); I2C_stop(); } //按地址读一字节数据 uchar read_I2C(uchar addr) { uchar tmp; I2C_start(); I2C_write_byte(0xa0); ack(); I2C_write_byte(addr); ack(); I2C_start(); I2C_write_byte(0xa1); ack(); tmp=I2C_read_byte(); noack(); I2C_stop(); return tmp; } ***it LED1=P2^0; ***it LED2=P2^1; #define DAT_ADDR 0x03 uchar g_ucDat; void display(uchar dat) { uchar sep_num; uchar ten_num; sep_num=dat%10; ten_num=dat/10; LED1=0; LED2=1; P0=DIS_CODE[sep_num]; delay_ms(10); LED2=0; LED1=1; P0=DIS_CODE[ten_num]; delay_ms(10); } void int0_init() { EX0=1; IT0=1; EA=1; } //INT0中断函数 void int0_inter() interrupt 0 { g_ucDat++; } void main() { uchar tmp=0; P0=0x00; P2=0x00; g_ucDat=0; int0_init(); init_I2C(); //先判断24c02是否***作过 未初始化是 存储 的都是0xff tmp=read_I2C(DAT_ADDR); if(tmp=0xff) { tmp=0; write_I2C(DAT_ADDR,tmp); delay_ms(10); } g_ucDat=tmp; while(1) { if(tmp!=g_ucDat) { if(g_ucDat>99) { g_ucDat=1; } tmp=g_ucDat; write_I2C(DAT_ADDR,tmp); } display(tmp); } } |
|
|
|
|
|
|
|
上电以后 全部引脚高电平不变 |
|
|
|
而且程序一开始设定了p0和2都是低电平
|
|
|
|
程序中有两处错误,先改正看看。 1. if(SDA) SCL=0; //此句应该在下面括号里,否则下面括号里语句怎么执行??? { dat++; } delay(); 2. tmp=read_I2C(DAT_ADDR); if(tmp=0xff) //这里少一个= |
|
|
|
已改 但是并没有什么变化 |
|
|
|
先屏蔽IIC部分的程序,只调试显示部分的,这部分通了,后面的就好调了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11786 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 13:39 , Processed in 1.094539 second(s), Total 96, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号