|
利用单片机 AT89S51 设计一个数字电压表, 能够测量 0-5V 之间的直流电压值, 四位数码显示。
近年来随着科技的飞速发展, 单片机的应用正在不断地走向深入, 同时带动 传统控制检测日新月益更新。 在实时检测和自动控制的单片机应用系统中, 单片机往往是作为一个核心部件来使用, 仅掌握单片机方面知识是不够的, 还应根据具体硬件结构, 以及针对具体应用对象特点的软件结合, 加以完善。 并且应该学会利用单片机 AT89S51 设计一个数字电压表, 能够精确测量 0-5V 之间的直流电压值, 并用四位数码显示电压值。“单片机原理及应用课程设计” 是电类专业的学科基础课, 它是继“汇编语言程序设计”、“微机原理与接口技术” 等课程之后开出的实践环节课程。
程序:
- #include <AT89X52.H>
- unsigned char code dispbitcode[]={0xfe, 0xfd, 0xfb, 0xf7,0xef, 0xdf, 0xbf, 0x7f} ;
- unsigned char code dispcode[]={0x3f, 0x06, 0x5b, 0x4f, 0x66,0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00} ;
- unsigned char dispbuf[8]={10, 10, 10, 10, 10, 0, 0, 0} ;
- unsigned char dispcount;
- unsigned char getdata;
- unsigned int temp;
- long int i;
- unsigned int R1;
- sbit ST=P3^0;
- sbit OE=P3^1;
- sbit EOC=P3^2;
- sbit CLK=P3^3;
- void main(void)
- {
- ST=0;
- OE=0;
- ET0=1;
- ET1=1;
- EA=1;
- TMOD=0x12;
- TH0=216;
- TL0=216;
- TH1=(65536-5000) /256;
- TL1=(65536-5000) %256;
- TR1=1;
- TR0=1;
- ST=1;
- ST=0;
- while(1)
- {
- if(EOC==1)
- {
- OE=1;
- getdata=P0;
- OE=0;
- i=getdata*196;
- dispbuf[5]=i/10000;
- i=i%10000;
- dispbuf[6]=i/1000;
- i=i%1000;
- dispbuf[7]=i/100;
- ST=1;
- ST=0;
- }
- }
- }
- void t0(void) interrupt 1 using 0 //定时器 0 中断服务
- {
- CLK=~CLK;
- }
- void t1(void) interrupt 3 using 0 //定时器 1 中断服务
- {
- TH1=(65536-6000) /256;
- TL1=(65536-6000) %256;
- P2=0xff;
- P1=dispcode[dispbuf[dispcount]];
- P2=dispbitcode[dispcount];
- if(dispcount==5)
- {
- P1=P1 | 0x80;
- }
- dispcount++;
- if(dispcount==8)
- {
- dispcount=0;
- }
- }
复制代码
通过对本设计的思考, 更加加深了对单片机的认识, 熟练了单片机的编程,更对当前的温度传感器有了更深刻的认识与了解, 但是由于此系统依赖温度传感器, 因而对温度传感器的稳定性, 线性等诸多方面有着严格的要求, 然而, 传感器的性能越好, 相对而言其价格也就越高, 因而在此设计中, 在温度传感器的应用问题上我个人觉的还是存在遗憾, 其次, 由于采用了汇编语言, 所以其编程过程复杂不易查错。 最后由于时间紧迫, 本设计还有诸多地方令人不是很满意。
|