搜索
bottom↓
回复: 12

马老师,请问书中221页的电路中的电阻能用内部上拉电阻代替吗?

[复制链接]

出0入0汤圆

发表于 2008-3-25 22:44:23 | 显示全部楼层 |阅读模式
以下是我稍微修改的程序,但是没得到实验结果

//////实验功能:练习使用外部中断
/////硬件连接:PA口与LED的段码连,LED的是能端直接接地
/////                        独立按键K17\K18与PD2/PD3(INT0/INT1)连,PD2/PD3使能内部上拉
/////实验现象:按K17,显示加一,按K18,显示减一

/////头文件
#include <avr/io.h>
#include <avr/interrupt.h>

/////定义变量
unsigned char counter;
unsigned char led_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

/**************************INT0中断服务函数************************
SIGNAL (SIG_INTERRUPT0)
{
counter++;
if (counter>=10) counter=0;
}

//**************************INT1中断服务函数************************
SIGNAL (INT1_vect)
{
if (counter==0) counter=9;
else counter--;
}





//******************************主函数************************************
int main (void)
{
PORTA=0XFF;                        //LED段码输出
DDRA=0XFF;
PORTD|=0X0C;                //PD2/PD3(INT0/INT1)输入,使能上拉
DDRD&=0XF3;

////初始化INT0/INT1中断
MCUCR|=0X0A;                //INT0/INT1下降沿触发
GICR|=0XC0;                        //使能INT0/INT1中断
GIFR&=0XC0;                        //清除INT0/INT1中断标志位

counter=0;                //计数单元初始化为0
sei();

while (1)
        {
        PORTA=led_7[counter];
        }

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2008-3-26 17:16:27 | 显示全部楼层
实验证明,可以用内部上拉电阻代替,但是222页倒数第8行程序不对,修改后实验就成功了
原:unsigned char counter;
应该为:volatile unsigned char counter;

出0入0汤圆

发表于 2008-3-26 20:05:23 | 显示全部楼层
在CVAVR平台下没问题的.你使用了WINAVR.

出0入0汤圆

 楼主| 发表于 2008-3-26 20:28:30 | 显示全部楼层
哦,原来是这样。谢谢马老师!

出0入0汤圆

发表于 2008-3-26 20:30:14 | 显示全部楼层
楼主:为什么要这样?volatile unsigned char counter;

出0入0汤圆

发表于 2008-3-26 20:38:10 | 显示全部楼层
马老师,你的书我才拿到两天,

出0入0汤圆

 楼主| 发表于 2008-3-26 22:53:10 | 显示全部楼层
因为是这样,一个变量如果在主函数中没有改变,在用WINAVR编译时就会被优化掉。也就是说每次执行主函数是这个变量的值都是第一次的复制版本。因为这个原因,那么在中断中改变这个变量就变得没有效了。加volatile的目的就是告诉编译器不要优化这个变量。这样在中断中改变这个变量的值才会有效。
呵呵,我的理解,马老师,是这样的吗?

出0入0汤圆

发表于 2008-3-27 13:08:11 | 显示全部楼层
好象是的,潭里有关于WINAVR的使用介绍.不过我没用过.

出0入0汤圆

 楼主| 发表于 2008-3-27 16:45:01 | 显示全部楼层
哦,谢谢马老师!
在交流中发现,好像多数人使用的都是CVAVR,是不是CVAVR更加适合初学者呢?

出0入0汤圆

发表于 2008-3-27 17:21:31 | 显示全部楼层
CVAVR有位操作,WINAVR没有!楼主谢谢你的分析,我还没注意看过WINAVR的资料。还有不知道为什么WINAVR主函数必须加int才不会有警告?int main(void)

出0入0汤圆

发表于 2008-3-31 16:30:52 | 显示全部楼层
9楼的,你看了winavr的libc库帮助就知道了.里面介绍的很清楚.安装完winavr就有这个帮助.是pdf格式的.

出0入0汤圆

发表于 2008-4-1 18:22:41 | 显示全部楼层
9楼,是不是因为GCC更标准一些,标准C是不是应该这样啊:
int main(void)
{
   return(0);
}

出0入0汤圆

发表于 2008-4-4 13:30:19 | 显示全部楼层
我个人建议如下:

作为初学者最好从CVAVR入手,因为CVAVR容易上手,也更加贴近芯片硬件.而且CVAVR对于一般的系统和产品开发完全合适.硬件出身的工程师容易掌握.

当你对于AVR本身的功能熟悉后,要设计开发比较复杂的系统,可以考虑使用GCC或IAR.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 14:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表