辐射剂量监测仪(一)
config.h
extern void display();??? ?//LED顯示函數
extern void delay(unsigned int i);
extern void read();
extern void displaysj();?? //led顯示刷新時間
extern void readsj();???? //讀刷新時間
extern void speak(void);? //蜂鳴器響
typedef unsigned long Ulong;
extern float jishu;?????????????? //四字節
extern float jishulv;
extern unsigned int timer_1;??? //刷新時間的初值
extern unsigned int t0num;??? //用來記錄TO計數溢出次數
extern unsigned int shu[6];?? //6位數
extern unsigned int shu1[2];
extern unsigned int panduan;??? //一個判斷值
extern unsigned int panduan1;
extern unsigned int tm,tt;
extern unsigned int uu;
extern unsigned int biaozhi;//用于判斷是顯示刷新時間還是啟動計數,為0表示顯示刷新時間,為1表示開始計數,顯示計數
extern unsigned int bz;?????????? //外中斷0中斷產生標志
extern unsigned char code dispcode[];? //字符碼顯示,共陽極
extern unsigned char code dispcode1[];?? //帶小數點的字符碼顯示
extern unsigned char dispbitcode[]; ???? //P2口作為選通口的值 Y0-Y5
main.c
#include "reg52.h"
#include "intrins.h"
#include "config.h"
unsigned int tm,tt;
unsigned int t0num=0;??? //用來記錄TO計數溢出次數
unsigned int biaozhi=0;//用于判斷是顯示刷新時間還是啟動計數,為0表示顯示刷新時間,為1表示開始計數,顯示計數
unsigned int bz;?????????? //外中斷0中斷產生標志
unsigned int uu=0;
unsigned int shu[6]={0,0,0,0,0,0};?? //6位數
unsigned int shu1[2]={0,0};
unsigned int panduan=0;??? //一個判斷值
unsigned int panduan1=0;
float jishu;?????????????? //四字節
float jishulv;
unsigned int timer_1=5;??? //刷新時間的初值
sbit P12=P1^2;
sbit P13=P1^3;
unsigned int ii=0;
void main(void)
{
?tm=tt=1000;?? //初值為5S,由于中斷一次是5MS,所以要循環中斷1000次
?TMOD=0x15;??? //定時器0采用計數(C/T=1),方式1;定時器1采用定時,方式1
?SP=0x60;?? //設置堆棧的初始地址
?TH0=0x00;????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ;
?TL0=0x00;?? //定時器0初始化
?TH1=0xee;
?TL1=0x00;???? //定時器1初始化? 定時5ms
TCON
?IT0=1;??? //設置外部中斷0為下降沿觸發
IE????????????????????????????????????????????????????????????????????????????????????
?IP=0x0d;
?EA=1;??? //開總允許位
?EX0=1;??? //外部中斷0允許位
?ET0=1;??? //定時器0中斷允許位
?ET1=1;??????? //定時器1中斷允許位
?ET2=1;??????? //定時器2中斷允許位
?P3=0x3c;?? //設置P3的第二功能?
??
?readsj();????? //按一次就更新一次數據???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?while(1)??? //等待中斷產生
?{
?? if(biaozhi==0)?? //顯示刷新時間
?? {??
?????? TR0=TR1=0;
??? t0num=TH0=TL0=0;
??? TH1=0xee;?? //ec,78
??? TL1=0x00;
?????? if(bz==1)???? //外中斷0產生了
??? {
?????????? readsj();????? //按一次就更新一次數據
???? }
???? displaysj();
//???? P0=dispcode[10];
???? panduan1=0;
?? }
?? if(biaozhi==1)??? //計數
?? {?
??? ?? TR0=1;?? //啟動定時器0(TR0)
??? TR1=1;???????? //啟動定時器1
??? if(uu==1)????? //設置的刷新時間到了
??? {??????? ?
??????? read();
???? uu=0;
???? t0num=0;
???? TH0=0x00;
???? TL0=0x00;
???? TH1=0xee;
???? TL1=0x00;
???? }
???? display();
//???? P0=dispcode[10];
???? panduan=0;
??? }
?}?
}
key.c
#include "reg52.h"
#include "intrins.h"
#include "config.h"
sbit P12=P1^2;
sbit P13=P1^3;
?
void int0_int(void) interrupt 0 using 1?? //外部中斷0
{?
??? delay(2);??????????? //延時10MS?,消抖
??? if(P13==0)
?{
???? biaozhi=0;
???? timer_1+=5;
??if(timer_1>30)??? //5,15,20,25,30
??{
???? timer_1=5;???? //刷新時間為0-60S,每次間隔10S
??}
??tm=timer_1*200;?? //為了轉化為秒
??tt=tm;
??bz=1;???? //表明外中斷0產生了
??t0num=0;
??TH0=0x00;
??TL0=0x00;
?}
?if(P12==0)
?{
???? t0num=0;
??TH0=0x00;????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ;
??TL0=0x00;?? //定時器0初始化
???? bz=0;
???? biaozhi=1;??? //表明外中斷1產生了
?}
?delay(2);??????????? //延時10MS?,消抖
}
speak.c
#include "reg52.h"
#include "intrins.h"
#include "config.h"
sbit P17=P1^7;
void speak(void)
{
?unsigned char voice;
?unsigned int delay;
?for(voice=0;voice<2;voice++)
?{
??for(delay=0;delay<10000;delay++)
??P17=0;
??for(delay=0;delay<6000;delay++)
??P17=1;
?}
}
time0-int.c
void timer0_int(void) interrupt 1 using 0 //定時器0中斷
{
??? t0num+=1;
?TH0=0x00;????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ;
?TL0=0x00;?
}
time1-int.c
void timer1_int(void) interrupt 3 using 2? //定時器1中斷 中斷一次5MS
{
??? TH1=0xee;
?TL1=0x00;???? //定時器1初始化
?tt--;
?if(tt==0)
?{
??? tt=tm;???? //重新賦值?
?????? uu=1;?? //返回顯示的標志值
?}
}
valuedisplay.c
//計數 數據顯示/
#include "reg52.h"
#include "intrins.h"
#include "config.h"
unsigned char code dispcode[]={0x3F,0x06,0x5B,0x4F,
?????????????????????????????? 0x66,0x6D,0x7D,0x07,
?????????????????????????????? 0x7F,0x6F,0x00};? //字符碼顯示,共陰極
unsigned char code dispcode1[]={0xBF,0x86,0xDB,0xCF,0xE6,
??????????????????????????????? 0xED,0xFD,0x87,0xFF,0xEF};?? //帶小數點的字符碼顯示
unsigned char dispbitcode[]={0xDF,0xEF,0xF7,0xFB,
???????????????????????????? 0xFD,0xFE};?????
????????????????????????????? ???? //P2口作為選通口的值 Y0-Y5?
void read()?????
{
??? int i=0;
??? int w=10;
??? long zhengshu=0;
?jishu=t0num*65536+TH0*256+TL0;? //脈沖個數?
?jishulv=jishu/timer_1;????????? //將計數轉換為計數率
?if(jishulv>=2000)????????????? //超過這個值,蜂鳴器就響
?{
??? speak();????????????????????? //條件滿足,蜂鳴器響
?}
?else
?{
???? jishulv=jishulv*10;
??zhengshu=jishulv;?
??for(i=0;i<=5;i++)
??{
???? ?shu[i]=zhengshu%w;????? //shu[5]-shu[0]有效位,其中shu[0]實際上是小數位
???zhengshu/=w;
??}
?}
??? //取小數點右邊一位,這樣,shu[5]...shu[1]shu[0]各數就計算出來了,下面需要對數進行處理
}
????
void display()
{
??? int p=0;
?int k=0;
?for(k=6;k>0;k--)?????? //從高位開始掃描
?{
???? if(panduan==0)???? //證明高位還沒出現非零值
??{?????
???if(shu[k-1]==0)???? //如果高位等于0
???{?
?????? if(k==2)
????{
????????? P0=dispcode1[0];?//是小數點位則正常顯示
???? }
???? else if(k==1)
???? {
?????? P0=dispcode[0];
???? }
???? else
????{
?????? ?P0=dispcode[10];? //則置空
???? }??
???}
???else
???{
?????? panduan=1;????? //判斷值置1
????if(k==2)
????{
???????? P0=dispcode1[shu[k-1]];
????}
????else
????{
???????? P0=dispcode[shu[k-1]];
???? }
???}
??}
??else if(panduan==1)???? //證明高位已經有非零值
??{???????
???? if(k==2)
???{
??????? P0=dispcode1[shu[k-1]];
???}
???else
???{
??????? P0=dispcode[shu[k-1]];
??? }
??}
??P2=dispbitcode[k-1];? //選通
??for(p=600;p>=0;p--);
??P2=0xFF;????????????? //都不選通,先送段碼,再送位選通碼,再在每次顯示
?}??????? //之后將所有的位都不選通,這樣可以消掉拖影
}
delay5ms.c
void delay(unsigned int i)
{
??? TR2=1;??????? //啟動定時器2
??? while(i!=0)
?{?
??TH2=0xee;?? //定時器2計數初值? 定時5MS
??TL2=0x00;
??RCAP2H=0x4c;
??RCAP2L=0x00;
??while(TF2!=1);
??TF2=0;
??i--;
?}
?TR2=0;??????? //停止定時器2
}
refreshtime.c
/讀刷新時間/
void readsj()
{
?shu1[1]=timer_1/10;
?shu1[0]=timer_1%10;
}
//刷新時間顯示//
void displaysj()
{
??? int d=0;
?int m=0;
?for(m=2;m>0;m--)????????? //從高位開始掃描
?{??
???? if(panduan1==0)?????? //證明高位還沒出現非零值
??{?????
???if(shu1[m-1]==0)???? //如果高位等于0
???{?
?????? P0=dispcode[10];? //則置空???
???}
???else
???{
?????? panduan1=1;????? //判斷值置1
????P0=dispcode[shu1[m-1]];
???}
??}
??else if(panduan1==1)???? //證明高位已經有非零值
??{???????
???P0=dispcode[shu1[m-1]];
??}
??P2=dispbitcode[m-1];? //選通
??for(d=600;d>=0;d--);
??????? P2=0xFF;? //都不選通?
?}
}
?
總結
以上是生活随笔為你收集整理的辐射剂量监测仪(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ1057: [ZJOI2007]
- 下一篇: Ringly智能戒指:能在手机收到消息时