C语言进行单片机程序设计与应用

  • 格式:pdf
  • 大小:34.28 KB
  • 文档页数:4

用C语言进行单片机程序设计与应用刘莉明(天津商学院,天津300122)摘 要:文章写了C语言的主要特点,以及与汇编语言相比所具有的优点,通过编写的智能化温控表软件的源程序,可具体了解用C语言编写单片机程序的格式和规则,另外文章还阐述了智能化温控表的硬件特色。

关键词:C语言;E2PROM;D S18B20;X25045;A T89C51中图分类号:T P311 文献标识码:B 文章编号:100322029(2004)0120992041 引言C语言是一种通用的计算机程序设计语言,在国际上非常流行,它既可以用来编写计算机的系统程序,也可以用来编写一般的应用程序。

以前计算机的系统软件主要用汇编语言编写,单片机应用系统更是如此。

由于汇编语言程序的可读性和可移植性都较差,采用汇编语言编写单片机应用,不但周期长,而且调试和排错也比较困难,为了提高编制单片机应用程序的效率,改善程序的可读性和可移植性,采用高级语言无疑是一种最好的选择,C语言既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,表达和运算能力也较强,许多以前只能采用汇编语言来解决的问题都可以用C语言来解决。

基于C语言的特点,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。

笔者最近开发的智能化温控表的软件就是用C语言编写的。

本文重点介绍智能化温控表系统的设计和智能化温控表软件的设计。

2 智能化温控表的系统设计笔者采用A T89C51,X25045和DB18B20成功的研制了智能化温控表。

该表不仅能实现温度控制,还可实现多点远距离测温,其测温范围为-30~+收稿日期:200320621290℃,控温范围为-30~+30℃,精度均可达到011℃。

该温控表可用于任何需要测量温度和控制温度的地方,如用在工业控温方面,用在海洋测温方面等等。

(1)温控表工作原理:温控表主要由单片机、X25045和D S18B20组成。

其源程序存在A T89C51的FLA SH中,用户所设置的温度值存在X25045的E2PROM中,从DB18B20中取所测温度的串行码,通过转换成相应的温度值显示出来。

其主要原理图如图1。

(2)温控表的使用:该智能化温控表的面板图如图2。

在面板数码管下面有3个灯,分别为显示温度灯,温度上限灯和温度下限灯,在面板左上方有2个灯,分别为工作灯和电源灯。

面板上还有3个触摸按键,分别为功能转换键、上调键和下调键。

功能转换键用来进行显示温度和设置温度的转换,上调键和下调键分别用于设置温度值的调节。

(3)硬件组成及其它们的主要特征温控表的硬件组成主要有A T89C51、X25045和D S18B20,它们的主要特征分别简述如下: a1A T89C51单片机:A T89C51单片机由美国的A tm el公司制造的,为标准的40引脚双列直插式集成电路芯片,其管脚引法完全同M CS-51。

它的主要特征为:①闪速式存储器4KB。

②内存储器128B。

③工作频率24M H z。

④4个8位I O口。

⑤2个16位定时器计数器。

⑥中断源5个。

⑦1个全双工串行口。

其中闪速式存储器可允许1000次重复编程擦写。

第23卷 第1期2004年3月 海 洋 技 术O CEAN T ECHNOLO GYV o l123,N o11M arch,2004图1 主要原理图图2 智能化温控表的面板图 b 1X 25045芯片:X 25045芯片是具有I C 接口的E 2PROM 器件。

它的主要特征为:①E 2PROM 4KB 。

②1个看门狗计时器。

③时钟频率1M H z 。

④具有电源变动的保护功能。

⑤具有块锁定的功能。

⑥在E 2PROM 中存放的数据可保持100a 。

⑦它的复位电平为高电平。

c .D S 18B 20智能温度传感器:由DALLA S 公司生产的D S 18B 20不是一般温度传感器,它是一个智能化温度传感器,可以把所测的温度直接变成串行码来传送。

该种传感器分为A ,B ,C ,D 4个等级,这4个等级所传送的二制位数分别为9,10,11和12位,对应的温度分辩率为015℃、0125℃、01125℃和010625℃。

我们这里用的是D 等级,温度分辩率为010625℃,它传送的二进制位如下所示:L S B yte232221202-12-22-32-4M S B yteSSSSS262524它的主要特征:(1)电源和信号传输只用一根线,又称一线制。

(2)每个传感器都有自己的序列号,因此多个传感器可以共用一根传输线和单片机相连。

(3)电源范围为310~515V 。

(4)测量范围为-30~80℃。

(5)温度分辩率分4个等级,分别为015℃、0125℃、01125℃和010625℃。

(6)用户可通过命令字在D S 18B 20中设置温度上下限报警值。

3 智能化温控表软件设计温控表的软件主要由3部分组成,这3部分为初始化、主函数和若干个子函数组成。

在初始化部分主要包括全局变量定义和子函数说明,若干个子函数主要由X 25045操作功能函数、D S 18B 20的读写函数和定时器0的中断函数等组成。

源程序用C 语言编写。

在下边的源程序中简要介绍初始化部分、主函数部分和子函数部分,因篇幅所限,在这里主要介绍有关A T 89C 51单片机对X 25045芯片的读写内容。

用C 语言编写的源程序:初始化#include <reg 511h >#include <stdi o 1h >typ edef un signed char uchar ;typ edef un signed in t u in t ;01 海 洋 技 术 第23卷定义变量u in t data set1,u in t data set2;温度上、下限值uchar data h1,uchar data l1;温度上限高8位、低8位uchar data h2,uchar data l2;温度下限高8位、低8位sb it onoff=P2^7,sb it shangx ing=P2^6, sb it x iax ing=P2^5;功能选择、上调、下调sb it DQ=P3^7,uchar data get[2];D S18B20串行口、D S18B20读数uchar data u,sb it JDQ=P2^0;按键功能选择、继电器控制口sb it SO=P3^3,sb it S I=P3^5;X25045输出、输入sb it SCK=P3^2,sb it CS=P3^4;X25045时钟、X25045片选uchar code W R EN_I N ST=0X06;写使能(W R EN)uchar code W R SR_I N ST=0X01;写状态寄存器(W R SR)uchar code RD SR_I N ST=0X05;读状态寄存器(RD SR)uchar code W R IT E_I N ST=0X02;写存储器(W R IT E)uchar code R EAD_I N ST=0X03;读存储器(R EAD)uchar code STA TU S_R EG=0X00;设置状态寄存器uchar code M A X_POLL=0X99;设置最大写入时间子函数说明vo id w ren_c m d(vo id);写使能函数vo id w rsr_c m d(vo id);复位时间位和数据保护位写入状态寄存器uchar rdsr_c m d(vo id);读状态寄存器函数vo id byte_w rite(u in t dd,uchar aa);字节写入,aa为写入的数据,dd为写入的地址uchar byte_read(u in t dd);字节读出,dd为读出的地址,返回读出的数据vo id ou tbyt(uchar aa);输出一个字节到X25045中,不包括先导字等uchar inp u tbyt();由X25045输入一个字节,不包括先导字等额外的东西vo id w i p_po ll(vo id);检查写入过程是否结束vo id resetdog();复位看门狗函数主函数m ain(){w ren_c m d();w rsr_c m d();h1=byte_read(0x0027);l1=byte_read (0x0026);h2=byte_read(0x0025);l2=byte_read (0x0024);从X25045中读取温度上、下限值EA=1;set1=((u in t)h1)<<8ß(u in t)l1; set2=((u in t)h2)<<8ß(u in t)l2;do{onoff=1;shangx ing=1;x iax ing=1;if(onoff==0){u=u<<1;}resetdog();s w itch(u){case0x02:设置温度上限值if(shangx ing==0)++set1;if(x iax ing== 0)--set1;;b reak;case0x04:设置温度下限值if(shangx ing==0)++set2;if(x iax ing== 0)--set2;b reak;case0x08:保存温度上、下限值u=0x01;h1=(uchar)(set1>>8);l1=(uchar)set1;h2=(uchar)(set2>>8);l2=(uchar)set2;EA=0;byte_w rite(0x0027,h1);byte_w rite (0x0026,l1);byte_w rite(0x0025,h2);byte_w rite(0x0024, l2);b reak;case0x01:读取D S18B20R所测温度值EA=0;ow_reset();w rite_byte(0xbe);fo r(g=0;g<2;g++){get[g]=read_byte ();}EA=1;zhenfu=(get[1]&0xf8)>>3;fu =get[0]&0x0f;tem p=zheng+fu;if(tem p<set2)JDQ=0;if(tem p>set1)JDQ =1;b reak;}resetdog();}w h ile(1);}子函数vo id w ren_c m d(vo id)写使能函数101 第1期 刘莉明:用C语言进行单片机程序设计与应用 {uchar aa;SCK=0;CS=0;aa=W R EN_ I N ST;ou tbyt(aa);Send W R EN in structi on SCK=0;CS=1;}vo id w rsr_c m d(vo id)写状态寄存器函数{uchar aa;w ren_c m d();SCK=0;CS=0;aa=W R SR_I N ST;ou tbyt (aa);Send W R SR in structi onaa=STA TU S_R EG;ou tbyt(aa);Send statu s registerSCK=0;CS=1;w i p_po ll();}Po ll fo r com p leti on of w rite cycleuchar rdsr_c m d(vo id)读状态寄存器函数,读出的数据放入到aa中{uchar aa;SCK=0;CS=0;aa=RD SR_I N ST; ou tbyt(aa);aa=inp u tbyt();SCK=0;CS=1;retu rn aa;}uchar byte_read(dd)字节读出函数u in t dd;{uchar tem p4;uchar cc;SCK=0;CS=0; tem p4=((uchar)(0xff00&dd)>>8)<<3;ou tbyt(tem p4ßR EAD_I N ST);ou tbyt ((uchar)(0x00ff&dd));cc=inp u tbyt();SCK=0;CS=1;retu rn cc;} vo id byte_w rite(dd,ee)字节写入函数u in t dd;uchar ee;{uchar tem p4;w ren_c m d();if(dog1== 10){SCK=0;CS=0;tem p4=((uchar) (0xff00&dd&&ee1==40)>>8)<<3;ou tbyt(tem p4ßW R IT E_I N ST);ou tbyt ((uchar)(0x00ff&dd));ou tbyt(ee);SCK=0; CS=1;w i p_po ll();}}vo id w i p_po ll(vo id)检测写入的过程是否结束函数{uchar aa;uchar idata m y_flag;fo r(aa=1;aa <M A X_POLL;aa++){m y_flag=rdsr_c m d();if((m y_ flag&0x01)==0){aa=M A X_POLL;}}}判断是否W IP=0,即判断是否写入过程已经结束,若结束就跳出,否则继续等待直到达到最大记数值vo id ou tbyt(aa)输出一个数据到X25045函数uchar aa;{uchar m y_flag1,i;fo r(i=0;i<8;i++){m y_flag1=aa;SCK =0;S I=((0x80&m y_flag1<<i)==0x80);SCK =1;}S I=0;}uchar inp u tbyt(vo id)从X25045中得到一个数据函数{uchar aa=0,m y_flag;char i;fo r(i=7;i>=0;i--){SCK=0;m y_flag =(uchar)(SO);SCK=1;aa=(aaß(m y_flag<<i));m y_flag=0x00;} retu rn aa;}vo id resetdog()复位看门狗函数{CS=0;CS=1;}参考文献:[1] 马忠梅1单片机的C语言应用程序设计[M]1北京:北京航空航天大学出版社1[2] 徐爱钧1单片机高级语言C51应用程序设计[M]1北京:电子工业出版社1201 海 洋 技 术 第23卷。