51对于继电器的控制,只用高低电平就可以了。关键是,你在明晌你的程序里要有一个判断子程序,判断单片机从PC机(通过RS485)穿过来的谨贺是什么数据,从而对单片机的某位置位或者复位。比如:你可以用一个if语句,如果收到的数据时11111,在置位,如果收到的数据时00000,则复位,相应的继激晌锋电器就会动作了。
创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都网站设计、华州网络推广、微信小程序、华州网络营销、华州企业策划、华州品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供华州建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
没有芯片和设备,所以程序没调,有问题可以再q我。
光敏传感器是个检测设备,你要怎么控制它。
#includestc15f2kxx.h
#define u16 unsigned int
#define u8 unsigned char
sbit PHOTORESISTOR=P3^7;
sbit RELAY=P3^6;
sbit BEEP=P4^5;
u8 ds[8]={0,1,2,3,4,5,6,7,}; //数码管显示缓存
u8 smg_zt=1;
//共阳
code u8 w[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; //位码
code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,};//断码
void dispaly(){//显示函数
static u8 a;
if(++a=8)a=0;
P0=0xff;
P2=w[a];
P0=d[ds[a]];
}
/*
//共阴
code u8 w[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80,}; //位码
code u8 d[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,0x00,};//断码
void dispaly(){//显示函数
static u8 a;
if(++a=8)a=0;
P0=0x00;
P2=w[a];
P0=d[ds[a]];
}
*/
#define UART_RX_SIZE 30
u8 uartRx_buf[UART_RX_SIZE];
u8 uartRx_count=0;
u8 uartRx_outtime=0;
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数搜陵团据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR = 0xFE; //串口1选择定时器1为波特率发生器
TMOD = 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE0; //设定定时初值
TH1 = 0xFE; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void Send_byte(u8 val){
SBUF=val;
while(!TI);
TI=0;
}
void Send_Uart(u8 *p,u8 size){
while(size--0){
Send_byte(*p);
p++;
}
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD = 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时世橘初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void IO_Init(){
P0M1=0x00;//P0口和P2口设为强推挽输出
P0M0=0xff;
P2M1=0x00;
P2M0=0xff;
}
void init() //初始化函数
{
IO_Init();
UartInit();
Timer0Init();
}
//判断两个字符串是否相等
u8 puanduan(u8 *p,u8 size,u8 *pp){
u8 i;
for(i=0;pp[i]!=0;i++){
if(i=size)return 0;
if(p[i]!=pp[i])return 0;
}
return 1;
}
//串口解析程序
void UART_Protocol(){
if(uartRx_outtime=10汪郑uartRx_count=3){
if(puanduan(uartRx_buf,uartRx_count,"lightsensor:on")!=0){
}else if(puanduan(uartRx_buf,uartRx_count,"lightsensor:off")!=0){
}else if(puanduan(uartRx_buf,uartRx_count,"digital:on")!=0){
smg_zt=1;
}else if(puanduan(uartRx_buf,uartRx_count,"digital:off")!=0){
smg_zt=0;
}else if(puanduan(uartRx_buf,uartRx_count,"relay:on")!=0){
RELAY=0;
}else if(puanduan(uartRx_buf,uartRx_count,"relay:off")!=0){
RELAY=1;
}else if(puanduan(uartRx_buf,uartRx_count,"beep:on")!=0){
BEEP=1;
}else if(puanduan(uartRx_buf,uartRx_count,"beep:off")!=0){
}
uartRx_count=0;
}
}
void main()//主函数
{
u8 i;
init();
while(1){
UART_Protocol();
if(smg_zt==1){
for(i=0;i8;i++)ds[i]=i;
}else {
for(i=0;i8;i++)ds[i]=10;
}
}
}
void timer0() interrupt 1//定时器,实现倒计时
{
dispaly();
if(++uartRx_outtime=100){
uartRx_outtime=0;
uartRx_count=0;
}
}
void uart0() interrupt 4
{
if(RI){
u8 t=SBUF;RI=0;
uartRx_outtime=0;
if(uartRx_countUART_RX_SIZE){
uartRx_buf[uartRx_count++]=t;
}
}
}
#includereg52.h
#define uchar unsigned char
#define uint unsigned int
uchar Count = 0; //20ms计数
uchar SecCount = 0; // 1m计数
sbit DELAY = P2^0; //P20引脚控制继电器
/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器的初始化,11.0592MZ晶振,50ms
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init()
{
TMOD = 0x01;
IE = 0x82;
TH0 = 0x4c;
TL0 = 0x00;
TR0 = 1;
}
/********************************************************************
* 名称 : Time0_Int()
* 功闷乎能 : 定时器中断,中断中实现 Count 加一
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Int() interrupt 1
{
TH0 = 0x4c;
TL0 = 0x00;
Count++;
if(Count == 20)//中断20次,等于1s
{
Count = 0;
SecCount ++; //秒数加1
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入纤信 : 无
* 输出 : 无
***********************************************************************/
void main()
{
RELAY = 1; //上电使继电器处于关闭状态.图中的8550三极管,低电平时为继电器打开,高电平关闭.
Time0_Init(); //定时器初始化
while(1)
{
if(SecCount == 120) //当蚂竖悉SecCount等于120秒时
{
RELAY = ~RELAY; //继电器状态取反,原本关闭的打开,
}
}
}