|
程序中,也有一些我自己寫的注解,仿真圖的畫法不是那么標(biāo)準(zhǔn),但是不影響仿真效果,親測。
本人水平有限,如有錯(cuò)誤的地方,希望大家指出,謝謝了
有圖有真相:程序 圖
程序.png (88.86 KB, 下載次數(shù): 63)
下載附件
2018-12-7 18:58 上傳
仿真 圖
仿真.png (77.87 KB, 下載次數(shù): 59)
下載附件
2018-12-7 18:59 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- typedef unsigned long uint32;
- sbit ADDRC = P1^0;
- sbit ADDRB = P1^1;
- sbit ADDRA = P1^2;//控制138譯碼器的三個(gè)引腳
- sbit I2C_SDA = P2^1;
- sbit I2C_SCL = P2^0;//I2C通信的兩個(gè)引腳
- bit flag_300ms = 0;//300ms時(shí)間標(biāo)志位
- uint8 T0RH = 0;//定時(shí)器高8位初值
- uint8 T0RL = 0;//定時(shí)器低8位初值
- uint8 AD_value = 0;//AD值
- uint8 code led_char[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//LED段碼
- void config_timer0(uint8 ms);
- uint8 get_ADC_vaule(uint8 chn);
- void main()
- {
- config_timer0(1);//初始化通用定時(shí)器0,定時(shí)1ms
- while(1)
- {
- if(flag_300ms == 1) //判斷300ms時(shí)間是否到了
- {
- flag_300ms = 0;//清除標(biāo)志位
- AD_value = get_ADC_vaule(0);//讀取通道0的AD值
- }
- }
- }
- void I2C_delay()//I2C延時(shí)函數(shù)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void I2C_start()//I2C起始信號(hào)
- {
- I2C_SDA = 1;
- I2C_SCL = 1;
- I2C_delay();
- I2C_SDA = 0;
- I2C_delay();
- I2C_SCL = 0;
- I2C_delay();
- }
- void I2C_stop()//I2C停止信號(hào)
- {
- I2C_SDA = 0;
- I2C_SCL = 0;
- I2C_delay();
- I2C_SCL = 1;
- I2C_delay();
- I2C_SDA = 1;
- I2C_delay();
- }
- bit I2C_write(uint8 dat)//I2C寫一個(gè)字節(jié)
- {
- bit ack = 0;
- uint8 mask = 0;
- for(mask=0x80;mask!=0;mask>>=1)
- {
- if((mask&dat) == 0)
- I2C_SDA = 0;
- else
- I2C_SDA = 1;
- I2C_delay();
- I2C_SCL = 1;
- I2C_delay();
- I2C_SCL = 0;
- I2C_delay();
- }
- I2C_SDA = 1;
- I2C_delay();
- I2C_SCL = 1;
- I2C_delay();
- ack = I2C_SDA;
- I2C_delay();
- I2C_SCL = 0;
- I2C_delay();
-
- return (~ack);
- }
- uint8 I2C_read_ACK()//I2C讀一個(gè)字節(jié),并發(fā)送應(yīng)答位
- {
- uint8 dat = 0;
- uint8 mask = 0;
- I2C_SDA = 1;
- for(mask=0x80;mask!=0;mask>>=1)
- {
- if(I2C_SDA == 0)
- dat = dat & (~mask);
- else
- dat = dat | mask;
- I2C_delay();
- I2C_SCL = 1;
- I2C_delay();
- I2C_SCL = 0;
- I2C_delay();
- }
- I2C_SDA = 0;
- I2C_delay();
- I2C_SCL = 1;
- I2C_delay();
- I2C_SCL = 0;
- I2C_delay();
- return dat;
- }
- uint8 I2C_read_NACK()//I2C讀一個(gè)字節(jié),并發(fā)送非應(yīng)答位
- {
- uint8 dat = 0;
- uint8 mask = 0;
- I2C_SDA = 1;
- for(mask=0x80;mask!=0;mask>>=1)
- {
- if(I2C_SDA == 0)
- dat = dat & (~mask);
- else
- dat = dat | mask;
- I2C_delay();
- I2C_SCL = 1;
- I2C_delay();
- I2C_SCL = 0;
- I2C_delay();
- }
- I2C_SDA = 1;
- I2C_delay();
- I2C_SCL = 1;
- I2C_delay();
- I2C_SCL = 0;
- I2C_delay();
- return dat;
- }
- uint8 get_ADC_vaule(uint8 chn)//獲取AD值
- {
- uint8 value = 0;
- I2C_start();//I2C起始信號(hào)
- if(!I2C_write(0X90))//寫入PCF8591地址及讀寫選擇位為寫
- {
- I2C_stop();
- return 0;
- }
- // I2C_write(0X40 | chn);//寫入PCF8591通道0
- I2C_write(0x00 | chn);//寫入PCF8591通道0
- I2C_start();//I2C起始信號(hào)
- I2C_write(0x48<<1 | 0x01);
- I2C_read_ACK();//提供轉(zhuǎn)換所需的時(shí)鐘信號(hào)
- value = I2C_read_NACK();//讀取上一次轉(zhuǎn)換的結(jié)果
- I2C_stop();//I2C結(jié)束信號(hào)
- return value;
- }
- void config_timer0(uint8 ms)//配置定時(shí)器0的通用函數(shù)
- {
- uint32 temp =0 ;
- temp = 11059200/12;
- temp = (temp * ms)/1000;
- temp = 65536 - (temp + 12);
- T0RH = (uint8)(temp >> 8);
- T0RL = (uint8)temp;
- TMOD = TMOD & 0XF0;
- TMOD = TMOD | 0X01;
- TH0 = T0RH;
- TL0 = T0RL;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void led_scan()//LED掃描函數(shù),每個(gè)1ms掃描一次
- {
- static uint8 index = 0;
- P0 = 0X00;
- switch(index)
- {
- case 0:ADDRC=1;ADDRB=1;ADDRA=1;P0=led_char[AD_value%10];break;
- case 1:ADDRC=1;ADDRB=1;ADDRA=0;P0=led_char[AD_value/10%10];break;
- case 2:ADDRC=1;ADDRB=0;ADDRA=1;P0=led_char[AD_value/100];break;
- default:break;
- }
- index++;
- if(index >= 3)
- {
- index = 0;
- }
- }
- void interrupt_timer0() interrupt 1//定時(shí)器0的中斷函數(shù)
- {
- static uint16 cnt = 0;
- TH0 = T0RH;
- TL0 = T0RL;
- led_scan();
- cnt++;
- if(cnt >= 300)
- {
- cnt = 0;
- flag_300ms = 1;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
數(shù)碼管顯示AD值.rar
(91.21 KB, 下載次數(shù): 144)
2018-12-7 19:02 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|