参考郭天祥C51单片机教程!
如果感兴趣,请参考!
1、仿真时需要使用串口调试助手(网上随便下一个)
2、需要一个虚拟串口Configure Virtual Serial Port Driver软件
3、仿真时单片机晶振频率一定设置为11.0592MHZ
4、COMPIM(9针串口)器件的波特率以及串口号需要设定好
5、仿真串口时MAX232就不需要了
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机+ADC0804源程序如下:
- #include<reg52.h>
- #include"stdio.h"
- #include"intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 flag_uart,flag_time,flag_on,t0_num,a,ad_val,flag;
- float ad_vo;
- sbit adwr=P3^6;
- sbit adrd=P3^7;
- sbit csad=P3^0;
- u8 code distab[]={
- 0xc0,0xF9,0xA4,0xB0,0x99,
- 0x92,0x82,0xF8,0x80,0x90,
- 0x88,0x83,0xC6,0xA1,0x86,
- 0x8E,0xFF,0x0C,0x89,0x7F,0xBF};
- void delayms(u8 xms)
- {
- u16 i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void init()
- {
- TMOD=0X21;
- SCON=0x50; //串口模式1,允许接收
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- TH1=0xfd; //波特率 9600
- TL1=0xfd;
- PCON=0x00; //波特率不倍增
- EA=1; //开总中断
- ES=1; //开串口中断
- ET0=1; //开定时器中断
- TR1=1; //启动定时器1
- // SM0=1;
- // SM1=1;
- // REN=1;
- }
- void display(u8 vaule)
- {
- u8 bai,shi,ge;
- bai=vaule/100;
- shi=vaule%100/10;
- ge=vaule%10;
- P0=distab[bai];
- P2=0x01;
- delayms(5);
- P0=0xff;
- P0=distab[shi];
- P2=0x02;
- delayms(5);
- P0=0xff;
- P0=distab[ge];
- P2=0x04;
- delayms(5);
- P0=0xff;
- }
- u8 get_adc()
- {
- u8 adval;
- adwr=1;
- _nop_();
- adwr=0;
- _nop_();
- adwr=1;
- P1=0xff; //读P1口前其他全给1先
- adrd=1; //选通ADSC
- _nop_();
- adrd=0; //A/D读使能
- _nop_();
- adval=P1; //AD读数据赋给P1口
- adrd=1;
- return adval;
- }
- void main()
- {
- init();
- while(1)
- {
- if(flag_uart==1)
- {
- flag_uart=0;
- ES=0; //关串口中断
- TI=1; //发送中断标志位
- switch(flag_on)
- {
- case 0: puts("Turn on ad!\n");
- TR0=1;
- break;
- case 1: printf("Turn oFF ad!\n");
- TR0=0;
- break;
- case 2: puts("Error!\n");
- break;
- }
- while(!TI);
- TI=0;
- ES=1;
- }
- if(flag_time==1)
- {
- flag_time=0;
- ad_val=get_adc();
- ad_vo=(float)ad_val*5.0/256.0;
- ES=0;
- TI=1;
- printf("The voltage is %fV\n",ad_vo);
- while(!TI);
- TI=0;
- ES=1;
- }
- display(ad_val);
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- t0_num++;
- if(t0_num==20)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
6.6.1.rar
(67 KB, 下载次数: 123)
|