參考郭天祥C51單片機教程!
如果感興趣,請參考!
1、仿真時需要使用串口調試助手(網上隨便下一個)
2、需要一個虛擬串口Configure Virtual Serial Port Driver軟件
3、仿真時單片機晶振頻率一定設置為11.0592MHZ
4、COMPIM(9針串口)器件的波特率以及串口號需要設定好
5、仿真串口時MAX232就不需要了
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
2.JPG (175.19 KB, 下載次數: 67)
下載附件
2017-12-7 15:50 上傳
1.JPG (186.61 KB, 下載次數: 79)
下載附件
2017-12-7 15:49 上傳
單片機+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)
2017-12-7 15:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|