“光照报警器”案例程序设计说明
1 工程文件下载:
2 程序设计流程图

3 相关寄存器设置
1) P0(8位)、P2.3和P3.4需要设置成推挽输出,以驱动电路正常发光。按键作为输入,不需推挽,涉及寄存器及配置值如下:
P0M1=0x00;
P0M0=0xff;
P2M1=0x00;
P2M0=0x08;
P3M1=0x00;
P3M0=0x10;
2) 对于光照通过AD采集,涉及寄存器及配置如下:
P1ASF=0xff;
ADC_RES=0;
ADC_RESL=0; //AD转换结果寄存器清0
ADC_CONTR=0X8C; //10001100,后三位决定P1^4作为A/D输入
CLK_DIV=0X20;
3) 采用定时器1,在定时器中断中进行AD的初始化,涉及寄存器(含可位寻址)及配置如下:
TMOD=0x10;
IE=0xa8;
TH1=(65535-100)/256;
TL1=(65535-100)%256;
TR1=1; //启动定时器
4 程序设计框架
4.1 void main()
(1)设置P0为推挽模式,设置P2^3为推挽模式,设置P3^4为推挽模式其它为准双向口模式
(2)开定时器中断和AD中断
(3)循环调用SEG_Display()方法显示检测值。
4.2 void SEG_Display()
(1) 5、6、7号数码管分别用于显示当下值。
(2) 0、1、2号数码管显示警报值。
4.3 void weixuan(char i)
将数码管i信息对应到位选引脚SEL0、SEL1、SEL2上。
4.4 void Delay(int n)
延时
4.5 void InitADC_light()
初始化光照AD转换结果寄存器及控制寄存器
4.6 void adc_isr() interrupt 5 using 1
AD中断处理程序:
(1) 每中断AD一次,计数器time加1;
(2) 屏蔽所有中断;
IE=0x00;//00000000,屏蔽所有的中断申请
(3) 如果中断次数达到2500次,求光AD平均值。
(4) 重新开放AD中断和定时中断。
ADC_CONTR&=~0X10;//ADC_FLAG=0,数模转换结束标志被程序清为0
ADC_CONTR|=0X08; //ADC_START=1,模数转换启动,结束后自动为0
4.7 void Timer1_Routine() interrupt 3
定时器1中断处理程序:
(1)比较实际光照值与警报值的关系,决定beep是否进行取反。
(2)利用统计的思想检测按键key1是否按下,如果按下,则改变标志位,程序由原来的警报下限模式改为警报上限模式。
5 interrupt 和using
interrupt 和using 都是 C51 的关键字。C51 中断过程通过使用interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下:
IE寄存器 C51中的 8051的使能位中断号中断源
--------------------------------
IE.0 0 外部中断0
IE.1 1 定时器0 溢出
IE.2 2 外部中断1
IE.3 3 定时器1 溢出
IE.4 4 串口中断
IE.5 5 定时器2 溢出
有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051标准中断从 0 到 4 和在 8051系列(增强型)中多达 27 个中断源。

