前几年做的操控状态仪表,里边有COG液晶,串口,按键,IO,温湿度传感器,EEPROM等等
对于单片机的初学者有帮助,可以了解单片机和外设工作的基本原理
和简单的数据处理,
全部资料51hei下载地址:
CaoKonog20120110.rar
(850.75 KB, 下载次数: 28)
单片机源码如下:
- #include <iom64v.h>
- #include <macros.h>
- #include <string.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <eeprom.h>
- #include <math.h>
- /*********************************************************************************************************/
- #include "IO.h"
- #include "uart.h"
- #include "lcd.h"
- #include "key.h"
- #include "sht.h"
- /*********************************************************************************************************/
- #pragma data:data
-
- unsigned char temp_flag=0;
- unsigned char wd_shang;
- unsigned char wd_xia;
- unsigned char sd_shang;
- unsigned char sd_xia;
- unsigned char pf_shang;
- unsigned char pf_xia;
- unsigned char Body_Flag; //人体靠近带电标志位
- unsigned char rt_gy; // 人体感应非投入,1:投入,2:非投入
- unsigned char db_du;
- unsigned char InIt_Para[]={0x0a,0x05,0x5D,0x55,0x37,0x32,0x01,0x01};
- /*********************************************************************************************************/
- unsigned char wd_bz;
- unsigned char sd_bz;
- unsigned char pf_bz;
- unsigned char wendu1_biaozhi;
- unsigned char wendu2_biaozhi;
- unsigned char mima;
- /*********************************************************************************************************/
- unsigned int R_ms_Timer,mincount1;
- unsigned int timer_count;
- unsigned char timer_count1;
- unsigned char timer_count2;
- unsigned char timer_count3;
- unsigned char Cls_Lcd_Flag;
- unsigned char GPIOSamp_counter_Flag;
- unsigned char GPIOSamp_counter;
- /*********************************************************************************************************/
- extern unsigned char bz; //位标志
- extern unsigned char bz1; //位标志,判断是地址还是数据
- extern unsigned char di_zhi;
- extern unsigned char Receiver_Flag; // 接受数据标志
- extern unsigned char Back_Light_Flag;
- extern unsigned char rx0_buf[16]; // 接收数据缓存器
- extern unsigned char rx0_index; // 接收数据计数器
- extern unsigned char Tx0_buf[16]; // 发送数据缓存器
- extern unsigned char R_KeyValue1;
- /*********************************************************************************************************/
- //todao[0]:湿度测量 1; todao[1]: 温度测量 1; todao[2]:湿度测量 2; todao[3]:温度测量 2
- extern float todao[4]; //{temp,rh}; 模拟量寄存器从1到2
-
- extern unsigned char rx0_index;
-
- extern unsigned char Q,n,TT1,T,TT2;
- extern unsigned char ch,cl;
- extern unsigned char Up_Counter;
- extern unsigned char Page_Flag;
- extern unsigned char Page_Flag1;
- /**********************************************************************************************************
- ** 函数名称:init_para()
- ** 函数功能:开机时取得、设定各项参数
- ** 入口参数:
- ** 出口参数:无
- ** 说 明:
- *********************************************************************************************************/
- void init_para(void)
- {
- EEPROMReadBytes(0x0010,&wd_shang,1);
- delay_nms(10);
- EEPROMReadBytes(0x0011,&wd_xia,1);
-
- delay_nms(10);
- EEPROMReadBytes(0x0012,&sd_shang,1);
- EEPROMReadBytes(0x0013,&sd_xia,1);
- delay_nms(10);
- EEPROMReadBytes(0x0014,&pf_shang,1);
- EEPROMReadBytes(0x0015,&pf_xia,1);
- EEPROMReadBytes(0x0016,&rt_gy,1);
- EEPROMReadBytes(0x0017,&di_zhi,1);
-
- }
- /**********************************************************************************************************
- * 函数名称:EEprom_init()
- * 函数功能:开机时取得、设定各项参数
- * 入口参数:
- * 出口参数:无
- * 说 明:
- ********************************************************************************************************/
- void EEprom_init(void)
- {
- unsigned char EEP_Read=0,Eep_Write=0;
-
- EEPROMReadBytes(0x03,&EEP_Read,1);
- if( EEP_Read != 0x55)
- {
- Eep_Write = 0x55;
- EEPROMWriteBytes(0x0003,&Eep_Write,1);
- EEPROMWriteBytes(0x0010,InIt_Para,8);
- init_para();
- }
- else
- {
- init_para();
- }
- }
- /**********************************************************************************************************
- ** 函数名称:timer0_init()
- ** 函数功能:初始化定时器0,10ms定时器
- ** 入口参数:无
- ** 出口参数:无
- ** 说明: 8位定时器,和8051相似,只是注意定时器时钟是晶振分频以后
- *********************************************************************************************************/
- void Timer0_init(void)
- {
- TCCR0 = 0x00;
- ASSR = 0x00;
- TCNT0 = 0xB1; // 定时初值 8Mhz
- //TCNT0 = 0x93; // 定时初值 11Mhz
- OCR0 = 0x00;
- TCCR0 = 0x07; // 时钟1024分频 ,启动定时器
- TIMSK |= 0x01; // timer0中断使能
- }
- /**********************************************************************************************************
- ** 函数名称:timer0_ovf_isr()
- ** 函数功能:定时器0溢出中断服务程序
- ** 入口参数:无
- ** 出口参数:无
- ** 说明:
- *********************************************************************************************************/
- #pragma interrupt_handler Timer0_ovf_isr:iv_TIMER0_OVF
- void Timer0_ovf_isr(void)
- {
- TCNT0 = 0xB1;
- R_ms_Timer++;
- timer_count1++;
- if(timer_count1>=4)
- {
- KeyValue_Pro();
- timer_count1=0;
- }
- if(GPIOSamp_counter_Flag)
- GPIOSamp_counter++;
-
-
- if((Back_Light_Flag==1)&&((Body_Flag == 0)||(Body_Flag == 2))) // 液晶背光
- {
- mincount1++;
- if(mincount1 >= Ldc_Timer ) // 30秒
- {
- mincount1 = 0;
- DI_jdq5_ZHMIN_OUT1;
- LCD_LED_OUT1;
- }
- }
- if(Back_Light_Flag==0)
- {
- LCD_LED_OUT0;
- DI_jdq5_ZHMIN_OUT0;
- mincount1 = 0;
- }
-
- }
- /**********************************************************************************************************
- ** 函数名称:timer1_init()
- ** 函数功能:初始化定时器1
- ** 入口参数:无
- ** 出口参数:无
- ** 说明:
- ** 16位定时器,和8051相似,只是注意定时器时钟是晶振分频以后
- ** TCNT1 = 65536 - (Focs X m) / 1024; m: 为定时时间,单位 s
- ** TCNT1分为TCNT1H和TCNT1L
- *********************************************************************************************************/
- void Timer1_init(void)
- {
- TCCR1B = 0x00; //stop
-
- //TCNT1H = 0x0D5; //计数初值 , 定时为1秒 Focs = 11.0592Mhz
- //TCNT1L = 0x0D0;
-
- //TCNT1H = 0x02D; //计数初值 , 定时为5秒 Focs = 11.0592Mhz
- //TCNT1L = 0x00F;
-
- //TCNT1H = 0x0E1; //计数初值, 定时为1秒 Focs = 8Mhz
- //TCNT1L = 0x07B;
- TCNT1H = 0x0F0; //计数初值, 定时为0.5秒 Focs = 8Mhz
- TCNT1L = 0x0BD;
-
- OCR1AH = 0x98; // 输出比较寄存器A初值
- OCR1AL = 0x96;
-
- OCR1BH = 0x98; // 输出比较寄存器B初值
- OCR1BL = 0x96;
-
- ICR1H = 0x98; // 输入捕获寄存器初值
- ICR1L = 0x96;
-
- TCCR1A = 0x00; // 比较匹配模式禁止
- TCCR1B = 0x05; // start Timer,时钟分频1024分频
- TIMSK |= 0x04; // timer1中断使能
- }
- /**********************************************************************************************************
- ** 函数名称:timer1_ovf_isr()
- ** 函数功能:定时器1溢出中断服务程序
- ** 入口参数:
- ** 出口参数:无
- ** 说 明:500ms
- *********************************************************************************************************/
- #pragma interrupt_handler Timer1_ovf_isr:iv_TIMER1_OVF
- void Timer1_ovf_isr(void)
- {
- TCNT1H = 0x0F0;
- TCNT1L = 0x0BD;
- timer_count2++;
- if((Page_Flag !=0))
- {
- timer_count3++;
- if(timer_count3 >=60) // 一定时间内没有按键,强制返回温湿度显示页面
- {
- timer_count3 = 0;
- Cls_Lcd_Flag = 1;
- }
- }
- if(timer_count2 >= 2) // 1.5秒重新检测一次温湿度
- {
- timer_count2 = 0;
- temp_flag=1;
- }
- if(Body_Flag == 1) // 人体感应设置为投时,检测到人体感应时
- {
- LCD_LED_OUT0;
- DI_jdq5_ZHMIN_OUT0;
- timer_count = 0;
- }
- if(Body_Flag == 0) // 人体感应设置为投时,未检测到人体感应时
- {
- timer_count++;
- if(timer_count >= Body_Timer ) // 1分钟后关闭液晶背光
- {
- timer_count = 0;
- LCD_LED_OUT1;
- DI_jdq5_ZHMIN_OUT1;
- }
- }
- }
- /**********************************************************************************************************
- ** 函数名称:QuanJu_Var_Init()
- ** 函数功能:全局变量初始化
- ** 入口参数:
- ** 出口参数:无
- ** 说 明:
- *********************************************************************************************************/
- void QuanJu_Var_Init(void)
- {
-
- bz1 = 1;
- T=15;
- TT1=18;
- TT2=18;
- Q=n=ch=cl=0;
- rx0_index = 0;
- Up_Counter = 1;
- Receiver_Flag = 0;
- Back_Light_Flag = 1;
- db_du =0x70;
- Body_Flag = 0;
- LCD_LED_OUT0;
- memset(Tx0_buf,0,sizeof(Tx0_buf));
- memset(rx0_buf,0,sizeof(rx0_buf));
- memset(todao,0,sizeof(todao));
- }
- /**********************************************************************************************************
- ** 函数名称:Hardware_Init()
- ** 函数功能:所有外设端口初始化
- ** 入口参数:
- ** 出口参数:无
- ** 说 明:
- *********************************************************************************************************/
- void Hardware_Init(void)
- {
- //keyboard
- PORTD |= 0x0f0; //输入置为上拉
-
- KY1_IN;
- KY2_IN;
- KY3_IN;
- KY4_IN;
- // 温湿度
- SHT10_SCK1_OUT;
- SHT10_SDA1_OUT;
- SHT10_SCK2_OUT;
- SHT10_SDA2_OUT;
- //LED灯
- DI_led1_OUT;
- DI_led2_OUT;
- DI_led3_OUT;
- DI_led4_OUT;
- DI_led5_OUT;
- DI_led6_OUT;
- DI_led7_OUT;
- DI_led8_OUT;
-
- DI_led1_OUT0;
- DI_led2_OUT1;
- DI_led3_OUT0;
- DI_led4_OUT0;
- DI_led5_OUT0;
- DI_led6_OUT0;
- DI_led7_OUT0;
- DI_led8_OUT1;
-
- //继电器
- DI_jdq0_JRA_OUT;
- DI_jdq1_JRB_OUT;
- DI_jdq2_PF_OUT;
- DI_jdq3_BJ_OUT;
- DI_jdq4_BS_OUT;
- DI_jdq5_ZHMIN_OUT;
-
- DI_jdq0_JRA_OUT1;
- DI_jdq1_JRB_OUT1;
- DI_jdq2_PF_OUT1;
- DI_jdq3_BJ_OUT1;
- DI_jdq4_BS_OUT1;
- DI_jdq5_ZHMIN_OUT1;
-
- //语音
- DI_yu_ying1_OUT;
- DI_yu_ying2_OUT;
- DI_yu_ying3_OUT;
- DI_yu_ying4_OUT;
- DI_yu_ying5_ZD_OUT;
- DI_yu_ying1_OUT0;
- DI_yu_ying2_OUT0;
- DI_yu_ying3_OUT0;
- DI_yu_ying4_OUT0;
- DI_yu_ying5_ZD_OUT0;
- //HC165输入端口
- HC165_SCK_OUT;
- HC165_LD_OUT;
- HC165_SD_IN;
- PORTG |= 0x04;
- // 人体感应
- Re_gyin_RT;
- PORTD |= 0x01;
- //LCD端口
- LCD_DIR1_OUT;
- LCD_DIR2_OUT;
-
- LCD_CS_OUT;
- LCD_RST_OUT;
- LCD_RS_OUT;
- LCD_RW_OUT;
- LCD_ERW_OUT;
- LCD_LED_OUT;
-
- DDRA = 0xff; // PA为输出
-
- LCD_DIR1_OUT1;
- LCD_DIR2_OUT1;
- //RS485 接收发送选择:接收
- SET_485_EN_OUT;
- SET_485_EN_OUT1;
-
- DI_jdq5_ZHMIN_OUT0; //照明
-
- }
- /**********************************************************************************************************
- ** 函数名称:main()
- ** 函数功能:
- ** 入口参数:
- ** 出口参数:无
- ** 说 明:
- *********************************************************************************************************/
- void main(void)
- {
- CLI();
- EEprom_init();
- Hardware_Init();
- uart0_init();
- Timer0_init();
- Timer1_init();
- QuanJu_Var_Init();
- Lcd_Init();
- Temp_Humi_Init();
- SEI();
- Init_LcdDis();
- while(1)
- {
- //KeyValue_Pro();
- if((Page_Flag1==1)&&(Page_Flag !=0))
- {
- Page_Flag1 = 0;
- LCD_CLS();
- }
- if(Cls_Lcd_Flag)
- {
- Cls_Lcd_Flag = 0;
- Page_Flag = 0;
- LCD_CLS();
- Up_Counter = 1;
- }
-
- Menu_Display();
- /*
- if(temp_flag && (Page_Flag == 0)) // 由于温度检测测量时间较长影响按键和通讯,只有在温度显示页面才进行温度刷新
- {
- Temp_Humi_Init();
- temp_flag=0;
- }
- */
- Out_Logic();
- Check_IO_Pra();
- if(Receiver_Flag)
- {
- shuju_chuli();
- clear_rx0_tx0_buf();
- Receiver_Flag = 0;
- …………
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|