城市居民楼内一般安装有楼道灯,方便夜间居民上下楼,其工作特点是人来灯亮,人走灯灭。以热释电型楼道灯为例,其基本工作原理是:热释电传感器能检测人体是否进入感应范围,当人体未进入感应范围,即离楼道灯还有一定距离时,传感器输出低电平;当人体进入感应范围,即靠近楼道灯时,传感器输出高电平。根据传感器的输出,单片机可决定是否点亮楼道灯。由于楼道灯属本单元全体居民共用,为便于电费结算,现要求设计一套简易楼道灯电费计价系统,系统能自动计算楼道灯在一个月内的总点亮时间,并据此计算出应缴电费额度。
系统由电源电路、热释电传感器、单片机、按键以及显示器组成,楼道灯供电为220市电,功率2kW(实际灯泡功率一般不会这么大。考虑到实验演示时间有限,故假设此灯泡功率为该值)。其中电源采用5V,热释电传感器的输出采用按键按下与否进行模拟,单片机采用51,显示器采用4位数码管,电价按5.86元/千瓦时(实际电价一般为0.58。考虑到实验演示时间有限,故假设电价为该值),要求电费计算精度精确到0.01元。用户可用按键查询本月楼道灯总点亮时间(精度0.01小时),以及本月总电费。
三. 实验目的
理解、掌握51单片机I/O口高级应用、定时器、中断、继电器、按键及数码管的综合应用
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机程序流程图:
单片机源程序如下:
- #include <reg52.h>
- #define SEG P2
- sbit LED = P0^0;
- sbit K1 = P0^1;
- sbit K2 =P3^2;
- char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- char ando[4]={0,0,0,0};
- int Q=0,i=0,j=0,z=0,n=0;
- char scan,M=0,T=0;
- float k=0;
- void show(int);
- void delay1(unsigned int x)
- {
- unsigned int w,i;
- for(i=0;i<x;i++)
- for(w=0;w<120;w++);
- }
- void main()
- { IE = 0x8b; //T1\T0\INT0 中断允许
- TCON|=0x01; //负边沿触发
- TMOD|=0x01; //T0mode1 有1置1
- TMOD&=0xf1; //有0置0
- TH0=(65635-50000)/256; //设置计数值
- TL0=(65635-50000)%256;
- P0=0xff;
- P2=0xff; //初始化
- while(1)
- {
- if(K1==1)
- { TR0=1;
- LED=0;
- }
- // else
- // {TR0=0;
- // LED=1;
- // }
- if(z==1)
- {j=k*586/60/30;
- show(j);}
- if(z==2)
- { j=k*100/3600;
- show(j);
- }
- if(j==9999) k=0; //若数码管显示达上限,清零重新计算
- }
- }
- void show(int x) //显示函数
- { ando[0]=x/1000;
- ando[1]=x/100%10;
- ando[2]=x%100/10;
- ando[3]=x%10;
- scan=1; //设置扫描初值
- for(i=0;i<4;i++) //扫描四次
- {
- if(i==1) //第二位扫描时数字+小数点
- P2=(TAB[ando[i]])&0x7f;
- else
- P2=TAB[ando[i]];
- P1=scan; //输出扫描信号
- delay1(10);
- P2=0xff; //消隐
- scan<<=1;} //扫描信号左移一位
- }
-
- void timer0(void) interrupt 1
- { TH0=(65635-50000)/256; //重置计数值
- TL0=(65635-50000)%256; //低8位
- if(++Q==20) //定时达1秒
- { Q=0;
- k++;
- n++;
- }
- if(n==36) //定时达36秒
- { n=0;
- TR0=0;
- LED=1;
- }
-
- }
- void my_int0(void) interrupt 0 //外部中断
- { if(++z==4)
- z=1;
- }
复制代码
所有资料51hei提供下载(仿真工程):
单片机设计.7z
(31.99 KB, 下载次数: 22)
|