標(biāo)題:
核輻射檢測(cè)儀程序(蓋格計(jì)數(shù)器)及效果圖
[打印本頁(yè)]
作者:
51黑ss
時(shí)間:
2016-3-30 22:50
標(biāo)題:
核輻射檢測(cè)儀程序(蓋格計(jì)數(shù)器)及效果圖
這是我自己想的一種方法,利用蓋格計(jì)數(shù)器來(lái)技術(shù)每秒射線次數(shù)來(lái)檢測(cè)輻射強(qiáng)度。
本系列文章:
蓋格劑檢測(cè)核輻射:
http://www.torrancerestoration.com/bbs/dpj-47401-1.html
蓋格管檢測(cè)電路:
http://www.torrancerestoration.com/bbs/dpj-47429-1.html
//main.c
#include"config.h"
#include"5110.h"
#include"h1838.h"
#include"iic.h"
#include"ta.h"
int main( void )
{
extern_16m();
h1838_init();
LCD5110_init();
LCD_init();
DS1302_Reset();
LCD_clear();
init_TA();
__bis_SR_register(GIE);
while(1)
{
Red_Code();
}
}
//5110.h
#define res1 P1OUT|=BIT0; //復(fù)位,0復(fù)位
#define res0 P1OUT&=~BIT0;
#define sce1 P1OUT|=BIT1; //片選
#define sce0 P1OUT&=~BIT1; //片選
#define dc1 P1OUT|=BIT2; //1寫數(shù)據(jù),0寫指令
#define dc0 P1OUT&=~BIT2;
#define sdin1 P1OUT|=BIT3; //數(shù)據(jù)改為P1.7口
#define sdin0 P1OUT&=~BIT3;
#define sclk1 P1OUT|=BIT4; //時(shí)鐘
#define sclk0 P1OUT&=~BIT4;
#define led1 P1OUT&=~BIT5;
#define led0 P1OUT&=~BIT5;
unsigned const zimu[]={
0xF0,0x08,0x08,0x18,0xE0,0x00,0x1F,0x20,0x20,0x30,0x0F,0x00,/*"0",0*/
0x00,0x10,0xF8,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,/*"1",1*/
0x70,0x08,0x08,0x08,0xF0,0x00,0x30,0x2C,0x22,0x21,0x30,0x00,/*"2",2*/
0x30,0x08,0x88,0x88,0x70,0x00,0x18,0x20,0x20,0x31,0x1E,0x00,/*"3",3*/
0x00,0x80,0x60,0xF0,0x00,0x00,0x06,0x05,0x24,0x3F,0x24,0x04,/*"4",4*/
0xF8,0x08,0x88,0x88,0x08,0x00,0x19,0x21,0x20,0x31,0x1F,0x00,/*"5",5*/
0xE0,0x18,0x88,0x98,0x00,0x00,0x0F,0x31,0x20,0x20,0x1F,0x00,/*"6",6*/
0x38,0x08,0x08,0xE8,0x18,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,/*"7",7*/
0x70,0x88,0x08,0x88,0x70,0x00,0x1E,0x21,0x21,0x21,0x1E,0x00,/*"8",8*/
0xF0,0x08,0x08,0x18,0xE0,0x00,0x01,0x32,0x22,0x31,0x0F,0x00,/*"9",9*/
0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,/*":",10*/
0x80,0x80,0x80,0x80,0x00,0x00,0x3F,0x00,0x3F,0x00,0x3F,0x00,/*"m",11*/
0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x3D,0x26,0x22,0x3F,0x20,/*"a",12*/
0x80,0x80,0x00,0x00,0x80,0x80,0x00,0x07,0x38,0x1C,0x03,0x00,/*"v",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,/*".",14*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/
0xF0,0x98,0x60,0xE0,0x38,0x00,0x00,0x31,0x0E,0x1F,0x33,0x0C,/*"%",16*/
0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,/*"!",17*/
};
unsigned const hanzi[]=
{
0x00,0x00,0xF0,0x90,0x90,0xFE,0x90,0x90,0x90,0xF0,0x00,0x00,0x00,0x00,0x0F,0x04,
0x04,0x7F,0x44,0x44,0x44,0x47,0x78,0x00,/*"電",0*/
0x00,0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x84,0x04,0x00,0x00,0x38,0x47,0x41,
0x41,0x41,0x3F,0x41,0x45,0x58,0x20,0x00,/*"壓",1*/
0x00,0x40,0x8C,0x70,0xC8,0x68,0x5A,0x44,0x68,0xC8,0x00,0x00,0x00,0x38,0x0F,0x40,
0x3E,0x01,0x3E,0x01,0x3E,0x41,0x70,0x00,/*"流",2*/
0x00,0x40,0xC4,0x40,0x40,0xBC,0x84,0x84,0xBC,0xC0,0x20,0x00,0x00,0x00,0x0F,0x98,
0x88,0x43,0x2C,0x18,0x26,0x61,0x40,0x00,/*"設(shè)",3*/
0x00,0x30,0x90,0x90,0x90,0x8A,0x94,0x90,0x90,0x70,0x10,0x00,0x00,0x40,0x30,0x1E,
0x20,0x3B,0x44,0x44,0x44,0x44,0x40,0x00,/*"定",4*/
0x00,0x40,0xC4,0x00,0x00,0xFC,0xA4,0x7C,0xA4,0xA4,0xFC,0x00,0x00,0x00,0x3F,0x18,
0x3C,0x03,0x1F,0x12,0x1E,0x40,0x7F,0x00,/*"調(diào)",5*/
0x00,0x20,0x58,0xFE,0xD8,0x74,0x28,0x7E,0xC8,0x38,0x08,0x00,0x00,0x42,0x45,0x7B,
0x44,0x7F,0x52,0x55,0x54,0x43,0x42,0x00,/*"整",6*/
0x00,0x18,0x28,0x08,0x68,0xDE,0x48,0x28,0x48,0x38,0x00,0x00,0x00,0x02,0x11,0x10,
0x13,0x7E,0x12,0x13,0x11,0x11,0x08,0x00,/*"率",7*/
};
void LCD5110_init()
{
P1DIR|=0X3F;
P1OUT&=~0X20;
}
/*--------------------------------------------
LCD_write_byte: 使用SPI接口寫數(shù)據(jù)到LCD
輸入?yún)?shù):dt:寫入的數(shù)據(jù);
command :寫數(shù)據(jù)/命令選擇;
編寫日期:20080918
----------------------------------------------*/
void LCD_write_byte(unsigned char dt, unsigned char command)
{
unsigned char i;
sce0;
if(command==1)
{dc1; }
else {dc0;}
for(i=0;i<8;i++)
{
if(dt&0x80)
{sdin1;}
else
{sdin0;}
dt=dt<<1;
sclk0;
sclk1;
}
dc1;
sce1;
sdin1;
}
/*---------------------------------------
LCD_init: 3310LCD初始化
編寫日期:20080918
----------------------------------------- */
void LCD_init(void)
{
res0;
// delay_ms(1);
res1;
LCD_write_byte(0x21,0);//初始化Lcd,功能設(shè)定使用擴(kuò)充指令
LCD_write_byte(0xd0,0);//設(shè)定液晶偏置電壓
LCD_write_byte(0x20,0);//使用基本指令
LCD_write_byte(0x0C,0);//設(shè)定顯示模式,正常顯示
}
/*-------------------------------------------
LCD_set_XY: 設(shè)置LCD坐標(biāo)函數(shù)
輸入?yún)?shù):X:0-83 Y:0-5
編寫日期:20080918
---------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0);// column
LCD_write_byte(0x80 | X, 0);// row
}
/*------------------------------------------
LCD_clear: LCD清屏函數(shù)
編寫日期:20080918
--------------------------------------------*/
void LCD_clear(void)
{
unsigned char t;
unsigned char k;
LCD_set_XY(0,0);
for(t=0;t<6;t++)
{
for(k=0;k<84;k++)
{
LCD_write_byte(0x00,1);
}
}
}
/*---------------------------------------------
LCD_write_shu: 顯示8(寬)*16(高)點(diǎn)陣列數(shù)字字母符號(hào)等半角類
輸入?yún)?shù):c:顯示的字符;
編寫日期:20080918
-----------------------------------------------*/
void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:頁(yè) dd:字符
{
unsigned char i;
LCD_set_XY(row*6, page);// 列,頁(yè)
for(i=0; i<6;i++)
{
LCD_write_byte(zimu[c*12+i],1);
}
LCD_set_XY(row*6, page+1);// 列,頁(yè)
for(i=6; i<12;i++)
{
LCD_write_byte(zimu[c*12+i],1);
}
}
/*---------------------------------------------
LCD_write_hanzi: 顯示12(寬)*16(高)點(diǎn)陣列漢字等半角類
輸入?yún)?shù):c:顯示的字符;
編寫日期:20080918
-----------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:頁(yè) dd:字符
{
unsigned char i;
LCD_set_XY(row*6, page);// 列,頁(yè)
for(i=0; i<12;i++)
{
LCD_write_byte(hanzi[c*24+i],1);
}
LCD_set_XY(row*6, page+1);// 列,頁(yè)
for(i=12; i<24;i++)
{
LCD_write_byte(hanzi[c*24+i],1);
}
}
// config.h
#include <msp430.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CPU_F ((double)16000000) //外部高頻晶振8MHZ
//#define CPU_F ((double)32768) //外部低頻晶振32.768KHZ
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define KEY_0 0x16 //鍵0
#define KEY_1 0x0C //鍵1
#define KEY_2 0x18 //鍵2
#define KEY_3 0x5E //鍵3
#define KEY_4 0x08 //鍵4
#define KEY_5 0x1C //鍵5
#define KEY_6 0x5A //鍵6
#define KEY_7 0x42 //鍵7
#define KEY_8 0x52 //鍵8
#define KEY_9 0x4A //鍵9
#define prex 0x44 //電源
#define nex 0x40 //模式
#define play_pause 0x43 //靜音
#define ch_ 0x45 //模式
#define ch 0x46
#define cha 0x47 //模式
#define __ 0x07
#define _a 0x15
#define eq 0x09
#define _100a 0x19
#define _200a 0x0d
#define power 0x12 //power
#define up 0x1b //up
#define down 0x1a //down
#define left 0x04 //left
#define right 0x06 //right
#define ok 0x05 //0k
void extern_16m()
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
if (CALBC1_1MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ; // Load 8MHz constants
}
//h1838.h
#define IR_DIR_IN P2DIR&=~BIT0//紅外接收頭P1.0設(shè)置為輸入,
#define RED_R (P2IN&BIT0)//紅外接收頭輸入值
void h1838_init()
{
IR_DIR_IN;
}
uchar KEY_VAL;
uchar key_code[4],code_value;
void Key_Icode(uchar dat)
{
switch(dat) //第3個(gè)字節(jié)是數(shù)據(jù),第4個(gè)字節(jié)是反碼
{ //為了更穩(wěn)定,可以加上第4個(gè)字節(jié)數(shù)據(jù)的判斷
case KEY_0:KEY_VAL=0;LCD_write_shu(0,0,0); break;
case KEY_1:KEY_VAL=1; LCD_write_shu(0,0,1); break;
case KEY_2:KEY_VAL=2; LCD_write_shu(0,0,2); break;
case KEY_3:KEY_VAL=3; LCD_write_shu(0,0,3); break;
case KEY_4:KEY_VAL=4; LCD_write_shu(0,0,4); break;
case KEY_5:KEY_VAL=5; LCD_write_shu(0,0,5); break;
case KEY_6:KEY_VAL=6; LCD_write_shu(0,0,6);break;
case KEY_7:KEY_VAL=7; LCD_write_shu(0,0,7); break;
case KEY_8:KEY_VAL=8; LCD_write_shu(0,0,8); break;
case KEY_9:KEY_VAL=9; LCD_write_shu(0,0,9); break;
case prex:break;
case nex :break;
case play_pause:break;
case ch_: break;
case ch: break;
case cha:break;
case eq: break;
case _a:;break;
case __:break;
case _100a:break;
case _200a:break;
case power:break;
case up: break;
case down:break;
case left:break;
case right:break;
case ok:break;
default:KEY_VAL=' ';break;
}
}
void Red_Code()
{
uchar i,j,k = 0;
for(i = 0;i < 19;i++)
{
delay_us(400); //延時(shí)400us
if(RED_R) //9ms內(nèi)有高電平,則判斷為干擾,退出處理程序
{
return;
}
}
while(!RED_R); //等待9ms低電平過(guò)去
for(i=0;i<5;i++) //是否連發(fā)碼
{
delay_us(500);
if(!RED_R)
{
return;
}
}
while(RED_R); //等待4.5ms高電平過(guò)去
for(i = 0;i < 4;i++) //接收4個(gè)字節(jié)的數(shù)據(jù)
{
for(j = 0;j < 8;j++) //每個(gè)字節(jié)的數(shù)據(jù)8位
{
while(!RED_R); //等待變高電平
while(RED_R) //計(jì)算高電平時(shí)間
{
delay_us(100);
k++;
if(k >22) //高電平時(shí)間過(guò)長(zhǎng),則退出處理程序
{
return;
}
}
code_value>>=1; //接受一位數(shù)據(jù)
if(k >= 7)
{
code_value|=0x80; //高電平時(shí)間大于0.56,則為數(shù)據(jù)1
}
k = 0; //計(jì)時(shí)清零
}
key_code[i]=code_value; //四個(gè)字節(jié)的數(shù)據(jù)
}
Key_Icode(key_code[2]); //調(diào)用賦值函數(shù)
// Display_Key(KEY_VAL); //顯示按鍵值
// delay_ms(50);
}
//ta.h
uchar t1;
void init_TA()
{
TACCR0 = 50000; //25ms中斷一次
TACTL = TASSEL_2 + MC_1+ID_3; // SMCLK, upmode,8分頻,
TACCTL0 = CCIE; // TACCR0 interrupt enabled
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMERA0_ISR() // the interrupt source is CC0
{
if(++t1>=40)
{
t1=0;
DS1302_GetData_dis();
}
}
//iic.h
///時(shí)鐘模塊
#define DS1302_DIR P2DIR
#define DS1302_IN P2IN
#define DS1302_OUT P2OUT
#define DS1302_RST BIT6
#define DS1302_SCLK BIT4
#define DS1302_SDI BIT5 //定義MSP320的端口
#define DS1302_RST_LO P1OUT &= ~DS1302_RST
#define DS1302_RST_HI P1OUT |= DS1302_RST
#define DS1302_SCLK_LO DS1302_OUT&= ~DS1302_SCLK
#define DS1302_SCLK_HI DS1302_OUT |= DS1302_SCLK
#define DS1302_SDI_LO DS1302_OUT &= ~DS1302_SDI
#define DS1302_SDI_HI DS1302_OUT |= DS1302_SDI
void DS1302_Reset(void);
void DS1302_WriteOneByte(unsigned char w_dat);
void DS1302_WriteData(unsigned char addr,unsigned char w_dat);
void DS1302_SettingData(void);
void DS1302_GetData(unsigned char *str);
unsigned char DS1302_ReadOneByte(void);
unsigned char DS1302_ReadData(unsigned char addr);
unsigned char Setting_Time[7]={ //bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0x15, //--------十位-------|-------個(gè)位--------|年份(當(dāng)前07年)
0x03, // |-----個(gè)位-----|星期(當(dāng)前周日)
0x09, // |十位|-------個(gè)位--------|月份(當(dāng)前07月)
0x23, // |--十位---|-------個(gè)位--------|日期(當(dāng)前01號(hào))
0x9, //-12H| |--十位---|-------個(gè)位--------|小時(shí)(當(dāng)前18點(diǎn))
0x05, // |-----十位-----|-------個(gè)位--------|分鐘(當(dāng)前20分)
0x20 // |-----十位-----|-------個(gè)位--------|秒鐘(當(dāng)前30秒)
};
unsigned char ReadingData[7]; //讀出來(lái)的數(shù)據(jù),同SettingData定義與格式
/****************************
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
DS1302_Reset();
//DS1302_SettingData();
while(1){
DS1302_GetData(ReadingData);
_NOP();
};
}
****************************/
//DS1302復(fù)位
void DS1302_Reset(void) {
P1DIR |= DS1302_RST;
P2DIR |= DS1302_SCLK;
DS1302_SCLK_LO;
DS1302_RST_LO;
//delay_us(10);
DS1302_SCLK_HI;
}
//向DS1302寫入一個(gè)字節(jié)
void DS1302_WriteOneByte(unsigned char w_dat) {
unsigned char temp;
DS1302_RST_HI;
DS1302_DIR |= DS1302_SDI;
for(temp=8;temp>0;temp--) {
DS1302_SDI_LO;
if(w_dat&BIT0) DS1302_SDI_HI;
DS1302_SCLK_LO;
// delay_us(10);
DS1302_SCLK_HI;
// delay_us(10);
w_dat >>=1;
}
}
//從DS1302中讀取一個(gè)字節(jié)
unsigned char DS1302_ReadOneByte(void) {
unsigned char temp,rdata;
rdata = 0x00;
DS1302_RST_HI;
DS1302_DIR &= ~DS1302_SDI;
for(temp=0;temp<8;temp++){rdata >>= 1;//將移位放到前面,否則讀不到最高一位
DS1302_SCLK_HI;
// delay_us(10);
DS1302_SCLK_LO;
// delay_us(10);
if((DS1302_IN&DS1302_SDI)==DS1302_SDI)
rdata |= BIT7;
//rdata >>= 1;
}
return(rdata);
}
//向DS1302中寫入地址后寫入數(shù)據(jù)
void DS1302_WriteData(unsigned char addr,unsigned char w_dat) {
DS1302_RST_LO;
DS1302_SCLK_LO;
DS1302_RST_HI;
DS1302_WriteOneByte(addr); //寫入地址
DS1302_WriteOneByte(w_dat); //寫入數(shù)據(jù)
DS1302_SCLK_HI;
DS1302_RST_LO;
}
//向DS1302寫入地址后,從DS1302中讀取數(shù)據(jù)
unsigned char DS1302_ReadData(unsigned char addr) {
unsigned char r_dat;
DS1302_RST_LO;
DS1302_SCLK_LO;
DS1302_RST_HI;
DS1302_WriteOneByte(addr); //寫入地址
r_dat = DS1302_ReadOneByte(); //讀出數(shù)據(jù)
DS1302_SCLK_LO;
DS1302_RST_LO;
return(r_dat);
}
//按照SettingData的設(shè)置設(shè)置DS1302的時(shí)間
void DS1302_SettingData(void) {
unsigned char temp;
unsigned char addr = 0x8C;
DS1302_WriteData(0x8E,0x00); //寫入控制命令,禁用寫保護(hù)
for(temp=0;temp<7;temp++) {
DS1302_WriteData(addr,Setting_Time[temp]);
addr -= 2;
}
DS1302_WriteData(0x8E,0x80); //寫入控制命令,啟用寫保護(hù)
}
//讀取DS1302時(shí)間到ReadingData中
void DS1302_GetData(unsigned char *str) {
unsigned char temp;
unsigned char addr = 0x8D;
for(temp=0;temp<7;temp++) {
str[temp] = DS1302_ReadData(addr);//年
addr -= 2;
}
}
void DS1302_GetData_dis()
{
DS1302_GetData(ReadingData);
LCD_write_shu(0,2,Setting_Time[0]/16);
LCD_write_shu(1,2,Setting_Time[0]%16);
LCD_write_shu(2,2,10);
LCD_write_shu(3,2,Setting_Time[2]/16);
LCD_write_shu(4,2,Setting_Time[2]%16);
LCD_write_shu(5,2,10);
LCD_write_shu(6,2,Setting_Time[3]/16);
LCD_write_shu(7,2,Setting_Time[3]%16);
// LCD_write_shu(8,2,10);
LCD_write_shu(9,2,Setting_Time[1]/16);
LCD_write_shu(10,2,Setting_Time[1]%16);
LCD_write_shu(0,4,Setting_Time[4]/16);
LCD_write_shu(1,4,Setting_Time[4]%16);
LCD_write_shu(2,4,10);
LCD_write_shu(3,4,Setting_Time[5]/16);
LCD_write_shu(4,4,Setting_Time[5]%16);
LCD_write_shu(5,4,10);
LCD_write_shu(6,4,Setting_Time[6]/16);
LCD_write_shu(7,4,Setting_Time[6]%16);
}
復(fù)制代碼
作者:
jiangqdcs
時(shí)間:
2020-4-26 22:33
大神,你這個(gè)好像沒(méi)有檢測(cè)的函數(shù)啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1