📄 water.c
字号:
#include "iom16v.h" //ATmega16L头文件
#define uchar unsigned char
#define uint unsigned int
//I/O 定义
#define disp_on 3 //PA3 按钮开显示
#define disp_off 0 //PA0 按钮关显示
#define r485_ctr 2 //PA2 485收发控制
#define relay_ctra 4 //PA4 继电器控制A
#define relay_ctrb 5 //PA5 继电器控制B
#define dot_ctr 6 //PA6 显示小数点控制
#define relay_sts 1 //PA1 继电器状态指示
#define run_led 5 //PC5 程序运行指示
#define pulse_led 6 //PC6 数据脉冲指示
#define rtc_sda 1 //PC1 时钟的数据线SDA
#define rtc_scl 0 //PC0 时钟的SCL
#define pulse_B 3 //PD3 采集脉冲A
#define pulse_A 4 //PD4 采集脉冲B
#define pulse_test 5 //PD5 采集接口状态
#define power_sts 2 //PD2 供电状态
//变量定义
uchar data_buffer[30]; //通讯数据缓存
uchar water_data_hex[4]; //脉冲原始数据
uchar water_data_disp[4]; //脉冲显示数据
uchar now_time[12]; //时钟,BCD
uchar now_time_hex[6]; //时钟,HEX
uchar time_reg;
uchar pulse_temp; //采集标志字节
uchar comm_temp; //接收通讯标志
……
/*
子函数定义,略
……
……
……
*/
void main(void)
{
//I/O方向定义 1输出 0输入
SREG =0x00;
DDRA = 0x74;
DDRB = 0x00;
DDRC = 0x63;
DDRD = 0x02;
//UART初始化
UCSRB=0xd8 ;//允许发送和接收,发送和接收中断使能
UBRRL=25 ; // 波特率9600
UBRRH=00 ;//
UCSRC=0x86 ;//8位数据+1位STOP位
//TWI 初始化
TWSR=00;
TWBR=0x16; //50K
//定时器2初始化
TCNT2 = 0xb1; //计数初值,20mS
TIMSK = 0x40; // TIMER_OVF中断使能
TCCR2 = 0x07; // 一个计数1/1024clk,启动
PORTC &=~(1<<run_led); //程序指示
display_on(); //显示开启子函数
delay_ms(1000);
PORTC |=(1<<run_led);
display_off(); //显示关闭子函数
SREG=0x80; //总中断允许
while(1) //主循环
{
if((PINA&(1<<disp_on)) && (!(PINA&(1<<disp_off)))) //判断显示是否需要打开
{
display_on();
}
else
{
display_off();
}
if(PIND&(1<<power_sts)) //判断供电情况
{
power_status=0x01 ;
read_curren_time(); //读当前时钟
eeprom_write(p_addr,power_status); //保存当前电压状态
}
else
{
}
if(pulse_temp==0x01) //判断是否需要处理采集数据
{
pulse_data_deal(); //处理脉冲数据:脉冲+1,数值处理,保存
}
else
{
}
if(comm_temp==0x01) //判断是否收完一帧有效的通讯数据
{
cmd_data_deal(); //通讯处理,命令解析,执行,发送命令帧组合
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -