标题:
单片机控制电力柜用操控状态仪表程序源码
[打印本页]
作者:
dengzhen11
时间:
2018-5-5 12:47
标题:
单片机控制电力柜用操控状态仪表程序源码
前几年做的操控状态仪表,里边有COG液晶,串口,按键,IO,温湿度传感器,EEPROM等等
对于单片机的初学者有帮助,可以了解单片机和外设工作的基本原理
和简单的数据处理,
0.jpg
(35.78 KB, 下载次数: 125)
下载附件
2018-5-5 15:28 上传
全部资料51hei下载地址:
CaoKonog20120110.rar
(850.75 KB, 下载次数: 28)
2018-5-5 12:47 上传
点击文件名下载附件
操控状态
下载积分: 黑币 -5
单片机源码如下:
#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黑下载附件…………
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1