C51中遇到一个有关data与xdata的问题,已解决

发布者:变形金刚最新更新时间:2017-08-16 来源: eefocus关键字:C51  data  xdata 手机看文章 扫描二维码
随时随地手机看文章

环境:

我在某个C文件定义了一个结构体变量,然后该变量只是在本文件内被一个函数使用,然后又在中断中调用了该函数,目的是改变一个IO口的输出状态,结果执行时怎么也达不到要的效果。


  1. struct BE  

  2. {  

  3.     unsigned int    CountFR;    //定时器计数值,通过改变计数值改变音频频率  

  4.     unsigned char PWR_time;     //开启时间,单位为10mS  

  5.     unsigned char FREQ_time;    //音频供给时间,单位为10mS  

  6.     unsigned char index;        //音符计数,指示当前需要演奏的音符  

  7. };  


  1. struct BE Beep;  


  1. /******************************************************************************* 

  2. * 函 数 名 :Timer1Int 

  3. * 函数功能 :定时器1中断服务函数, 控制节拍时长 10ms 

  4. * 输    入 :无 

  5. * 输    出 :无 

  6. *******************************************************************************/  

  7. void Timer1Int()    interrupt 3 using 3 //采用中断3 控制频率      

  8. {     

  9.     if(flag == 1)  

  10.     {  

  11.         TH1=(65536-10000)/256;  

  12.         TL1=(65536-10000)%256;  //10ms定时  

  13.     //  BeepControl();   

  14.         Beep_control();   

  15.         return;  

  16.     }  

  17.       

  18.         //--进入一次中断,表明计数到了65536--//  

  19.     Freq=Freq+65536;      

  20.       

  21. }      



现象:

使用示波器查看IO口输出,奇葩的是当断开外设,引脚悬空时(51单片机输出默认是上拉为高的),在复位启动的情况下IO口输出正常,但是在断电启动的情况下,IO口输出异常;当引脚接外设,外设是一个三极管,连基极,如果很快断电重启,输出也为正常,只是偶尔会变形。在异常情况下,IO口输出一直保持低电平,但是另一个IO口输出正常,另一个IO口是在另一个优先级较高的定时器里实现的。模拟仿真时,输出波形也是对的,就是实时运行时不对。


  1. /******************************************************************************* 

  2. * 函 数 名 :Timer0Int 

  3. * 函数功能 :定时器0中断函数 , 每隔TIME_MS ms进入 

  4. * 输    入 :无 

  5. * 输    出 :无 

  6. *******************************************************************************/  

  7. void Timer0Int() interrupt 1 using 1  

  8. {  

  9.     static unsigned int count1s = 0;  

  10.       

  11.     if(flag == 1)  

  12.     {  

  13.             TH0=Beep.CountFR/256;      

  14.             TL0=Beep.CountFR%256;     

  15.             BUZZER_IO = ~BUZZER_IO;   

  16.             return;  

  17.     }  




解决方法:

将该结构体变量添加data修饰就好了,如下:


  1. data struct BE Beep;  

现在还不知道为什么会这样,添加之后,可以看编译结果该变量存储到data区域了,反正后面运行均正常。具体原因,有时间再研究。


关键字:C51  data  xdata 引用地址:C51中遇到一个有关data与xdata的问题,已解决

上一篇:51单片机MAX7219程序
下一篇:keil c51 Compiler变量类型的问题,以及c的部分优化

推荐阅读最新更新时间:2024-03-16 15:35

单片机+8255键盘扫描c51程序
下面是电路图: 51单片机+8255芯片的键盘扫描函数,只做了简单的输入输出,利用P1口控制发光二极管亮,键值为7的话键码是0x07; 源程序: #include reg51.h #include absacc.h #define uchar unsigned char #define uint unsigned int #define LScan XBYTE //列扫描地址 #define HScan XBYTE //行扫描地址 //延时函数 void delay(uint i) {uint j; for(j=i;j 0;j--) { ; } } //检测有无按键按下的函数 uchar CheckKey()
[单片机]
单片机+8255键盘扫描<font color='red'>c51</font>程序
《初学者C51自学笔记》之中断(外部中断0)
概念: CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。 (P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。 低电平有效:P3.2=0时中断; 下降沿有效:从高电平跳变为低电平时中断; 优先级: 中断源: 中断响应条件:1、中断源有中断请求;2、此中断源的中断允许位为1;3、CPU开中断
[单片机]
《初学者<font color='red'>C51</font>自学笔记》之中断(外部中断0)
Keil C51程序调试过程
用MCS-51单片机软件Keil C51编写程序时,经常需要调试,如果不是经常用这个软件的话,很容易忘记这些调试步骤,现在举一个例子 验证延迟函数delay()使其延迟的时间为500ms 供以后复习查考。 源程序写完后,就可以调试了,按照图1所示,先进行第一步和第二步操作,使界面切换到图2的状态,可以看到在文本编辑窗口中,有一个黄色箭头指向13行的位置,说明程序从这个位置开始执行。左上角有一些跟调试相关的按钮,如 全速执行 、 单步进入 ~~~对于我这个例子,目的是验证delay()函数的延迟时间,使其大约为500ms。按照下列方法可以达到我的目的: 图1 编译界面 图2 调试界面 点击 单步跳出 按钮(或功能键F
[单片机]
Keil <font color='red'>C51</font>程序调试过程
C51实现单片机的中文输入法
说明: 拼音输入法杳询函数: unsigned char code * py_ime(unsigned char input_py_val ); input_py_val为已输入的拼音码字符串头指针, 反回值为中文的起始地址,当为0时,杳询失败 应用举例: { unsigned char input_string ={"bang"}; unsigned char chines_string ; sprintf(chines_string,"%s",py_ime(input_string)); } C51程序: //"********************CCDC01采集器测试仪软件:拼音输入法模块****
[应用]
用proteus仿真C51时用到xdata时的问题
在用proteus仿真做一个程序,但是51的内存资源太过稀有,使用到较大的数组的时候资源很快就耗尽了,这时需要用到xdata大模式下编译。 然而在proteus下默认xdata是必须加上外扩ram才可运行的,需要对proteus下的单片机的数据内存位图设置, 直接上图 这样设置之后,单片机上加入大的数组也一样可以欢快的运行
[单片机]
用proteus仿真<font color='red'>C51</font>时用到<font color='red'>xdata</font>时的问题
Keil C51 工程的建立
Keil软件使用的时候,是在软件建立的工程里面,于是建立工程: 开始程序开发的的旅途: 1.打开Keil软件,点击Project---new project 2.在弹出的对话框里选择合适的文件夹,对工程取一个名字--可以使任何名字,当然为了管理你的文档,工程的名字最好和项目有关! 3.完成后点击确定,弹出如下对话框: 4.在上图中的左边框里面选择Atmel--At89C52,选择完后如下: 5.确定后,在弹出的对话框里面选择 否 ,这样以后,一个工程的外壳就建立好了!! 6.添加必须文件,点击file---new,或者直接使用快捷键Ctrl+N,然后点击保存,使其保存在刚才所见工程下面,并且以 **.C 命名 7.向工程
[单片机]
Keil <font color='red'>C51</font> 工程的建立
拆解IoT与IoE,其实他们说的是 Internet of Data──联网皆资料
信息通讯热潮一波波,IoT (Internet of Things,物联网) 在 2009 年~2011 年间随着 RFID 议题有过一波的 hype,如今又有再来一波之势;IoE (Internet of Everything;万物联网) 则是 Cisco 在 2013 年开始,尝试延伸 IoT 的新说法:People、Process、Data、Things 透过综合性的技术,都通通连起来。这真是扩张价值空间到宇宙无敌大的新语。下面就随网络通信小编一起来了解一下相关内容吧。 数据价值,孰大、孰小? 图 1. Internet of Data 才是 Internet of XXX 背后的共同主题 我们可以分三大区块 ──
[网络通信]
C51单片机的外部中断设计1s定时器
51单片机给我们提供了2个计时器中断,分别是计时器0和计时器1,他们对应的优先级分别是1和3,开启计时器并允许其中断后,计时器会从给定的初始值开始,每个指令周期加1,直到加到65535,再加一时计时器溢出,计时器此时会进入中断,并执行中断服务函数。 虽然书上讲的很清楚了,但实际使用还是有些许差别,我自己是这样理解的 65536-50000的由来 假设我使用的单片机的晶振为12MHZ,其机器周期是1us,即每1us产生一次计数 如果设计一个1s的定时器,理论上是需要1*10^6个机器周期,但定时器T0只能对机器周期能进行最大65536次计数,很明显已经超过了,并不能直接采用T0的默认值 转下思维模式,取个65535之内的整数值,
[单片机]
用<font color='red'>C51</font>单片机的外部中断设计1s定时器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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