专业综合设计说明书

吉林化工学院信控学院专业综合设计说明书

基于C8051F350单片机

学生学号:     08540207          

学生姓名:                   

专业班级:     测控0802         

指导教师:   童少为          

职    称:              

起止日期:  2011.10.102011.10.28

吉林化工学院

Jilin Institute of Chemical Technology


专业综合设计任务书

一.设计题目:基于CPLD的数字钟设计

二.设计目的

1.培养学生实践动手能力及独立分析和解决工程实际问题的能力;

2.培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风;

3.学习C8051F350单片机体系结构及程序开发;

4.学习电路的焊装和硬件调试;

5. 编写完整的实验程序,进行整机调试;

6. 学习撰写设计说明书。

三.设计任务及要求

    设计并实现数字钟。下载芯片:Altera的MAX7000S系列EPM7128SLC84。时钟具有以下基本功能:

1.具有时、分、秒显示,24小时循环计时功能;

2.具有时间校准(调时或对时)功能;   

四.设计时间及进度安排    

设计时间共三周(2011.10.10~2011.10.28),具体安排如下表:

五.指导教师评语及学生成绩


目    录

专业综合设计任务书·· I

摘  要·· 1

第一章 概述·· 2

第二章 设计原理·· 3

第三章 硬件设计·· 4

3.1  原理框图·· 4

3.2  C8051F350单片机·· 4

3.3  ADM2582E电路·· 5

3.4  采样电压电路·· 5

3.5  供电电源电路·· 6

第四章 软件设计·· 7

4.1  组态王使用说明·· 7

4.2  Modbus协议介绍·· 7

4.3  编程语言(C语言)介绍·· 8

4.4  Keil软件介绍及使用·· 9

4.5  程序流程图·· 9

第五章 心得体会·· 10

5.1  结论·· 10

5.2  结束语·· 10

参考文献·· 11

附录1· 12

附录2· 13


摘  要

关键词:C8051F350单片机;MUDBUS协议
 

第一章 概述


第二章 设计原理


第三章 硬件设计

3.1  原理框图

本系统整体框架主要由C8051F350单片机系统、供电电源电路、AD采样电压电路、ADM2582E电路等结构组成。系统框图如图3-1所示:

 

3.2  C8051F350单片机

C8051F350单片机是 C8051F350器件是完全集成的混合信号片上系统型MCU。下面列出了一些主要特性:

? 高速、流水线结构的8051兼容的CIP-51内核(可达50 MIPS)

? 全速、非侵入式的在系统调试接口(片内)

? 24或16位单端/差分ADC,带模拟多路器

? 两个8位电流输出DAC

? 高精度可编程的24.5MHz内部振荡器

? 8KB在片FLASH存储器

? 768字节片内RAM

? 硬件实现的SMBus/ I2C、增强型UART和SPI串行接口

? 4个通用的16位定时器

? 具有3个捕捉/比较模块和看门狗定时器功能的可编程计数器/定时器阵列(PCA)

? 片内上电复位、VDD监视器和温度传感器

? 片内电压比较器

? 17个端口I/O(容许5V输入)

具有片内上电复位、VDD监视器、看门狗定时器和时钟振荡器的C8051F350/1/2/3是真正能独立工作的片上系统。FLASH存储器还具有在系统重新编程能力,可用于非易失性数据存储,并允许现场更新8051固件。用户软件对所有外设具有完全的控制,可以关断任何一个或所有外设以节省功耗。C8051F350单片机最小系统框图如图3-2所示。

图中电容C19和C20,C9和C10构成滤波电路,为单片机提供尽可能稳定的供电电压;C1和C2构成滤波电路,为外部提供一个2.5V的电压基准,本设计中分压后送给AD进行电压采集;AIN0.0为AD的输入端口;P0.6为ADM2582E的使能端口。

3.3  ADM2582E电路

ADM2587E产品特性如下:

● 隔离的RS-485/RS-422 收发器,可配置成半双工或全双工模式

● 集成隔离DC/DC 转换器

● ±15 kV ESD 保护功能

● 隔离电压:2500V

● 数据速率:500Kbps/16 Mbps

● 5 V 或3.3V 电源供电

● 可防止输出短路

● 总线上拥有256 个节点

● 真正的故障安全接收机输入

● 高共模瞬态抑制能力:>25 kV/μs

● 封装:SOIC-20 宽体

3.4  采样电压电路

3.5  供电电源电路

本次设计采用+5V电源供电,由于C8051F350单片机的供电电压为2.7V - 3.6V,所以选择LM1117T-3.3,稳出3.3V为单片机和ADM2582E供电。其电路图如图3-6所示。图中电容起滤波作用,使得到更稳定的电压。


第四章 软件设计

4.1  组态王使用说明

组态王开发监控系统软件,是新型的工业自动控制系统,它以标准的工业计算机软、硬件平台构成的集成系统取代传统的封闭式系统。组态王软件经过七年开发,五年的各种突发环境的真实考验,九千例工程(钢铁,化工,电力,国属粮库,邮电通讯,环保,水处理,冶金等各行业)的现场运行(包括"中华世纪坛"国家标志性工程),现已成为国内组态软件的客户首选,并且作为首家国内组态软件应用于国防,航空航天等重大领。它具有适应性强、开放性好、易于扩展、经济、开发周期短等优点。通常可以把这样的系统划分为控制层、监控层、管理层三个层次结构。其中监控层对下连接控制层,对上连接管理层,它不但实现对现场的实时监测与控制,且在自动控制系统中完成上传下达、组态开发的重要作用。尤其考虑三方面问题:画面、数据、动画。通过对监控系统要求及实现功能的分析,采用组态王对监控系统进行设计。组态软件也为试验者提供了可视化监控画面,有利于试验者实时现场监控。而且,它能充分利用Windows的图形编辑功能,方便地构成监控画面,并以动画方式显示控制设备的状态,具有报警窗口、实时趋势曲线等,可便利的生成各种报表。它还具有丰富的设备驱动程序和灵活的组态方式、数据链接功能。

建立新组态王工程的一般过程是:

1.设计图形界面(定义画面)

2.定义设备

3.构造数据库(定义变量)

4.建立动画连接

5.运行和调试

需要说明的是,这五个步骤并不是完全独立的,事实上,这四个部分常常是交错进行的。在用组态王画面开发系统编制工程时,要依照此过程考虑三个方面:

图形 用户希望怎样的图形画面?也就是怎样用抽象的图形画面来模拟实际的工业现场和相应的工控设备。

数据 怎样用数据来描述工控对象的各种属性?也就是创建一个具体的数据库,此数据库中的变量反映了工控对象的各种属性,比如温度,压力等。

连接 数据和图形画面中的图素的连接关系是什么?也就是画面上的图素以怎样的动画来模拟现场设备的运行,以及怎样让操作者输入控制设备的指令。

4.2  Modbus协议介绍

Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Master/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。

Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。

CRC校验:CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。

CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。

4.3  编程语言(C语言)介绍

C语言是一种面向过程的计算机程序设计语言,它是目前众多计算机语言中举世公认的优秀的结构程序设计语言之一。它由美国贝尔研究所D.M.Ritchie于1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。C语言发展如此迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。许多著名的系统软件,如DBASE Ⅳ都是由C 语言编写的。用C 语言加上一些汇编语言子程序,就更能显示C 语言的优势了,像PC- DOS 、WORDSTAR等就是用这种方法编写的。

 C语言主要有以下特点:

 1、 C是中级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。  

2、C是结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。  

3、C语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外C语言也具有强大的图形功能,支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。

4、C语言适用范围大。适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要硬件进行操作的场合,明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。

基于C语言的这些特点,我们选用C语言作为编程语言。

4.4  Keil软件介绍及使用

KeilC51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

我们利用开发软件Keil uVision3来编写、修改所需程序并下载程序到单片机运行。Keil uVision3的使用步骤如下:

1.双击Keil uVision3,进入开发环境;

2.Project-New Project-保存;

3.File-New-保存;

4.单片机类型的选择,仿真器选择;

5.编写C程序;

6.编译-运行-烧录。

4.5  程序流程图

根据本设计的要求,设计出程序流程图,如图4-1所示:


第五章 心得体会

5.1  结论

5.2  结束语


参考文献

 [1] 翟玉文,梁伟, 艾学忠.电子设计与实践. 中国电力出版社,2005.5

[2] 童诗白,华成英. 模拟电子技术基础. 高等教育出版社出版社,2009.3

[3] 阎石. 数字电子技术基础(第五版)[M]. 高等教育出版社,2006.5

[4] 时景荣,李立春. C语言程序设计. 中国铁道出版社,2008.12

[5] 张齐,朱宁西.. 单片机系统设计与开发. 北京:机械工业出版社,2008.8

[6] 张毅刚. 单片机原理及应用. 北京:高等教育出版社,2008

[7] 申琢玉.吉林化工学院毕业设计说明书.2009.6.12


附录1


附录2

部分程序代码:

#include <C8051F350.h>        // 包含C8051f410单片机特殊寄存器

#include<externn.h>

union

{ unsigned char num[4];

 long a;}

datt;

unsigned char ncnt=0;

unsigned long ada=0,ada1=0;

unsigned char mod_dat[9], jiaoyanceshi[8];

unsigned char Rdat_cnt = 0, DATrrupt_15_cnt = 0 ,delay35_cnt = 0    ;

unsigned char TXDD[7] = {0x02,0x03}   ;

bit  send_flag = 0,cnt_send_flag=0 ,delay35_flag = 0,delay35_end_flag = 0 ;

bit  DATrrupt_15_flag = 0;

#define     uint        unsigned int

#define     uchar       unsigned char

sbit   EN = P0^6;      

void dat_packing()

{   long aq=0;

mod_dat[0] = 0x02;

mod_dat[1] = 0x03;  

    mod_dat[2] = 0x04;

mod_dat[3] = datt.num[0];

mod_dat[4] = datt.num[1];

mod_dat[5] = datt.num[2];

mod_dat[6] = datt.num[3];

TXDD[2] = 0x04;

TXDD[3] = datt.num[0];

TXDD[4] = datt.num[1];

TXDD[5] = datt.num[2];

TXDD[6] = datt.num[3];

aq = CRC16( TXDD,7);

mod_dat[7] =  aq/256;

    mod_dat[8] =  aq%256;

UART_TX(mod_dat);          //数据发送

}

/******************************发送函数*********************************************/

void UART_TX(unsigned char *p)

{   uchar i;

delay35_flag = 1;

TH0 = 0xf6;

TL0 = 0x06;

TR0 = 1;

delay35_end_flag = 1;

    while(delay35_end_flag == 1);   // 四个字节的时间结束 标志将发送一帧数据

TR0 = 0;

for(i=0;i<9;i++)

{ SBUF0 = *p;

while(!TI0);

TI0 = 0;

p++;}

send_flag = 0;

Rdat_cnt = 0;

EN = 0;

RI0 = 0; REN0 = 1;}

/******************************串口中断******************************************/

void UART0_ISR(void) interrupt 4

{if(RI0 == 1)

{mod_dat[Rdat_cnt] = SBUF0;

jiaoyanceshi[Rdat_cnt] = mod_dat[Rdat_cnt];

Rdat_cnt++;

 if(mod_dat[0]==0x02)

  {RI0 = 0;

TH0 = 0xe3;           // Reinit Timer0 High register

TL0 = 0xc0;            // Reinit Timer0 Low register

DATrrupt_15_cnt = 0;

DATrrupt_15_flag = 1;    /1.5个字节在1200bps的条件下,用时10ms

TR0 = 1;}

else

{Rdat_cnt=0;

RI0 = 0;

 }}}

void Timer0_ISR (void) interrupt 1

{ if(DATrrupt_15_flag == 1)

   {REN0 = 0;

DATrrupt_15_flag = 0;                                                                                          

send_flag = 1;    

TR0 = 0;               //定时器0 中断一次停止一次

   }

   if(delay35_flag == 1)

   { delay35_cnt++;

TH0 = 0xf6;           // Reinit Timer0 High register

TL0 = 0x06;            // Reinit Timer0 Low register

TR0 = 1;

if(delay35_cnt == 7)

{delay35_flag = 0;

delay35_end_flag = 0;

TR0 = 0;               //定时器0 中断一次停止一次

}}}

void main()

{ SYSCLK_Init();

O_Init();

UART0_Init ();

intT0();

intad0();

ADC0MD |= 0x82;   //使能AD0  并置于空闲模式 无校准

EN = 0;

Rdat_cnt = 0;

RI0 = 0;

REN0 = 1;

while(1)

{ while(AD0INT ==0);

ada = ADC0H;

ada <<= 16;

ada +=  ((long)ADC0M<<8) +  (long)ADC0L;

datt.a = 128 * ada;

ADC0MD |= 0x82;   /// 使能AD0  并置于单次转换模式 无校准

AD0INT = 0;

if(send_flag == 1)

{ if(mod_dat[1]==0x03)

{EN = 1;

dat_packing();}

else

{ RI0 = 0;      //接收完成标志位清零

REN0 = 1;    //启动接收       

send_flag = 0;  // 发送标志清零 禁止执行发送程序

Rdat_cnt = 0;

} }}}

void intT0()                                      //定时器0 起初是禁止运行的

 {  TH0 = 0XE7;           // TH0 = 0XEC;            // Init Timer0 High register

    TL0 = 0X12;           // TL0 = 0X0E ;           // Init Timer0 Low register

    TMOD |= 0x01;                                   // Timer0 in 16-bit mode

    CKCON |= 0x02;                                  // Timer0 uses a 1:48 prescaler

    ET0 = 1;                                        // Timer0 interrupt enabled

    TCON |= 0x10;                                   // Timer0 OFF

    TR0 = 0;}

#include <C8051F350.h>        // 包含C8051f410单片机特殊寄存器

#include<externn.h>

//高位字节表/* Table of CRC values for high-order byte */

static unsigned char code  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

} ;

//低位字节表/* Table of CRC values for low-order byte */

static char code 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

} ;//CRC产生的功能

unsigned short CRC16(unsigned char *puchMsg , unsigned short usDataLen)

{/*按信息的字节数计算CRC *//* quantity of bytes in message */

unsigned char uchCRCHi = 0xFF ; /* 初始化高字节*/

unsigned char uchCRCLo = 0xFF ; /* 初始化低字节*/

unsigned uIndex ; /*把CRC表*/

long mm=0;

while (usDataLen--) /*通过数据缓冲器*/

{

uIndex = uchCRCHi ^ *puchMsg++ ; /*计算CRC */

uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;

uchCRCLo = auchCRCLo[uIndex] ;

}

 mm = uchCRCHi;

 mm<<=8;

 mm|= uchCRCLo;

return mm ;

}

#include <C8051F350.h>        // 包含C8051f410单片机特殊寄存器

#include<externn.h>

#define SYSCLK       24500000          // SYSCLK frequency in Hz

#define MDCLK         2457600          // Modulator clock in Hz (ideal is

#define OWR                20          // Desired Output Word Rate in Hz

sfr16 ADC0DEC = 0x9A;                  // ADC0 Decimation Ratio Register

void intad0()

{

   REF0CN |= 0x03;

   ADC0MUX = 0x08;

   ADC0CF = 0x00;    ////使用:SINC3滤波器 中断AD0 使AD0INT置 1 ;使用内部电压基准

   ADC0CN = 0x00;    //放大倍数 1倍;单极性工作方式; Burnout电流源未被使能。

   ADC0BUF = 0x00;   //高低输入缓冲器的设置

ADC0CLK = (SYSCLK/MDCLK)-1;

ADC0DEC = ((unsigned long) MDCLK / (unsigned long) OWR /(unsigned long) 128) - 1;

   ADC0MD = 0x81;

   while(AD0CALC == 0)  {}

   ADC0MD |= 0x80;   /// 使能AD0  并置于空闲模式 无校准

}

相关推荐