1.png (89.54 KB, 下載次數(shù): 58)
下載附件
2021-10-22 17:23 上傳
- #include<intrins.h>
- #include<reg51.h>
- #define uchar unsigned char
- #define nop _nop_()
- code uchar seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90};
- uchar cp1,cp2,dat_ad;
- sbit CS = P3^0;
- sbit CLK = P3^1;
- sbit DIDO = P3^2;
- /*對(duì)ADC0832初始化處理*/
- void adc0832_init(void)
- {
- CS = 1;nop;
- CLK = 1;
- CS = 0;
- }
- /*對(duì)轉(zhuǎn)換ch0通道的模擬信號(hào)*/
- uchar adc0832_ch0(void)
- {
- uchar dat1,i;
- adc0832_init();
- DIDO = 1;CLK = 0;nop;CLK = 1;nop; //第一個(gè)下降沿,DI必須為高電平,表示啟始信號(hào)
- DIDO = 1;CLK = 0;/*這里是第二個(gè)下降沿*/nop;CLK = 1;nop; //第二個(gè)下降沿
- DIDO = 0;CLK = 0;/*這里是第三個(gè)下降沿*/nop;CLK = 1;nop; //第三個(gè)下降沿,發(fā)送1,0;選擇通道ch0
- DIDO = 1; //釋放總線
- /*上面都是配置位,達(dá)到了啟動(dòng)并選擇通道0的作用*/
- for(i = 0;i<8;i++) //第4個(gè)下降沿到第11個(gè)下降沿
- {
- CLK = 0;nop; //
- if(DIDO)dat1 = dat1|0x01; //最低位置1(與特定數(shù)字按位或的作用,可以達(dá)到控制指定位而其他位不變)
- //注意dat1是MCU中的數(shù)據(jù)嗷,ADC發(fā)送的是DIDO
- CLK = 1;nop; //這個(gè)CLK是單片機(jī)發(fā)給ADC的,因此在一個(gè)上升沿之間還可以處理一些程序。注意上面的這個(gè)IF語(yǔ)句是由MCU處理的啊!
- dat1 = dat1<<1; //左移,低位填充0,依次輸出最高位
- //DIDO每發(fā)送一位,MCU中的dat1變化一位。8位完成后即dat1返回
- }
- return(dat1); //返回的是數(shù)模轉(zhuǎn)換的值
- CS = 1;
- }
- void timer0_init() //中斷初始化函數(shù)
- {
- TMOD = 0x01;
- TL0 = 0x78;
- TH0 = 0xec;
- EA = 1;
- TR0 = 1;
- ET0 = 1;
- }
- void timer0_isr()interrupt 1 //中斷服務(wù)函數(shù)
- {
- TL0 = 0x78;
- TH0 = 0xec;
- cp1++;
- if(cp1>100) //0.5s
- {
- cp1 = 0;
- dat_ad=adc0832_ch0(); //adc0832轉(zhuǎn)換一次
- }
- P0 = 0xff; //消隱
- switch(cp2)
- {
- case 0:P0 = seven_seg[dat_ad%10];P2 = 0x01;break;
- case 1:P0 = seven_seg[dat_ad%100/10];P2 = 0x02;break;
- case 2:P0 = seven_seg[dat_ad/100];P2 = 0x04;break;
- }
- cp2++;
- if(cp2>=3)
- cp2 = 0;
- }
- void main()
- {
- timer0_init();
- adc0832_init();
- while(1);
- }
復(fù)制代碼
|