

这是我自己想的一种方法,利用盖格计数器来技术每秒射线次数来检测辐射强度。
本系列文章:
盖格剂检测核辐射:http://www.51hei.com/bbs/dpj-47401-1.html
盖格管检测电路:http://www.51hei.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; //复位,0复位
- #define res0 P1OUT&=~BIT0;
- #define sce1 P1OUT|=BIT1; //片选
- #define sce0 P1OUT&=~BIT1; //片选
- #define dc1 P1OUT|=BIT2; //1写数据,0写指令
- #define dc0 P1OUT&=~BIT2;
- #define sdin1 P1OUT|=BIT3; //数据改为P1.7口
- #define sdin0 P1OUT&=~BIT3;
- #define sclk1 P1OUT|=BIT4; //时钟
- #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,/*"设",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,/*"调",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接口写数据到LCD
- 输入参数:dt:写入的数据;
- command :写数据/命令选择;
- 编写日期: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,功能设定使用扩充指令
- LCD_write_byte(0xd0,0);//设定液晶偏置电压
- LCD_write_byte(0x20,0);//使用基本指令
- LCD_write_byte(0x0C,0);//设定显示模式,正常显示
- }
- /*-------------------------------------------
- LCD_set_XY: 设置LCD坐标函数
- 输入参数: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清屏函数
- 编写日期: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(高)点阵列数字字母符号等半角类
- 输入参数:c:显示的字符;
- 编写日期:20080918
- -----------------------------------------------*/
- void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
- {
- unsigned char i;
-
- LCD_set_XY(row*6, page);// 列,页
- for(i=0; i<6;i++)
- {
- LCD_write_byte(zimu[c*12+i],1);
- }
-
- LCD_set_XY(row*6, page+1);// 列,页
- for(i=6; i<12;i++)
- {
- LCD_write_byte(zimu[c*12+i],1);
- }
- }
- /*---------------------------------------------
- LCD_write_hanzi: 显示12(宽)*16(高)点阵列汉字等半角类
- 输入参数:c:显示的字符;
- 编写日期:20080918
- -----------------------------------------------*/
- void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
- {
- unsigned char i;
-
- LCD_set_XY(row*6, page);// 列,页
- for(i=0; i<12;i++)
- {
- LCD_write_byte(hanzi[c*24+i],1);
- }
-
- LCD_set_XY(row*6, page+1);// 列,页
- 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设置为输入,
- #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个字节是数据,第4个字节是反码
- { //为了更稳定,可以加上第4个字节数据的判断
- 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); //延时400us
- if(RED_R) //9ms内有高电平,则判断为干扰,退出处理程序
- {
- return;
- }
- }
- while(!RED_R); //等待9ms低电平过去
- for(i=0;i<5;i++) //是否连发码
- {
- delay_us(500);
- if(!RED_R)
- {
- return;
- }
- }
- while(RED_R); //等待4.5ms高电平过去
- for(i = 0;i < 4;i++) //接收4个字节的数据
- {
- for(j = 0;j < 8;j++) //每个字节的数据8位
- {
-
- while(!RED_R); //等待变高电平
- while(RED_R) //计算高电平时间
- {
- delay_us(100);
- k++;
- if(k >22) //高电平时间过长,则退出处理程序
- {
- return;
- }
-
- }
- code_value>>=1; //接受一位数据
- if(k >= 7)
- {
- code_value|=0x80; //高电平时间大于0.56,则为数据1
- }
- k = 0; //计时清零
- }
- key_code[i]=code_value; //四个字节的数据
- }
- Key_Icode(key_code[2]); //调用赋值函数
- // 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
- ///时钟模块
- #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, //--------十位-------|-------个位--------|年份(当前07年)
- 0x03, // |-----个位-----|星期(当前周日)
- 0x09, // |十位|-------个位--------|月份(当前07月)
- 0x23, // |--十位---|-------个位--------|日期(当前01号)
- 0x9, //-12H| |--十位---|-------个位--------|小时(当前18点)
- 0x05, // |-----十位-----|-------个位--------|分钟(当前20分)
- 0x20 // |-----十位-----|-------个位--------|秒钟(当前30秒)
- };
- unsigned char ReadingData[7]; //读出来的数据,同SettingData定义与格式
- /****************************
- void main(void) {
- WDTCTL = WDTPW + WDTHOLD;
- DS1302_Reset();
- //DS1302_SettingData();
- while(1){
- DS1302_GetData(ReadingData);
- _NOP();
- };
- }
- ****************************/
- //DS1302复位
- void DS1302_Reset(void) {
- P1DIR |= DS1302_RST;
- P2DIR |= DS1302_SCLK;
- DS1302_SCLK_LO;
- DS1302_RST_LO;
- //delay_us(10);
- DS1302_SCLK_HI;
- }
- //向DS1302写入一个字节
- 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中读取一个字节
- 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中写入地址后写入数据
- 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); //写入数据
-
- DS1302_SCLK_HI;
- DS1302_RST_LO;
- }
- //向DS1302写入地址后,从DS1302中读取数据
- 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(); //读出数据
-
- DS1302_SCLK_LO;
- DS1302_RST_LO;
-
- return(r_dat);
- }
- //按照SettingData的设置设置DS1302的时间
- void DS1302_SettingData(void) {
- unsigned char temp;
- unsigned char addr = 0x8C;
-
- DS1302_WriteData(0x8E,0x00); //写入控制命令,禁用写保护
- for(temp=0;temp<7;temp++) {
- DS1302_WriteData(addr,Setting_Time[temp]);
- addr -= 2;
- }
-
- DS1302_WriteData(0x8E,0x80); //写入控制命令,启用写保护
- }
- //读取DS1302时间到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);
- }
复制代码
|