定义这样的结构:
typedef struct
{
uchar DC0_ALA:1; //电源0告警
uchar DC1_ALA:1; //电源1告警
uchar AC_ALA:1; //停电告警
uchar UN_H_ALA:1; //同频信道机失锁告警
uchar UN_L_ALA:1; //异频信道机失锁告警
uchar FAR_ALA:1; //远端通讯故障告警
uchar OPEN_ALA:1; //门襟告警
uchar x:1;
}ALARM;//系统告警结构定义
定义变量并初始化:
idata ALARM old_alarm={0,0,0,0,0,0,0,0};
在main()函数中这样应用位域:
if(old_alarm.DC0_ALA!=TDZ_GET.alarm.DC0_ALA||old_alarm.DC1_ALA!=TDZ_GET.alarm.DC1_ALA||old_alarm.AC_ALA!=TDZ_GET.alarm.AC_ALA||old_alarm.UN_H_ALA!=TDZ_GET.alarm.UN_H_ALA||old_alarm.UN_L_ALA!=TDZ_GET.alarm.UN_L_ALA||old_alarm.FAR_ALA!=TDZ_GET.alarm.FAR_ALA||old_alarm.OPEN_ALA!=TDZ_GET.alarm.OPEN_ALA)
{
old_alarm.DC0_ALA=TDZ_GET.alarm.DC0_ALA;
old_alarm.DC1_ALA=TDZ_GET.alarm.DC1_ALA;
old_alarm.AC_ALA=TDZ_GET.alarm.AC_ALA;
old_alarm.UN_H_ALA=TDZ_GET.alarm.UN_H_ALA;
old_alarm.UN_L_ALA=TDZ_GET.alarm.UN_L_ALA;
old_alarm.FAR_ALA=TDZ_GET.alarm.FAR_ALA;
old_alarm.OPEN_ALA=TDZ_GET.alarm.OPEN_ALA;
ala=0;//确定告警条件
}
关键字:C51 位域功能
引用地址:
怎样在C51中使用位域功能?
推荐阅读最新更新时间:2024-03-16 15:21
通过日期算星期的C51源程序
#include reg52.h #define uint unsigned int #define uchar unsigned char uchar code monthday ={31,28,31,30,31,30,31,31,30,31,30,31}; uchar month_n_day(uint y,uchar m) //算出某年某月有多少天 { if(m==2) return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28); else return(monthday ); } //**************
[单片机]
I2C总线规范与I2C器件C51读写程序(一)
1、I2C总线简介: I2C 总线是一双线串行总线,它提供一小型网络系统,为总线上的电路共享公共的总线。总线上的器件有单片机、LCD 驱动器以及上E2PROM 器等等。自从菲利普公司提出I2C总线规范以来,I2C器件得到了广泛的应用。I2C器件的应用大大减少了电路间连线,减小了电路板尺寸,降低了硬件成本,并提高了系统可靠性。 2、I2C规范: I2C总线规范可以参考有关资料,本文仅给出有关硬件操作的基本概念。 2.1、I2C 总线名词解释: 发送器:发送数据到总线上的器件 接收器:从总线上接收数据的器件 主器件:启动数据传送并产生时钟信号的器件 从器件:被主器件寻址的器件 2.2、I2C总线时序定义: 起始位:SCL=1时,在SDA
[单片机]
关于C51与汇编的实用混合编程
最近研究了下51的混合编程,总结一下吧! 1.生成C51的汇编源码 右键单击项目文件,在弹出的opinion for file ....选择上生成SRC文件,这个可以产生汇编源文件,也能允许在C51中嵌入A51,即汇编代码,另外不知为何在项目中若嵌入汇编需添加keil的C51S.LIB,否则下载到单片机后无法正常运行,至于具体原因,现在还不是很明白。 2.查看SRC汇编文件 在项目文件中可以找到SRC文件,可查看所写的C51代码翻译成汇编后的代码,截取部分如图所示,由于编译器在编译C文件时会加入较多的给汇编器的信息,比如会把函数名称加以修改,如图中的 ?PR?_myfun?TEST 等,所以会比较信息杂乱,个人认为,只要
[单片机]
混合式调度器C51源代码
/*============================================================== 1ms时标 混合式调度器(一个抢占式任务,多个合作式任务) 作者:shadow.hu ===============================================================*/ #include reg52.h #define uchar unsigned char #define ushort unsigned short #define SCH_MAX_TASKS 9 #define ERROR_SCH_TOO_MANY_TASKS 9 #define ERR
[单片机]
Keil C51下快速小数运算算法
0 引言 实时控制系统程序设计中,常涉及到小数运算问题.计算机系统中用二进制表示小数的方法有定点数表示法和浮点数表示法.采用浮点数表示法表示的小数范围大、精度高,但程序代码长,运算速度慢.定点数表示的小数范围小、精度低,但程序代码短,运算速度快. 使用C语言设计程序具有程序可读性强,编程方便等优点,但按常规方法设计程序时,实时性不如采用汇编语言设计的程序,这在涉及到小数运算时表现更为突出.这样就限制了C语言的应用.如果采用合适的计算方法,使用C语言编程可以获得与汇编语言编程同样的实时性. 实时控制系统中的前向通道采集的原始数据大多是定点整数,例如前向模拟通道的A/D转换器的转换结果,定时/计数器的计数结果等,都是定点整
[单片机]
C51单片机学习笔记(三)——按键对灯、蜂鸣器等器件的控制
1.独立按键的原理 一般的独立按键有四个脚,无论按键是否被按下,1和2总是相通的,3和4也是相通的。当按键按下时,1、2脚与3、4脚接通,按住不放则保持接通状态 按键通断过程的抖动:当按键按下时(释放时)输出的理想波形是标准的矩形波,但是,由于机械触点的弹性作用,闭合时电路不会马上稳定的接通,这中间会出现一连串的抖动,如图所示,抖动时间一般为5~10ms 按键的消抖:按键的抖动会造成一次按下被误认为多次按下,所以要进行消抖处理,一般分为硬件消抖和软件消抖,这里讨论软件消抖,方法是当单片机检测到按键闭合时,采用延时程序产生5~10ms的延时,等抖动消失后,再判断是否处于闭合状态,同理释放的时候,也要给延时。 按键给单片机
[单片机]
C51单片机————定时器计数器
51单片机定时器/计数器 定时(定时控制、测量、延时。。。)和计数(对外部事件统计数目)。 软件定时|数字电路定时|可编程定时/计数器 它们都是怎么实现的呢? 额! 你猜 。。。 软件定时 机器执行一个程序,这个程序没有其他用处,只是为了延时!以达到定时的目的。 数字电路硬件定时 555之类的器件,完成定时 可编程定时/计数器 硬件定时,但是是可编程的,可以通过软件初始化设置定时的要求。 1.结构 定时/计数器实质上是一个加一计数器,可以工作在两种方式里,实际上都是对脉冲计数,只是说脉冲的来源不一样而已! 1. 定时 1. 加一计数。 2. 脉冲来自振荡器的12分频后的脉冲(Fosc/12),简单的
[单片机]
c51 1ms-6MHZ延时程序
#include reg52.h void delay(unsigned char n) //约n(ms)延时 { unsigned char i,j,k; for(k=0;k n;k++) { for(j=0;j 5;j++) // 约1ms延时 { for(i=0;i 31;i++) //约0.1ms延时 {;} } } } main() { while(1) { delay(15); } } /*约15ms延时 ,需较准确延时: 1、在 keil uvision3\project\options for target\target\
[单片机]