使用Proteus 8 Professional/Keil uVision5。
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //ADC0832引腳定義
- sbit CS = P1^4;
- sbit CLK = P1^5;
- sbit DIO = P1^6;
- sbit External_Opto = P1^3;//外部光控制
- sbit Lamp = P2^0;//燈光控制
- sbit K1 = P3^7;//外部聲音模擬控制
- //延時
- void DelayMS(uint x)
- {
- uchar t;
- while(x--) for(t = 0;t<120;t++);
- }
- //獲取A/D轉換結果(0通道)
- uchar Get_AD_Result()
- {
- uchar i,dat1 = 0,dat2 = 0;
- //起始控制位
- CS = 0;
- CLK = 0;
- DIO = 1; _nop_(); _nop_();
- CLK = 1; _nop_(); _nop_();
- //第一個下降沿之前,設DI=1/0
- //選擇單端/差分(SGL/DIF)模式中的單端輸入模式
- CLK = 0; DIO = 1; _nop_(); _nop_();
- CLK = 1; _nop_(); _nop_();
- //第二個下降沿之前,設DI=1/0,選擇CH0/CH1
- CLK = 0; DIO = 0; _nop_(); _nop_();
- CLK = 1; DIO = 1; _nop_(); _nop_();
- //第三個下降沿之前,設DI=1
- CLK = 0; DIO = 1; _nop_(); _nop_();
- //第4~11,共八個下降沿讀數據(MSB->LSB)
- for(i = 0;i < 8; i++)
- {
- CLK = 1; _nop_(); _nop_();
- CLK =0; _nop_(); _nop_();
- dat1 = dat1 << 1 |DIO;
- }
- //第11~18,共八個下降沿讀數據(LSB->MSB)
- for(i = 0;i < 8; i++)
- {
-
- dat2 = dat2 | ( (uchar) (DIO) << i );
- CLK = 1; _nop_(); _nop_();
- CLK = 0; _nop_(); _nop_();
- }
- CS = 1;
- //如果MSB->LSB和LSB->MSB讀取的結果相同,則返回讀取的結果,否則返回0
- return (dat1 == dat2) ? dat1 : 0;
- }
- //主程序
- void main()
- {
- Lamp = 0;
- while(1)
- {
- //出現聲音但沒有光照時照明設備點亮后延時關閉
- if ( K1 == 0 && External_Opto!= 0)
- {
- while (K1 == 0);
- Lamp = 1;
- DelayMS(100);
- //延時時間由模數轉換結果決定
- DelayMS(30 * Get_AD_Result());
- DelayMS(100);
- Lamp = 0;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
照明控制.rar
(14.29 KB, 下載次數: 55)
2018-12-3 18:06 上傳
點擊文件名下載附件
|