这个基于C51单片机的双路压力监测报警系统是本人所做课程设计,已通过验收,没有bug,功能更完善,所附包含proteus仿真文件,源代码,使用说明,可以做一个不错的参考。
所完成功能为模拟电路输入测量两路压力值,量程范围0~100MPa,带有LED报警功能,可以自行设置上限,压力测量值分时显示。
使用说明:
1.开始仿真,压力上限初始值为99MPa;
2.点击按钮button(要使数码管全部清零),在键盘处输入上限值;
3.上限值修改成功,重新开始显示,显示第一路时左侧带有上限值标识,显示第二路时左侧没有标识;
4.当测量数值超过了所设定上限,二极管闪烁报警;
5.结束仿真。
单片机源程序如下:
- #include<reg51.h>
- #include<absacc.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define a DWORD [0x40]
- #define b DWORD [0x50]
-
- /**************函数声明部分*************/
- void jianpan1(void);
- void jianpan2(void);
- void DelayMS(uint x);
- void int_CHANGE(uint y);
- void Display1(void);
- void Display2(void);
- void beep(void);
- uchar code ledtab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0~9共阴字型码
- uchar data ledbuf[8]={0x6f,0x6f,0x73,0x48,0x00,0x00,0x00,0x00}; //初始显示P=(数据缓冲区)
- sbit OE=P2^0;
- sbit EOC=P2^1;
- sbit ST=P2^2;
- sbit CLK=P2^3;
- sbit LE1=P2^4;
- sbit LE2=P2^5;
- sbit BUTTON=P2^6;
- sbit BEEP=P2^7;
- sbit r4=P1^7;
- uchar Pre_KeyNo,KeyNo; //存储键值
- uchar num1,num2,num; //存储报警上限值
- void main() //主函数
- {
- uint i;
- TMOD=0x02; //方式2,8位自动重装初值定时方式
- TH0=0x14; //计数初值寄存器
- TL0=0x00; //8位计数器
- IE=0x82; //开总中断,并允许T0中断
- TR0=1; //启动计数
- P2=0x4f; //端口初始化
- num1=9; //报警上限值初始化
- num2=9;
- num=100;
- r4=0;
- while(1)
- {
- if(BUTTON==0) //按键按下则进行键扫
- jianpan1();
- r4=0;
- i=0;
- ST=0;ST=1;ST=0; //启动A/D
- while(EOC==0);
- OE=1;
- a=P3*100/255; //电压的实际值
- a=a*10;
- int_CHANGE(a);
- Display1();
- Display2();
- OE=0;
- if(a>=(num*10))
- beep();
- while(i<100)
- {
- Display1();
- Display2();
- i++;
- }
- DelayMS(20);
- r4=1;
- i=0;
- ST=0;ST=1;ST=0; //启动A/D
- while(EOC==0);
- OE=1;
- b=P3*100/255; //电压的实际值
- b=b*10;
- int_CHANGE(b);
- Display1();
- Display2();
- OE=0;
- if(b>=(num*10))
- beep();
- while(i<100)
- {
- Display1();
- Display2();
- i++;
- }
-
- DelayMS(20);
- }
-
- }
- void jianpan1() //键盘输入存储函数
- {
- uchar i=2,j=0;
- P0=0x00;
- while(i)
- {
- P1=0xf0; //准备键扫
- Pre_KeyNo=16,KeyNo=16;
- if(P1!=0xf0)
- jianpan2(); //键盘扫描
- if(Pre_KeyNo!=KeyNo)
- { if(j==1)
- num2=KeyNo;
- if(j==0)
- { num1=KeyNo;
- j=1;
- }
- while(P1!=0xf0)
- P1=0xf0;
- i--;
- }
- DelayMS(100);
- }
- num=10*num1+num2;
- }
- void jianpan2() //键盘扫描函数
- {
- uchar Tmp;
- P1=0x0f;
- DelayMS(1);
- Tmp=P1^0x0f;
- switch(Tmp)
- {
- case 1: KeyNo=0;break; //第一列按下
- case 2: KeyNo=1;break; //第二列按下
- case 4: KeyNo=2;break; //第三列按下
- case 8: KeyNo=3;break; //第四列按下
- default:KeyNo=16;
- }
- P1=0xf0;
- DelayMS(1);
- Tmp=P1>>4^0x0f;
- switch(Tmp)
- {
- case 1: KeyNo+=0;break;
- case 2: KeyNo+=4;break;
- case 4: KeyNo+=8;break;
- case 8: KeyNo+=12;
- }
- }
- void int_CHANGE(uint y)
- {
- if(y==1000) //满量程输入时显示100MPa
- {
- ledbuf[4]=0x06;
- ledbuf[5]=0x3f;
- ledbuf[6]=0xbf;
- ledbuf[7]=0x3f;
- }
- else {
- ledbuf[4]=0x00;
- ledbuf[5]=y/100; //得到十位
- ledbuf[5]=ledtab[ledbuf[5]]; //十位转换为字型码
- ledbuf[7]=y%100;
- ledbuf[6]=ledbuf[7]/10; //得到个位
- ledbuf[6]=ledtab[ledbuf[6]]; //得到十分位字型码
- ledbuf[7]=ledbuf[7]%10; //得到十分位
- ledbuf[7]=ledtab[ledbuf[7]]; //得到个位字型码
- ledbuf[6]=ledbuf[6]|0x80; //个位加固定小数点
-
- /*前导0的不显示处理*/
- if(ledbuf[5]==0x3f) //如果十位为0,则十位的0不显示,显示格式为x.x
- ledbuf[5]=0x00;
- }
- }
- void Display1() //显示函数
- {
- P0=~0x80;
- LE2=1;
- LE2=0;
- P0=ledbuf[7];
- LE1=1;
- LE1=0;
- DelayMS(2);
- P0=0x00;
- LE1=1;
- LE1=0;
- P0=~0x40;
- LE2=1;
- LE2=0;
- P0=ledbuf[6];
- LE1=1;
- LE1=0;
- DelayMS(2);
- P0=0x00;
- LE1=1;
- LE1=0;
- P0=~0x20;
- LE2=1;
- LE2=0;
- P0=ledbuf[5];
- LE1=1;
- LE1=0;
- DelayMS(2);
- P0=0x00;
- LE1=1;
- LE1=0;
- P0=~0x10;
- LE2=1;
- LE2=0;
- P0=ledbuf[4];
- LE1=1;
- LE1=0;
- DelayMS(2);
- P0=0x00;
- LE1=1;
- LE1=0;
- P0=~0x08;
- LE2=1;
- LE2=0;
- P0=ledbuf[3];
- LE1=1;
- LE1=0;
- DelayMS(2);
- P0=0x00;
- LE1=1;
- LE1=0;
- P0=~0x04;
- LE2=1;
- LE2=0;
- P0=ledbuf[2];
- LE1=1;
- LE1=0;
- DelayMS(2);
- P0=0x00;
- LE1=1;
- LE1=0;
- }
- void Display2() //显示上限值
- {
- P0=~0x02;
- LE2=1;
- LE2=0;
- P0=ledtab[num2];
- LE1=1;
- LE1=0;
- DelayMS(5);
- P0=0x00;
- LE1=1;
- LE1=0;
- P0=~0x01;
- LE2=1;
- LE2=0;
- P0=ledtab[num1];
- LE1=1;
- LE1=0;
- DelayMS(5);
- P0=0x00;
- LE1=1;
- LE1=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
双路压力监测报警系统.zip
(35.88 KB, 下载次数: 83)
|