
#include <reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
uchar temp,buf,m,count;
bit playflag=0;
uchar code cdis1[ ] = {" SERILA TRANFER "};
uchar code cdis2[ ] = {" "};
/
延时子程序
/
char code SST516[3] _at_ 0x003b;
void delay1(uint ms)
{
uchar k;
while(ms--)
{
for(k = 0; k < 120; k++);
}
}
//
/ /
/检查LCD忙状态 /
/lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 /
/ /
//
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
//
/ /
/写指令数据到LCD /
/RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /
/ /
//
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
//
/ /
/写显示数据到LCD /
/RS=H,RW=L,E=高脉冲,D0-D7=数据。 /
/ /
//
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
//
/ /
/ LCD初始化设定 /
/ /
//
void lcd_init()
{
delay1(15);
lcd_wcmd(0x01); //清除LCD的显示内容
lcd_wcmd(0x38); //162显示,57点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c); //开显示,显示光标,光标闪烁
delay1(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay1(5);
}
//
/ /
/ 设定显示位置 /
/ /
//
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/
发送数据函数
/
void senddata(uchar dat)
{
SBUF =dat;
while(!TI);
TI = 0;
}
/
串行中断服务函数
/
void serial() interrupt 4
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
buf = SBUF; //从串口缓冲区取得数据
playflag=1;
switch(buf)
{
case 0x31: senddata('X');break; //接受到1,发送字符'W'给计算机
case 0x32: senddata('L');break; //接受到2,发送字符'I'给计算机
case 0x33: senddata('1');break; //接受到3,发送字符'L'给计算机
case 0x34: senddata('0');break; //接受到4,发送字符'L'给计算机
case 0x35: senddata('0');break; //接受到5,发送字符'A'给计算机
case 0x36: senddata('0');break; //接受到5,发送字符'R'给计算机
default: senddata(buf);break; //接受到其它数据,将其发送给计算机
}
if(buf!=0x0D)
{
if(buf!=0x0A)
{
temp =buf;
if(count<16)
{
RXDdata[count]=temp;
count++;
}
}
}
ES = 1; //允许串口中断
}
/
数据显示函数
/
void play()
{
if(playflag)
{
lcd_pos(0x40); //设置位置为第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]); //清LCD1602第二行
for(m=0;m<16;m++)
{
lcd_pos(0x40+m); //设置显示位置为第二行
lcd_wdat(RXDdata[m]); //显示字符
}
playflag=0;
count=0x00;
for(m=0;m<16;m++)
RXDdata[m]=0x20; //清显存单元
}
}
/
主函数
/
void main(void)
{
P0 = 0xff;
P2 = 0xff;
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES = 1; //允许串口中断
TL1=0xf3;
TH1=0xf3; //波特率2400
TR1=1;
lcd_init();
lcd_pos(0x00); //设置显示位置为第一行
for(m=0;m<16;m++)
lcd_wdat(cdis1[m]); //显示字符
lcd_pos(0x40); //设置显示位置为第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]); //显示字符
while(1)
{
play();
}
}
这个串口通信程序在我的开发版上已经全部验证通过,你可以根据实际,攸 改里面某些参数,满足你自己的需要就行。
比如你你点亮小灯,这部分你只可在相应位置添加代码即可。单片机都是51的。
其中1602的显示程序是用来验证是否通信成功,这部分你可作为参考。这部分你大可用小灯显示程序来替代。
[摘 要]本文介绍了一种基于STC89C52单片机的电能表数据采集系统,实现了从老式电能表以脉冲采集的方式读取电量并按通讯规约传输给采集终端,研究了从老电表到新电表的改进设计,给出了电能表数据采集器的总体构思和软硬件设计,达到了实时时钟、数据存取和掉电数据保护等功能,解决了从老式电表到新式电表的改装问题,增强了新式电能表的性能,成为一套旧表改进设计的低成本的优良方案。
[关键词]电表改造 数据通讯 数据采集 数据存取
[中图分类号]F42[文献标识码]A[文章编号]1007-9416(2010)02-0102-02
目前很多小区用户已经改装了新式电能表,新式电能表较老式电能表有一定的优点。这种新式电能表一般是通过脉冲计数的方式来获得用户用电量,然后将电量按通讯规约远程传输到采集终端,实现了自动抄表功能,与老式电能表相比,降低了人工抄表在读取和记录电表数据过程中的误差率,在一定程度上提高了电力部门的管理效率和减少了抄表费用,同时也给居民带来了方便。但改装新式电能表的费用相对比较高,给用户带来了额外的费用,因此为了充分利用原有的老式电表并达到减少改装费用的目的,设计了基于STC89C52单片机的电能表数据采集器,该采集器可以同时对14户居民的用电量进行计量,然后将用电量远程传输到数据采集终端,达到了现代新式电表的功能需求。
1 设计要求
随着电子科技的进步,电能表设计也在不断的更新发展,为了满足用户和电力部门的需求,设计了数据采集器,它的主要功能有六点:(1)最少支持14路脉冲数据同时采集;(2)能够准确采集到一定范围内的不同宽度的脉冲个数;(3)可以将所有的数据存储到超大容量的非易失性铁片存储器中;(4)具有掉电保护设计,(5)通过485口将数据传递给采集终端,实现数据的通信;(6)通过指令可以对电表数据的设置、修改和校正;数据采集器采集来自多路分线连接的电表信号并进行数据处理、存储,通过远程串口通讯将数据传输于采集终端,再由采集终端将数据发送给计算机。设计结构图如图1所示,
从设计结构图来看,在每个楼盘都可以放置一个数据采集器,来读取14户居民的用电量,每个数据采集器都可以对电量数据进行存储和处理。根据不同指令发送用户的电量到采集终端,再由采集终端把数据传输给控制中心,完成整个电表自动读取功能。
2 系统硬件电路设计
电能表数据采集器的硬件电路设计包括脉冲采集电路、时钟电路、外部存储电路、掉电保护电路、电源电路和485串口通信电路。硬件设计框架如图2:
数据采集器的硬件电路设计主要有4个部分:
21 脉冲采集
脉冲采集模块的硬件设计根据系统的设计要求,每个采集模块完成14个电表的采集任务,需要占用单片机的 14个 I/O接口。单个经过光电隔离的脉冲数据采集电路如图3所示
老式电能表如DS(T)72输出的脉冲信号幅值是12V±5%或24V±5%,脉冲宽度初始值为80ms ±20%,如果电表输出的脉冲信号在不处理的情况下,将脉冲输出端口直接与单片机I/O口相连,一定会将I/O口损坏,因此系统对脉冲采集设计了处理电路。图中R5为限流电阻,来保护U1光耦中的发光二极管。C1、C2和R4组成RC低通滤波器,D2为钳位二极管,处理尖峰类的干扰信号。R1和R2为分压电阻。 R3为上拉电阻,起限流作用。
22 时钟电路
该采集器不仅要满足在特定时间对用电数据的存储还要让采集终端可以通过指令读取或修改某一时间段的电量,因此该采集器采用DS1337串行实时时钟芯片为数据采集器设计了一个时钟电路,该芯片能提供秒、分、时、日、星期、月和年等信息,保证了系统时间的准确性。
23 数据通讯
数据采集器的数据通讯包括2个部分:①数据存取模块,根据电量管理要求,数据采集器应对14户居民用电量进行每时、每天、每月、每年的存储,并要求达到两年的数据存储功能,这就要求采集器采用较大存储容量的外部存储器。本系统选用了铁电存储器FM1608,该存储器掉电后数据不丢失,读写速度快,读写次数达到100亿次、存储时间10年,存储容量大,完全满足设计需求。②数据传输模块,数据采集器具有1个RS232通讯接口和1个MAX485通讯接口,RS232主要用于数据采集器程序下载。MAX485主要用于数据采集器与采集终端的数据通讯。MAX485是一种串行接口标准,它以差分平衡方式传输信号,它具有抑制共模干扰的能力,加上接收器具有高的灵敏度,能检测低达200mV的电压,故数据传输可达千米以外。
24 掉电保护电路
掉电保护分为电源监视和数据存储两部分。为了实现对掉电的过程控制,系统必须有监视电源变化的能力。在本系统中采用芯片MAX813L,做电源低电压检测。具体如图4所示。
MAX813L内部有一个独立的掉电比较器。合理选择 R1和 R2的值,在掉电的瞬间,通过R1和R2的值可以计算出此时PFI引脚的电压,当PFI输入电压低于125V,则/PFO输出低电平,此时单片机就会进入外部中断0服务子程序,将当前所有电表的电量和脉冲个数保存到FM1608中,以免掉电时丢失。 基于掉电保护硬件电路设计,完成了掉电时的数据保护,待恢复供电后继续进行脉冲计量。
3 系统软件部分设计
系统的软件设计主要有以下几个部分:
31 脉冲采集模块的软件设计
脉冲采集的软件设计主要处理脉冲的准确采样,对当前时段的数据做累计处理。软件设计中包括了重复检测及防抖动的抗干扰设计。软件设计流程图如图5所示。
32 铁电存储器读写
铁电存储器FM1608是并口 *** 作存储器,通过工业标准并行接口进行访问, FRAM的内存功能 *** 作与SRAM器件类似,唯一区别就是在开始每一个内存周期前FM1608需要一个/CE的下降沿以锁存地址信息。根据实际要求对14户的用电量进行每小时的存储,如果不分区存储这些数据,将导致电表数据在 *** 作和读取上的不方便,所以系统将FM1608的地址划分为五个部分,如表1:
电表数据与时间是一一对应,第一部分是专门为每次掉电时所存储的有效数据区。其他四个部分是对14个脉冲表的固定时段存储。依据FM1608的读写 *** 作时序图实现了数据的存储和读取,
33 中断程序
系统采用了两个中断服务程序,一是串口中断,串口中断子程序主要是用来接收采集终端的指令和发送电表数据,采集器接收到的每条指令都进行校验比较,如果指令正确,则根据指令要求采集器对电表进行参数修改或者发送电表数据。否则数据采集器则不响应,丢弃当前指令等待新指令。二是掉电外部中断,掉电外部中断子程序主要实现采集器在掉电的瞬间对当前电量和脉冲个数的存储,确保再次供电时电表数据的连续性和准确性。两个中断流程图如图6所示:
通过多次测试,串口中断服务子程序能很好的进行指令的校验和比较,根据采集终端的指令可以对14块电表的任何一块进行参数的设定,或读取用户的用电量。掉电中断服务子程序在掉电瞬间也实现了有效数据的存储,降低了数据采集的误差率。
4 结语
基于STC89S52的数据采集器的设计,从根本上解决了旧表改装问题,融入了自动抄表系统,实现了14户电表的电量的自动读取,在这个系统设计中用到了并行的铁电存储器和长距离串口数据传输的MAX485,充分发挥了系统的低功耗、低成本、高速度、高质量的特点。在系统软件设计方面,按照安徽省电力公司单相多费率电能表通信规约,采用中断方式完成了数据采集和数据传输。该系统在信息传输的安全性、准确性和实时性、可靠性方面都达到了较高要求,经测试没有出现脉冲丢失、干扰误差现象。
[参考文献]
[1] 胡汉才单片机原理及其接口技术北京:清华大学出版社,2003
[2] 21IC中国电子网 >
________________________________________
DS18B20、 DS1822 “一线总线”数字化温度传感器是DALLAS最新单线数字温度传感器, 同DS1820一样,DS18B20也 支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±05°C。DS1822的精度较差为± 2°C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,与前一代产品不同,新的产品支持3V~55V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。
DS18B20可以程序设定9~12位的分辨率,精度为±05°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20的内部结构
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下:
15元/只
DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以00625℃/LSB形式表达,其中S为符号位。
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于00625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于00625即可得到实际温度。
例如+125℃的数字输出为07D0H,+250625℃的数字输出为0191H,-250625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。
该字节各位的意义如下:
TM R1 R0 1 1 1 1 1
低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)
分辨率设置表:
R1 R0 分辨率 温度最大转换时间
0 0 9位 9375ms
0 1 10位 1875ms
1 0 11位 375ms
1 1 12位 750ms
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的 *** 作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
DS1820使用中注意事项
DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
(1)较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS1820 *** 作部分最好采用汇编语言实现。
(2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
(3)连接DS1820的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
(4)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。
测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。
本站实验板实验程序:
;这是关于DS18B20的读写程序,数据脚P22,晶振12MHZ
;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;可以将检测到的温度直接显示到AT89C51开发实验板的两个数码管上
;显示温度00到99度,很准确哦~~无需校正!
ORG 0000H
;单片机内存分配申明!
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
MAIN:
LCALL GET_TEMPER;调用读温度子程序
;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为00625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
MOV A,29H
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY;调用数码管显示子程序
CPL P10
AJMP MAIN
; 这是DS18B20复位初始化子程序
INIT_1820:
SETB P35
NOP
CLR P35
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P35;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P35,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
CLR P17;检查到DS18B20就点亮P17LED
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
CLR P11;点亮P1。1脚LED表示温度传感器通信失败
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB P35
RET
; 读出转换后的温度值
GET_TEMPER:
SETB P35
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
CLR P12
RET ; 判断DS1820是否存在若DS18B20不存在则返回
TSS2:
CLR P13;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL DISPLAY
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到35H/36H
CLR P14
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR P35
MOV R3,#6
DJNZ R3,$
RRC A
MOV P35,C
MOV R3,#23
DJNZ R3,$
SETB P35
NOP
DJNZ R2,WR1
SETB P35
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有8位
RE01:
CLR C
SETB P35
NOP
NOP
CLR P35
NOP
NOP
NOP
SETB P35
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,P35
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;显示子程序
display: mov a,29H;将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示1000次
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p20 ;开个位显示
acall d1ms ;显示1ms
setb p20
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p21 ;开十位显示
acall d1ms ;显示1ms
setb p21
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
ret
;1MS延时(按12MHZ算)
D1MS: MOV R7,#80
DJNZ R7,$
RET
;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0F3H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
end
以下是第二种采集和处理程序供网友参考
;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;将温度数据通过串口发送出去,波特率2400
;本程序专为AT89C51实验开发板编写适合12晶振
;本程序经过验证,可以显示温度+/-和两位整数温度和两位小数温度数据
DOT EQU 30H
ZHENGSHU EQU 31H
FLAG1 EQU 38H ;是否检测到DS18B20的标志位
;定义温度数据
DIS_1 EQU 32H ;符号
DIS_2 EQU 33H ;十位
DIS_3 EQU 34H ;个位
DIS_4 EQU 35H ;小数点后第一位
DIS_5 EQU 36H ;小数点后第二位
WDDATA BIT P22 ;定义DS18B20的数据脚为P22端口
ORG 0000H
;以下为主程序进行CPU中断方式设置
CLR EA ;关闭总中断
MOV SCON,#50H ;设置成串口1方式
MOV TMOD,#20H ;波特率发生器T1工作在模式2上
MOV TH1,#0F3H ;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H ;预置初值(按照波特率2400BPS预置初值)
SETB TR1 ;启动定时器T1
;以上完成串口2400通讯初始化设置
;-------------------------
; 主程序
;-------------------------
MAIN:
LCALL INIT_1820 ;调用复位DS18B20子程序
MAIN1:
LCALL GET_TEMPER;调用读温度子程序
LCALL FORMULA ;通过公式计算,小数点后显示两位
LCALL BCD
LCALL DISPLAY ;调用串口显示子程序
LCALL DELAY500 ;延时05秒
LCALL DELAY500 ;延时05秒
LCALL DELAY500 ;延时05秒
AJMP MAIN1
;-------------------------
; DS18B20复位初始化程序
;-------------------------
INIT_1820:
SETB WDDATA
NOP
CLR WDDATA
;主机发出延时540微秒的复位低脉冲
MOV R0,#36
LCALL DELAY
SETB WDDATA;然后拉高数据线
NOP
NOP
MOV R0,#36
TSR2:
JNB WDDATA,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH
TSR6:
DJNZ R0,TSR6 ;复位成功!时序要求延时一段时间
TSR7:
SETB WDDATA
RET
;-------------------
; 读出转换后的温度值
;-------------------
GET_TEMPER:
SETB WDDATA ; 定时入口
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ; 判断DS1820是否存在若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
MOV R0,#50 ;等待AD转换结束,12位的话750微秒
LCALL DELAY
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的九个字节数据保存到60H-68H
RET
;----------------------------------
;写DS18B20的子程序(有具体的时序要求)
;----------------------------------
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C
WR1:
CLR WDDATA
MOV R3,#6
DJNZ R3,$
RRC A
MOV WDDATA,C
MOV R3,#24
DJNZ R3,$
SETB WDDATA
NOP
DJNZ R2,WR1
SETB WDDATA
RET
;--------------------------------------------------
; 读DS18B20的程序,从DS18B20中读出九个字节的数据
;--------------------------------------------------
READ_18200:
MOV R4,#9
MOV R1,#60H ; 存入60H开始的九个单元
RE00:
MOV R2,#8
RE01:
CLR C
SETB WDDATA
NOP
NOP
CLR WDDATA
NOP
NOP
NOP
SETB WDDATA
MOV R3,#09
RE10:
DJNZ R3,RE10
MOV C,WDDATA
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;------------------------
;温度计算子程序
;------------------------
FORMULA: ; 按公式:T实际=(T整数-025)+( M每度-M剩余)/ M每度
;计算出实际温度,整数部分和小数部分分别存于ZHENGSHU单元和DOT单元
;将61H中的低4位移入60H中的高4位,得到温度的整数部分,并存于ZHENGSHU单元
MOV 29H,61H
MOV A,60H
MOV C,48H
RRC A
MOV C,49H
RRC A
MOV C,4AH
RRC A
MOV C,4BH
RRC A
MOV ZHENGSHU,A
; ( M每度-M剩余)/ M每度,小数值存于A中
MOV A,67h
SUBB A,66h
MOV B,#64H
MUL AB
MOV R4,B
MOV R5,A
MOV R7,67H
LCALL DIV457
MOV A,R3
;再减去025,实际应用中减去25
SUBB A,#19H
MOV DOT,A ;小数部分存于DOT中
MOV A,ZHENGSHU
SUBB A,#00H ;整数部分减去来自小数部分的借位
MOV ZHENGSHU,A
MOV C,4BH
JNC ZHENG ;是否为负数
CPL A
INC A
MOV DIS_1,#2DH ; 零度以下时,第一位显示"-"号
MOV ZHENGSHU,A
ZHENG:
MOV DIS_1,#2BH ; 零度以上时,第一位显示"+"号
RET
;------------------------
;双字节除以单字节子程序
;------------------------
DIV457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV ;商溢出
RET
DV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
;---------------------
;转换成非压缩的BCD码
;---------------------
BCD: MOV A,ZHENGSHU
MOV B,#0AH
DIV AB
ORL A,#00110000B ;转换成ASCII码
MOV DIS_2,A
MOV DIS_3,B
MOV A,DIS_3
ORL A,#00110000B ;转换成ASCII码
mov DIS_3,A
MOV A,DOT
MOV B,#0AH
DIV AB
ORL A,#00110000B ;转换成ASCII码
MOV DIS_4,A
MOV DIS_5,B
MOV A,DIS_5
ORL A,#00110000B ;转换成ASCII码
mov DIS_5,A
RET
;----------------------
;串口显示数据子程序
;----------------------
DISPLAY:
CLR TI
MOV A,DIS_1
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示+/-
CLR TI
MOV A,DIS_2
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示整数第一位
CLR TI
MOV A,DIS_3
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示整数第二位
CLR TI
MOV A,#2EH
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示小数点
CLR TI
MOV A,DIS_4
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示小数第一位
CLR TI
MOV A,DIS_5
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示小数第一位
CLR TI
MOV A,#0DH;换行
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示
CLR TI
MOV A,#0AH;换行
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示
RET
;----------------------
;延时子程序
;----------------------
;为保证DS18B20的严格I/O时序,需要做较精确的延时
;在DS18B20 *** 作中,用到的延时有15 μs,90 μs,270 μs,540 μs
;因这些延时均为15 μs的整数倍,因此可编写一个DELAY15(n)函数
DELAY: ;1105962M晶振
LOOP: MOV R1,#06H
LOOP1: DJNZ R1,LOOP1
DJNZ R0,LOOP
RET
;500毫秒延时子程序,占用R4、R5
DELAY500:MOV R4,#248
DA222:MOV R5,#248
DJNZ R5,$
DJNZ R4,DA222
RET
END
有两个办法,一个是labview自带的事件产生机制,在serial模块里面有范例,这里不说了。另一个是调用windows自带的mscomm32ocx控件——控件里面就封装好了事件结构,调用后在labview程序里添加注册事件,至于回调函数,labview都会将基本模板编好给你完善。——缺点有两个,一个是传递给回调的参数很局限,另一个是涉及多实例多线程的编程就会出bug。而且XP之后,有一些windows版本都没有自带这个控件,得自己下载再去手动注册。——如果真想用中断,最好的方法就是用C写个控件再导入。
单片机你在网上搜一下吧
如果想入门 最好去图书馆借点书看,比较难理解 祝好运了!!
我给你提供以下资料 是百度上找的。
概述
单片机是指一个集成在一块芯片上的完整计算机系统。尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
目录[隐藏]
单片机介绍
单片机的应用领域
学习应用六大重要部分
单片机学习
常用单片机芯片简介
从无线电世界到单片机世界
单片机攻击技术
单片机侵入型攻击的一般过程
单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
早期的单片机都是8位或4位的。其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。此后在8031上发展出了MCS51系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式 *** 作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux *** 作系统。
单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的数量还要多。
[编辑本段]单片机介绍
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可用它来做一些控制电器一类不是很复杂的工作足矣了。我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!它主要是作为控制部分的核心部件。
它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。
单片机是靠程序的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
由于单片机对成本是敏感的,所以目前占统治地位的软件还是最低级汇编语言,它是除了二进制机器码以上最低级的语言了,既然这么低级为什么还要用呢?很多高级的语言已经达到了可视化编程的水平为什么不用呢?原因很简单,就是单片机没有家用计算机那样的CPU,也没有像硬盘那样的海量存储设备。一个可视化高级语言编写的小程序里面即使只有一个按钮,也会达到几十K的尺寸!对于家用PC的硬盘来讲没什么,可是对于单片机来讲是不能接受的。 单片机在硬件资源方面的利用率必须很高才行,所以汇编虽然原始却还是在大量使用。一样的道理,如果把巨型计算机上的 *** 作系统和应用软件拿到家用PC上来运行,家用PC的也是承受不了的。
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
单片机历史
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
1SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。
2MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。
Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。
3单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。
[编辑本段]单片机的应用领域
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导d的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
1在智能仪器仪表上的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。
2在工业控制中的应用
用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
4在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
5单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
6在各种大型电器中的模块化应用
某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。如:音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。
在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。
7单片机在汽车设备领域中的应用
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器,GPS导航系统,abs防抱死系统,制动系统等等。
此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。
[编辑本段]学习应用六大重要部分
单片机学习应用的六大重要部分
一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。
二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的——数字,或者说都是一串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。指令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对应关系,不可以由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元可以由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由微处理机处理的对象,在各种不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:
1•地址(如MOV DPTR,1000H),即地址1000H送入DPTR。
2•方式字或控制字(如MOV TMOD,#3),3即是控制字。
3•常数(如MOV TH0,#10H)10H即定时常数。
4•实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则执行指令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实际输出的值。
理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指令来执行了。
三、P0口、P2口和P3的第二功能用法:初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间要有一个切换的过程,或者说要有一条指令,事实上,各端口的第二功能完全是自动的,不需要用指令来转换。如P36、P37分别是WR、RD信号,当微片理机外接RAM或有外部I/O口时,它们被用作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从P36或P37送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能’而是(使用者)‘不会’将其作为通用I/O口使用。你完全可以在指令中按排一条SETB P37的指令,并且当单片机执行到这条指令时,也会使P37变为高电平,但使用者不会这么去做,因为这通常会导致系统的崩溃。
四、程序的执行过程: 单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000’,所以程序总是从‘0000’单元开始执行,也就是说:在系统的ROM中一定要存在‘0000’这个单元,并且在‘0000’单元中存放的一定是一条指令。
五、堆栈: 堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的一部份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且堆栈有特殊的数据传输指令,即‘PUSH’和‘POP’,有一个特殊的专为其服务的单元,即堆栈指针SP,每当执一次PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原来值的基础上)自动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOV SP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的混乱。不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。
六、单片机的开发过程: 这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好硬件,下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确定了。然后用文本编辑器(如EDIT、CCED等)编写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简单的程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后,就可以写片(将程序固化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够识别这种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举一例说明:
单片机试验板ORG 0000H
LJMP START
ORG 040H
START:
MOV SP,#5FH ;设堆栈
LOOP:
NOP
LJMP LOOP ;循环
END ;结束
[编辑本段]单片机学习
目前,很多人对汇编语言并不认可。可以说,掌握用C语言单片机编程很重要,可以大大提高开发的效率。不过初学者可以不了解单片机的汇编语言,但一定要了解单片机具体性能和特点,不然在单片机领域是比较致命的。如果不考虑单片机硬件资源,在KEIL中用C胡乱编程,结果只能是出了问题无法解决!可以肯定的说,最好的C语言单片机工程师都是从汇编走出来的编程者因为单片机的C语言虽然是高级语言,但是它不同于台式机个人电脑上的VC++什么的单片机的硬件资源不是非常强大,不同于我们用VC、VB等高级语言在台式PC上写程序毕竟台式电脑的硬件非常强大,所以才可以不考虑硬件资源的问题。还有就是在单片机编程中C语言虽然编程方便,便于人们阅读,但是在执行效率上是要比汇编语言低10%到20%,所以用什么语言编写程序是要看具体用在什么场合下。总是来说做单片机编程要灵活使用汇编语言与C语言,让单片机的强大功能以最高是效率展示给用户。
以8051单片机为例讲解单片机的引脚及相关功能;
《单片机引脚图》
40个引脚按引脚功能大致可分为4个种类:电源、时钟、控制和I/O引脚。
⒈ 电源:
⑴ VCC - 芯片电源,接+5V;
⑵ VSS - 接地端;
注:用万用表测试单片机引脚电压一般为0v或者5v,这是标准的TTL电平。但有时候在单片机程序正在工作时候测试结果并不是这个值而是介于0v-5v之间,其实这是万用表的响应速度没这么快而已,在某一个瞬间单片机引脚电压仍保持在0v或者5v。
⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。
⒊ 控制线:控制线共有4根,
⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲
① ALE功能:用来锁存P0口送出的低8位地址
② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵ PSEN:外ROM读选通信号。
⑶ RST/VPD:复位/备用电源。
① RST(Reset)功能:复位信号输入端。
② VPD功能:在Vcc掉电情况下,接备用电源。
⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。
① EA功能:内外ROM选择端。
② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋ I/O线
80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)
5 P3口第二功能
P30 RXD 串行输入口
P31 TXD 串行输出口
P32 INT0 外部中断0(低电平有效)
P33 INT1 外部中断1(低电平有效)
P34 T0 定时计数器0
P35 T1 定时计数器1
P36 WR 外部数据存储器写选通(低电平有效)
P37 RD 外部数据存储器读选通(低电平有效)
[编辑本段]常用单片机芯片简介
STC单片机
STC公司的单片机主要是基于8051内核,是新一代增强型单片机,指令代码完全兼容传统8051,速度快8~12倍,带ADC,4路PWM,双串口,有全球唯一ID号,加密性好,抗干扰强
PIC单片机:
是MICROCHIP公司的产品,其突出的特点是体积小,功耗低,精简指令集,抗干扰性好,可靠性高,有较强的模拟接口,代码保密性好,大部分芯片有其兼容的FLASH程序存储器的芯片
EMC单片机:
是台湾义隆公司的产品,有很大一部分与PIC 8位单片机兼容,且相兼容产品的资源相对比PIC的多,价格便宜,有很多系列可选,但抗干扰较差
ATMEL单片机(51单片机):
ATMEl公司的8位单片机有AT89、AT90两个系列,AT89系列是8位Flash单片机,与8051系列单片机相兼容,静态时钟模式;AT90系列单片机是增强RISC结构、全静态工作方式、内载在线可编程Flash的单片机,也叫AVR单片机
PHLIPIS 51PLC系列单片机(51单片机):
PHILIPS公司的单片机是基于80C51内核的单片机,嵌入了掉电检测、模拟以及片内RC振荡器等功能,这使51LPC在高集成度、低成本、低功耗的应用设计中可以满足多方面的性能要求
HOLTEK单片机:
台湾盛扬半导体的单片机,价格便宜,种类较多,但抗干扰较差,适用于消费类产品
TI公司单片机(51单片机):
德州仪器提供了TMS370和MSP430两大系列通用单片机TMS370系列单片机是8位CMOS单片机,具有多种存储模式、多种外围接口模式,适用于复杂的实时控制场合;MSP430系列单片机是一种超低功耗、功能集成度较高的16位低功耗单片机,特别适用于要求功耗低的场合
松翰单片机(SONIX):
是台湾松翰公司的单片,大多为8位机,有一部分与PIC 8位单片机兼容,价格便宜,系统时钟分频可选项较多,有PMW ADC 内振 内部杂讯滤波。缺点RAM空间过小,抗干扰较好。
[编辑本段]从无线电世界到单片机世界
现代计算机技术的产业革命,将世界经济从资本经济带入到知识经济时代。在电子世界领域,从20世纪中的无线电时代也进入到21世纪以计算机技术为中心的智能化现代电子系统时代。现代电子系统的基本核心是嵌入式计算机系统(简称嵌入式系统),而单片机是最典型、最广泛、最普及的嵌入式系统。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
以上就是关于高分求51单片机串口通信的程序全部的内容,包括:高分求51单片机串口通信的程序、什么是数据采集器_电能表数据采集器的设计与应用、MOV P1,#21H MOV R3,#10 MOV R4,#10 LCALL DISPLAY LJMP MAIN DISPLAY:MOV A,R3 MOV B,#0AH DIV AB等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)