002利用Intel公司的8051单片机设计电话记费系统.docVIP

  • 2
  • 0
  • 约5.57千字
  • 约 13页
  • 2017-08-27 发布于广东
  • 举报

002利用Intel公司的8051单片机设计电话记费系统.doc

前言 目前,随着通信事业的发展及人们生活水平的提高,手机、小灵通各种先进的通信设备纷纷涌现,并愈来愈普及。但固定电话面对如此冲击,并未退出历史舞台,而因其信号强的固有优势,走进了各家各户。 电话机用户数以亿计,计费依据来自电信局交换机给出的清单。清单方式是准确的,但电话机用户并不能及时方便地看到费用清单。各类卡式电话机可以实时显示计费,但却不宜进入家庭。各种常见的LED公用电话计费器,则不能较好适应有时会发生变化的电话费率。如果能向家庭内的电表、水表、气表一样,能有一款家庭型的电话计费器,将会给人们的生活带来许多方便。用户可以在打完一次电话后方便地查看话单信息及一段时间内的话费累计总额。 本文就是针对这一现状,具体介绍了基于Intel 8051单片机的电话计费器的设计及其工作原理,并简单穿插了该计费器的使用及可完成的功能。该计费器具有如下特点: 可自动识别所拨号码,实现自动计费; 可自动实现全价和折价的转换; 计费准确,可方便地查询话单信息; 具有可配置性,可通过按键重新设置时间、日期、费率等参数; 成本低,功耗小。 软件部分采用C语言进行程序设计,运算速度快,编译效率高,有良好的可移植性,而且可直接实现对系统硬件的控制。 目录 电话计费器系统简介 系统中主要芯片介绍 2.1 Intel 8051单片机 2.2 专用键盘/显示器接口芯片8279 2.3 实时时钟日历芯片MC146818 系统的硬件设计及原理 系统的软件设计 4.1 Keil 编译器简介 4.2设计思路 4.3 程序设计 4.3 程序设计 void rMC(void) /*读时标*/ { uchar i; do{ ACC=MCA;} while(cflag);/*判UIP位,UIP=0时,读出的时钟日历字节有效*/ for(i=0;i6;i++) dt[i]=*(addr+at[i]); //读时标寄存器到缓冲区 } void disp(d) /*显示*/ uchar idata *d; { uchar i; COM=0x90; for(i=0;i16;i++) { COM=i+0x80; DAT=table[*d]; d++; } } void time_disp() /*时间显示*/ { uchar i,j=0; rMC(); for(i=0;i6;i++) { diss[j]=dt[i]/10;j++; diss[j]=dt[i]%10;j++; } disp(diss); } void timer0() interrupt 1 using 1 /*T/C0定时器中断服务程序*/ { P1_0=!P1_0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; } void counter1() interrupt 3 using 3 /*T/C1计数器中断服务程序*/ { rflag=1; sn++; } void int0() interrupt 0 using 0 /*外部中断0服务程序*/ { flag=1; TR0=0;TR1=0; //关闭T/C0,T/C1 } dltime() /*延时*/ { unsigned long i; for(i=0;i500000;i++) ; } void time_control() /*来电计时*/ { uchar idata diss[16]={10,10,10,10,10,10,10,10,10,10,10, 10,10,10,10,10,}; uchar min_1,min_0,sn_1,sn_0; sn=0; P1_0=1; //保证第一次反相便开始计数 TR0=1; //启动T/C0 TR1=1; //启动T/C1 for( ;;) { if(flag) { flag=0; break; } else { if(rflag) { min_1=sn/60/10; min_0=sn/60%10; sn_1=sn%60/10; sn_0=sn%60%10; diss[5]=min_1; diss[6]=min_0; diss[7]=11; diss[8]=sn_1; diss[9]=sn_0; disp(diss); rflag=0; } } } } uchar deky(void) /*判FIFO有键按下*/ { uchar k;

文档评论(0)

1亿VIP精品文档

相关文档