使用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)
|