#define USART_GLOBALS
#include "include.h"
//串行口
//uchar time_uar_period; /*两次接收成功之间的间隔*/
//uchar time_rece_byte; /*接收两个字节之间的间隔*/
volatile uchar cnt_rece_num;//接收到的字节个数
volatile uchar cnt_tras_num;//发送字节个数
volatile uchar checkoutError; //接收数据错误
uchar uar_tras_buf[40]; /*连续发送40个字节*/
uchar uar_rece_buf[30]; /*连续接收30个字节*/
uchar uar_tras_succeed;
uchar uar_rece_succeed;
uchar fg_now_receive;
uchar sendPosi; //发送位
void deal_usart(void);
uint getRegisterVal(uint addr);
uint setCoilVal(uint addr,uint tempData);
uint setRegisterVal(uint addr,uint tempData);
/* CRC 高位字节值表 */
__flash uchar auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* CRC低位字节值表*/
__flash uchar auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
//////////////////////////////////////////////////////
//
//串行口
//
//////////////////////////////////////////////////////
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
//UCSRC = 0xA6; //异步 8位数据 1停止位 偶校验
//UBRRL = 0x33; //set baud rate as 9600
//UBRRH = 0x00;
switch (data_value)
{
case 0:
UCSRC = 0x86; //异步 8位数据 1停止位 无校验
break;
case 1:
UCSRC = 0xA6; //异步 8位数据 1停止位 偶校验
break;
case 2:
UCSRC = 0xB6; //异步 8位数据 1停止位 奇校验
break;
default:
break;
}
switch (band_value)
{
case 0:
UBRRL = 0x67; //set baud rate as 9600
UBRRH = 0x00;
break;
case 1:
UBRRL = 0x33; //set baud rate as 9600
UBRRH = 0x00;
break;
default:
break;
}
UCSRB = 0xD8; //允许接收发送及中断,数据位为8位
RECE_485;//485接收允许
cnt_tras_num=0;
cnt_rece_num=0;
uar_rece_succeed=0;
uar_tras_succeed=0;
fg_now_receive=0;
checkoutError = 0;
}
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
uchar status;
uchar temp;
status = UCSRA;
if (status&(1<<FE)&(1<<DOR)&(1<<PE))
{
checkoutError = 1;
}
//接收错误 //未用到
fg_now_receive = 1;
temp = UDR;
uar_rece_buf[cnt_rece_num] = temp;
checkoutError = 0;
//地址不正确,扔掉数据
if (uar_rece_buf[0] != sn_value)
{
cnt_rece_num = 0;
checkoutError = 1;
}
else if (cnt_rece_num<30)
{
cnt_rece_num++;//防止数组越界
}
}
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
//character has been transmitted
if (++sendPosi<cnt_tras_num)
{
while (!(UCSRA&(1<<UDRE))) ;
UDR = uar_tras_buf[sendPosi];
}
else
{
uar_tras_succeed = 1;
uar_rece_succeed = 0;
RECE_485;//485接收允许
cnt_rece_num = 0;//清接收地址偏移寄存器
checkoutError = 0;
}
}
//////////////////////////////////////////////////////
//
//crc16校验程序
//
//////////////////////////////////////////////////////
uint crc16(uchar *puchMsg, uint usDataLen)
{
uchar uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
uchar uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
unsigned long uIndex ; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
//开始发送
void beginSend(void)
{
SEND_485; //设为发送
while (!(UCSRA&(1<<UDRE))) ; //发送数据寄存器空
sendPosi = 0;
UDR = uar_tras_buf[sendPosi];
}
//////////////////////////////////////////////////////
//
//读寄存器
//
//////////////////////////////////////////////////////
void readRegisters(void)
{
uint addr;
uint tempAddr;
uint crcData;
uint readCount;
uint byteCount;
uint i;
uint tempData = 0;
//起始地址
addr = (uar_rece_buf[2]<<8) + uar_rece_buf[3];
tempAddr = addr & 0xffff;
//寄存器数量
readCount = (uar_rece_buf[4]<<8) + uar_rece_buf[5]; //要读的个数
byteCount = readCount * 2;
for(i=0; i<byteCount; i+=2,tempAddr++)
{
tempData = getRegisterVal(tempAddr);
uar_tras_buf[i+3] = tempData >> 8;
uar_tras_buf[i+4] = tempData & 0xff;
}
uar_tras_buf[0] = sn_value;
uar_tras_buf[1] = 0x03;
uar_tras_buf[2] = byteCount;
byteCount += 3;
crcData = crc16(uar_tras_buf,byteCount);
uar_tras_buf[byteCount] = crcData >> 8;
byteCount++;
uar_tras_buf[byteCount] = crcData & 0xff;
cnt_tras_num = byteCount + 1;
beginSend();
}
//////////////////////////////////////////////////////
//
//强制单个线圈
//
//////////////////////////////////////////////////////
void forceSingleCoil(void)
{
uint addr;
uint tempAddr;
uint tempData;
uint onOff;
uchar i;
addr = (uar_rece_buf[2]<<8) + uar_rece_buf[3];
tempAddr = addr & 0xfff
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Atmega16单片机和Att7022计量芯片 (330个子文件)
ATT7022.c.110112083320 6KB
config.h.110112083332 2KB
fun.c.110112083340 3KB
fun.h.110112083344 415B
include.h.110112083356 220B
main.c.110112083358 9KB
test.c.110112083422 4KB
test.h.110112083422 220B
user.c.110112083432 3KB
user.h.110112083434 357B
ATT7022.c.110113104340 6KB
ATT7022.c.110113110320 6KB
ATT7022.c.110113112514 6KB
ATT7022.c.110113112956 6KB
ATT7022.c.110113113532 6KB
main.h.110113162516 517B
main.c.110217111314 8KB
test.c.110217111314 4KB
user.c.110217111314 3KB
fun.c.110217111314 3KB
config.h.110217111314 2KB
main.c.110217111656 8KB
config.h.110217113858 2KB
config.h.110217125054 2KB
main.c.110217125210 8KB
main.c.110217125304 8KB
config.h.110217130402 2KB
user.c.110217141838 3KB
config.h.110217141838 2KB
user.c.110217142032 3KB
main.c.110217144826 8KB
main.c.110217145400 8KB
main.c.110217145458 8KB
main.c.110217145538 8KB
main.c.110217150816 8KB
main.c.110217151318 8KB
fun.c.110219165438 3KB
fun.c.110219165654 3KB
ATT7022.c.110221094326 6KB
fun.c.110221110130 3KB
fun.c.110221111338 3KB
fun.c.110221111520 3KB
fun.c.110221111556 3KB
main.c.110221114036 8KB
main.c.110221124432 8KB
main.c.110221143714 9KB
test.h.110221143714 245B
main.c.110221144050 9KB
test.c.110221144050 4KB
test.h.110221144050 249B
main.c.110221144104 9KB
main.c.110221144116 9KB
test.c.110221144136 4KB
test.c.110221144214 4KB
test.c.110221144234 4KB
main.c.110221145316 9KB
test.h.110221145316 220B
main.c.110221150024 9KB
main.c.110221150148 9KB
main.c.110221150340 9KB
main.c.110221151304 9KB
main.c.110221161856 9KB
main.c.110221163602 9KB
ATT7022.c.110221163602 6KB
main.c.110221164016 9KB
main.c.110221164112 9KB
main.c.110221164156 9KB
main.c.110221164232 9KB
main.c.110221165532 9KB
main.c.110221165650 9KB
main.c.110221165738 9KB
main.c.110221165834 9KB
main.c.110221165914 9KB
main.c.110221170112 9KB
main.c.110221170206 9KB
main.c.110222090658 9KB
test.c.110222090658 4KB
test.c.110222090750 4KB
test.c.110222090834 4KB
test.c.110222091320 4KB
test.c.110222091546 4KB
test.c.110222092838 4KB
test.c.110222093428 4KB
test.c.110222093956 4KB
test.c.110222094104 4KB
test.c.110222094232 4KB
test.c.110222094356 4KB
test.c.110222094650 4KB
test.c.110222094944 4KB
test.c.110222095104 4KB
test.c.110222095526 4KB
test.c.110222095640 4KB
test.c.110222095742 5KB
test.c.110222095854 5KB
test.c.110222095952 6KB
test.c.110222100228 4KB
test.c.110222100646 4KB
test.c.110222100808 4KB
test.c.110222101050 4KB
test.c.110222101916 4KB
共 330 条
- 1
- 2
- 3
- 4
资源评论
klmt1981
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功