作者cnyug (羽仔)
看板Electronics
标题Re: [问题] 我的8051开机会闪一闪...
时间Sat Feb 21 20:19:39 2009
: 看到这问题,我只想请问你。
: 你程式写了吗?
: 如果写了你闪led灯是HI动作还是LOW动作呢?
: 你有量过开机时LED脚位那边电压状态吗?
: 你只给接好图。没有线路图,如何请更强的高手帮助呢?
: MAX232插拔有时会传送讯号,所以真不知道你原本LED灯是什麽情况下该闪。
: 而且做电灯电视开关不是会用继电器做?否则110V交流电。如何用5V的MCU控制?
: 亲身碰到有时看动作状态有时也不一定知道是什麽问题。
: 大多只能提供方向。
#include<reg51.h>
#include<stdio.h>
#define uchar unsigned char
sbit wled = P3^2;
sbit rel01 = P1^0;
sbit rel02 = P1^1;
sbit rel03 = P1^2;
sbit rel04 = P1^3;
sbit rel05 = P1^4;
sbit rel06 = P1^5;
sbit rel07 = P1^6;
sbit rel08 = P1^7;
sbit rel09 = P0^0;
sbit rel10 = P0^1;
sbit rel11 = P0^2;
sbit rel12 = P0^3;
sbit rel13 = P0^4;
sbit rel14 = P0^5;
sbit rel15 = P0^6;
sbit rel16 = P0^7;
sbit rel17 = P2^7;
sbit rel18 = P2^6;
sbit rel19 = P2^5;
sbit rel20 = P2^4;
sbit rel21 = P2^3;
sbit rel22 = P2^2;
sbit rel23 = P2^1;
sbit rel24 = P2^0;
delay(int count)
{
int i,j;
for(i=0;i<count;i++)
for(j=0;j<200;j++);
}
led_bl()
{
int i;
for(i=0;i<1;i++)
{
wled = 0; delay(10);
wled = 1; delay(10);
}
}
init_rs232()
{
SCON=0x50;
TMOD=0x20;
TH1=0xFD;
TR1=1;
TI=1;
}
tx_char(uchar c)
{
while(1)if(T1)break;
TI=0;
SBUF=c;
}
tx_str(char *str)
{
do{tx_char(*str++);}
while(*str!='\0');
}
char rx_char()
{
while(1)if(RI)break;
RI=0;
//wled = 0; delay(5);
//wled = 1; delay(0);
return SBUF;
}
main()
{
uchar mn;
led_bl();
init_rs232();
delay(200);
mn = '0';
/*
P2=0;
switch(P2)
{
case 0 : mn='0';break;
case 1 : mn='1';break;
case 2 : mn='2';break;
case 3 : mn='3';break;
case 4 : mn='4';break;
case 5 : mn='5';break;
case 6 : mn='6';break;
case 7 : mn='7';break;
case 8 : mn='8';break;
case 9 : mn='9';break;
case 10 : mn='a';break;
case 11 : mn='b';break;
case 12 : mn='c';break;
case 13 : mn='d';break;
case 14 : mn='e';break;
case 15 : mn='f';break;
case 16 : mn='g';break;
}
*/
printf("This machine is \"%c\"", mn);printf("\n");
while(1)
{
int i;
uchar command[4];
led_bl();
for(i=0;i<4;i++)
{
command[i]=rx_char();
}
if(command[0]==mn)//机器组
{
if(command[1]=='d')
{
switch(command[2])
{
case 'A':rel01 = 0; break;
case 'a':rel01 = 1; break;
case 'B':rel02 = 0; break;
case 'b':rel02 = 1; break;
case 'C':rel03 = 0; break;
case 'c':rel03 = 1; break;
case 'D':rel04 = 0; break;
case 'd':rel04 = 1; break;
case 'E':rel05 = 0; break;
case 'e':rel05 = 1; break;
case 'F':rel06 = 0; break;
case 'f':rel06 = 1; break;
case 'G':rel07 = 0; break;
case 'g':rel07 = 1; break;
case 'H':rel08 = 0; break;
case 'h':rel08 = 1; break;
case 'I':rel09 = 0; break;
case 'i':rel09 = 1; break;
case 'J':rel10 = 0; break;
case 'j':rel10 = 1; break;
case 'K':rel11 = 0; break;
case 'k':rel11 = 1; break;
case 'L':rel12 = 0; break;
case 'l':rel12 = 1; break;
case 'M':rel13 = 0; break;
case 'm':rel13 = 1; break;
case 'N':rel14 = 0; break;
case 'n':rel14 = 1; break;
case 'O':rel15 = 0; break;
case 'o':rel15 = 1; break;
case 'P':rel16 = 0; break;
case 'p':rel16 = 1; break;
case 'Q':rel17 = 0; break;
case 'q':rel17 = 1; break;
case 'R':rel18 = 0; break;
case 'r':rel18 = 1; break;
case 'S':rel19 = 0; break;
case 's':rel19 = 1; break;
case 'T':rel20 = 0; break;
case 't':rel20 = 1; break;
case 'U':rel21 = 0; break;
case 'u':rel21 = 1; break;
case 'V':rel22 = 0; break;
case 'v':rel22 = 1; break;
case 'W':rel23 = 0; break;
case 'w':rel23 = 1; break;
case 'X':rel24 = 0; break;
case 'x':rel24 = 1; break;
case 'Z':P0=0x00;P2=0x00;P1=0x00;break;
case 'z':P0=0xFF;P2=0xFF;P1=0xFF;break;
default: printf("Command miss");printf("\n");
}
}
else
{
printf("Command miss");printf("\n");
}
}
else
{
printf("Command miss");printf("\n");
}
}
我不知道我的做法会不会佷奇怪...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.152.161.22
1F:→ rickhsu:我记得旗标的8051彻底研究那几本书内有一章是在说类似 02/21 21:44
2F:→ rickhsu:的问题...如果排除是软体而是硬体线路问题建议去翻翻看... 02/21 21:45
3F:→ rickhsu:如果误动作会伤亡的那种建议还是从线路上搞定比较安心... 02/21 21:48
4F:→ cnyug:我有到网上到处翻, 但是好像其他人都没问题... 02/21 23:06
5F:→ cnyug:我现在连用电晶体转rs232跟TTL都试过了, 关机很久後也是会.. 02/21 23:08
6F:→ narcissusli:我到觉得先看硬体 02/21 23:26
7F:→ cnyug:用stc的mcu没有问题了,应该是刚开机电压还未去到高电位,谢谢 02/23 00:14