Ⅰ 璋佹湁鐢ㄥ崟鐗囨満鎺у埗浼犳劅鍣ㄧ浉鍏崇殑鐢佃矾锲俱佸疄渚嬶纴链濂芥槸绾㈠栥佹俯搴︽箍搴︽柟闱㈢殑锛屾湁镄勫彂涓涓
锘轰簬鍗旷墖链虹殑绾㈠栭庢墖阆ユ带
甯傚満涓婇攒鍞镄勫甫阆ユ带镄勯庢墖浠锋牸鏅阆嶆瘆杈冩槀璐碉纴濡傛灉鑳界敤鏅阃氱殑鐢佃嗙孩澶栫嚎阆ユ带鍣ㄦ潵阆ユ带椋庢墖璋冩。杞阃燂纴瀵逛簬DIY浠𨱒ヨ达纴涓崭絾鍙浠ヨ妭绾﹂噾阍憋纴杩桦彲浠ユ彁楂樿嚜宸辩殑锷ㄦ坠鑳藉姏锛屼綍涔愯屼笉涓哄憿锛
链鐢佃矾閲囩敤浠锋牸浣庡粔镄𪞝T89C2051鍗旷墖链轰负涓绘带CPU锛屼竴浣揿寲鎺ュ弹澶存帴鍙楅仴鎺у櫒SSA3010T鍙戝嚭镄勭紪镰侊纴阃丆PU瑙g爜钖庯纴CPU鎺у埗鐩稿簲镄勫崟鐗囨満锷ㄤ綔锛
鍏蜂綋镄勫师鐞嗗浘濡备笅锛
涓哄彊杩版柟渚胯捣瑙侊纴涓婂浘鍙鐢诲嚭浜哖3_3寮曡剼镄勭浉搴旇繛鎺ョ数璺锛岃缮链2涓鍙鎺ュ湪P3_0鍜孭3_5涓娿傚垎鍒鎺у埗椋庢墖镄勯珮銆佷腑銆佷绠妗c7娈靛叡阒虫暟镰佺℃樉绀虹浉搴旂殑妗f暟锛屽綋鎸変笅阆ユ带鍣ㄧ殑1銆2銆3阌锛屽垎鍒鏄剧ず1銆2銆3銆傛寜涓嬮仴鎺у櫒OFF阌涓嶆樉绀哄苟鍏抽棴椋庢墖镄勮繍琛岋紒
绾㈠栫嚎涓浣揿寲鎺ュ弹澶村紩鑴氩备笅锛
1涓篏ND2涓笃CC3涓箧ATA
SAA3010T鐢佃嗛仴鎺у櫒镄勬暟鎹镰佸艰〃濡备笅锛
*****************************************************
*[寮鍏砞55D2[闱欓煶]55D3
*[1]55AB[2]55AC[3]55AD[4]55B2
*[5]55B3[6]55B4[7]55B5[8]55CA
*[9]55CB[0]55AA[鍗/鍙宂55CC[璋冭皭]5554
*[鑺傜洰+]56AA[鑺傜洰-]56AB[寰璋+]56CD[寰璋-]56D2
*[阔抽噺+]552A[瀛桦偍]56CB[鍙锲滢55D5
*[阔抽噺-]552B[鐖卞ソ]55D4[瀹氭椂]56B4
*[瀵规瘆+]5552[镩插僵+]5532[浜搴+]5526[褰曞儚]564A
*[瀵规瘆-]5553[镩插僵-]5533[浜搴-]55D2[鐢佃哴5655
*****************************************************
C51鎺у埗绋嫔簭鍏蜂綋濡备笅锛
/*------------------------------------------------------------------------------------------------
链绋嫔簭閲囩敤SAA3010T鐢佃嗛仴鎺у櫒
鑻ユ病链塖AA3010T镄勯仴鎺у櫒锛岃昏呭彲銮风煡鐩稿簲镄勭紪镰侊纴
镟存敼CASE璇鍙ラ噷镄勭浉搴旂殑鏁版嵁锛屽嵆鍙锛
杩欓噷涓嶅湪鍙栾堪濡备綍銮风煡缂栫爜锛屾湜璇昏呰皡瑙o紒
--------------------------------------------------------------------------------------------------*/
#include<AT89x51.h>
staticunsignedchardataIRCode[3],IRCON,IRCON2;
staticunsignedchardataDT;
voidmain(void)
{
unsignedintde;
TMOD=0x01;//瀹氭椂鍣0鏂瑰纺1
EA=1;//鍏佽窝PU涓鏂
IT0=1;//INT0涓嬮檷娌挎湁鏁
EX0=1;//寮INT0涓鏂
P3_3=0x00;
P3_0=0x00;
P3_5=0x00;
P1=0Xc0;//涓婄数澶崭綅鏄剧ず钬0钬
do
{
for(de=0;de<8000;de++)
P3_6=1;//LED镣逛寒
for(de=0;de<8000;de++)
P3_6=0;//LED镡勭伃
if(DT)
{
EX0=0;//鍏抽棴澶栦腑鏂
for(de=0;de<30000;de++)//鎸夐敭鍊兼g‘钖庝细链変竴涓寤舵椂锛岄槻姝㈤吨澶嶆寜阌
P3_6=1;
for(de=0;de<30000;de++)
P3_6=0;
DT=0;
}
EX0=1;
}while(1);
}
//瀹氭椂鍣0涓鏂澶勭悊
voidtimeint(void)interrupt1using2
{
TH0=0xFC;//TH0=0XFC;TL0=0XE0
TL0=0xE0;//璁惧畾镞跺间负800us
if(IRCON<3)
{
if(IRCON2<8)//涓鏂涓娆¤讳竴娆¢仴鎺ф帴鏀跺ご镄勭姸镐,姣忎簩娆′负阆ユ带缂栫爜涓镄勪竴涓浣
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1;//姣忚讳竴娆℃斁鍏ュ彉閲忎腑镄勪簩杩涘埗镄勪竴涓浣嶏纴姣忔″乏绉讳竴浣
IRCode[IRCON]=IRCode[IRCON]|P3_2;//姣忓叓娆″~婊′竴涓瀛楄妭锛屼竴涓瀛楄妭瀛樻斁阆ユ带缂栫爜4涓浣
}
else
{
IRCON++;//濉婊′竴涓瀛楄妭锛屾寚钖戜笅涓涓鍙橀噺
IRCON2=0;//璁℃暟娓呴浂
}
}
else
{
TR0=0;//鍏抽棴瀹氭椂鍣
ET0=0;//瀹氭椂鍣0涓鏂鍏抽棴
if((IRCode[1]!=0xFF)&&(IRCode[2]!=0xFF))
{
if(IRCode[1]==0x55)
{
switch(IRCode[2])
{
case0xAB:P1=0Xf9;P3_3=0x01;P3_0=0x00;P3_5=0x00;DT=1;break;
case0xAC:P1=0Xa4;P3_0=0x01;P3_5=0x00;P3_3=0x00;DT=1;break;
case0xAD:P1=0Xb0;P3_5=0x01;P3_3=0x00;P3_0=0x00;DT=1;break;
case0xD2:P1=0xff;P3_3=0x00;P3_0=0x00;P3_5=0x00;DT=1;break;
default:break;
}//switch
}
}
}
}
//INT0涓鏂
voidINT0Fun(void)interrupt0using2
{
EX0=0;//澶栭儴涓鏂0鍏抽棴
ET0=1;//瀹氭椂鍣0涓鏂镓揿紑
TH0=0xFC;
TL0=0xE0;//璁惧畾镞跺间负800us
for(IRCON=0;IRCON<3;IRCON++)
IRCode[IRCON]=0;
IRCON=0;
IRCON2=0;//璁℃暟娓呴浂
TR0=1;//寮濮嬭℃暟
}
瀹炵墿锲剧墖濡备笅锛
镵鏄庣殑璇昏呭彲浠ュ啀澧炲姞鍑犱釜阌𨱒ヨ惧畾椋庢墖杩愯岀殑镞堕棿锛屾渶钖庢彁阅掑ぇ瀹朵竴镣癸细锲犳秹鍙娄简220V镄勯珮铡嬶纴镓浠ヤ竴瀹氲佹敞镒忎汉韬瀹夊叏锛侊紒锛
鍗旷墖链篊51鎺у埗绋嫔簭鍙傝冮壌鎴掍简纾佸姩锷涙槑娴╃珯闀跨殑锛屽啀姝ゆ繁琛ㄦ劅璋锛
Ⅱ 如何用单片机控制液晶显示器呀,怎么接线……
液晶显示器有字符型,如1602,这个液晶显示器目前是统一的,引脚和命令字都 是统一的。接线如下图所示
Ⅲ 镐ユ眰鍗旷墖链鸿捐″疄渚
#include 钬淜EY.H钬
void main( void )
{ P1_0 = 1; //浣滀负杈揿叆寮曡剼锛屽繀椤诲厛杈揿嚭楂樼数骞
while( 1 ) //姘歌繙涓虹湡锛屽嵆姝诲惊鐜
{ if( P1_0 == 0 ) //濡傛灉鎸夐敭锛屽垯涓轰绠鐢靛钩
{ keyPut( 6 ); //淇濆瓨鎸夐敭缂栧彿鍊间负鎸夐敭阒熷垪
while( P1_0 == 0 ); //濡傛灉涓鐩存寜镌阌锛屽垯涓嶅仠鍦版墽琛岃ュ惊鐜锛屽疄闄呮槸绛夊緟𨱒鹃敭
}
if( keyHit() != 0 ) //濡傛灉阒熷垪涓链夋寜阌
P2=Seg7Code[ keyGet() ]; //浠庨槦鍒椾腑鍙栧嚭鎸夐敭鍊硷纴骞舵樉绀哄湪鏁扮爜绠′笂
}
}
渚嬩簩锛氩湪渚嬩竴涓钥冭槛鎸夐敭20ms鎶栧姩闂棰樸
#include <at89x52.h>
#include 钬淜EY.H钬
void main( void )
{ P1_0 = 1; //浣滀负杈揿叆寮曡剼锛屽繀椤诲厛杈揿嚭楂樼数骞
while( 1 ) //姘歌繙涓虹湡锛屽嵆姝诲惊鐜
{ if( P1_0 == 0 ) //濡傛灉鎸夐敭锛屽垯涓轰绠鐢靛钩
{ delay20ms(); //寤舵椂20ms锛岃烦杩囨帴涓嬫姈锷
keyPut( 6 ); //淇濆瓨鎸夐敭缂栧彿鍊间负鎸夐敭阒熷垪
while( P1_0 == 0 ); //濡傛灉涓鐩存寜镌阌锛屽垯涓嶅仠鍦版墽琛岃ュ惊鐜锛屽疄闄呮槸绛夊緟𨱒鹃敭
delay20ms(); //寤舵椂20ms锛岃烦杩囨涧寮鎶栧姩
}
if( keyHit() != 0 ) //濡傛灉阒熷垪涓链夋寜阌
P2=Seg7Code[ keyGet() ]; //浠庨槦鍒椾腑鍙栧嚭鎸夐敭鍊硷纴骞舵樉绀哄湪鏁扮爜绠′笂
}
}
Ⅳ 大家帮忙找一些51单片机的基本C语言程序例子,最好带说明,谢啦
中断控制程序:
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED接口
//将计数器的二进制值用8个LED显示出来
uchar count;//计数器(存储中断次数)
void main(void)
{
count=0; //清零计数器
port_count=~count;//清零P2口
IT0=1; //INT0设为边沿触发方式�IT0=0则为电平触发方式
EX0=1; //开INT0中断
EA=1; //开系统中断
while(1); //等待中断处理
}
//INT0中断处理函数
void int0_interrupt() interrupt 0 //INT0中断号0
{
count++;
port_count=~count; //当达到255时,溢出,又从0开始
}
I/O控制程序:
#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判断移动方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水灯左移到第八位又移回来 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水灯右移到第1位又移回来 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}
串口通信程序:
主机程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的节点地址
#define COUNT 10 //发送缓冲区buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定义buffer
int pt; //设置指针
main()//////////////////////////////////////////发送程序
{
//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率发生器)/////////PCON缺省为0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;
///////////////发送地址帧
TB8=1; //地址帧标志
SBUF=NODE_ADDR; //发送目的节点地址
while(pt<COUNT); //等待发送完全部数据
while(1);//不执行任何操作
} //end main
/////发送完中断函数
void send()interrupt 4
{
TI=0; //清发送中断标志
if(pt<COUNT)
{
//发送一帧数据
TB8=0;//数据帧标志
SBUF=buffer[pt]; //启动发送
pt++;//指针指向下一单元
}
else
{
ES=0; //关串口中断
EA=0; //关系统中断
return; //若发送完则停止发送并返回
}
}
接收程序:
#include<reg52.h>
#define uchar unsigned char
#define NODE_ADDR 3 //本机节点地址
#define COUNT 10 //定义接收缓冲区buffer大小
uchar buffer[COUNT]; //定义buffer
int pt; //当前位置指针
void send_char_com(unsigned char ch); //向串口发送一个字符的函数声明
void delay(void);
main() ////////////////串行异步从机接收程序
{
PCON=0X00; //初始化串口和T1(波特率发生器)/////////PCON缺省为0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允许接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;
while(pt<COUNT); //等待接收地址帧和全部数据帧
delay() ;
//接收完后返回数据
SCON=0XC0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);
}
while(1);
} //end main
///////////串口接收中断函数
void receive()interrupt 4 using 3
{
RI=0; //清除接收中断标志
if(RB8==1) //地址帧
{//若为本机地址,则置SM2=0,以便接收数据
if(SBUF==NODE_ADDR)
{
SM2=0;
}
}
/////RB8=0,数据帧
else if(RB8==0)
{buffer[pt]=SBUF; //数据帧送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部数据帧,则通信结束;置SM2=1,准备下一次通信
}
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
///////////////////////////////////////////////////////////////////////////////////
void delay(void)
{uchar i=100;
while(i--);
}
Ⅳ 单片机中bit函数如何使用 在什么情况下使用 举个例子 如何使用 谢谢
1、可以作为参数传递:比如
uchar test(bit flag)
{
if(flag)
{//传递来的是1则返回3,否则返回2
return 3;
}
else
{
return 2;
}
}
main()
{
uchar x;
bit flag = 1;
x = test(falg);
}
2、可以作为函数的返回值
bit test1(uchar a,uchar b)
{
if(a>b)
{//如果a>b则返回真,否则返回假
return 1;
}
else
{
return 0;
}
}
main()
{
bit flag;
flag = test1(2,3);
}
C51中没有位变量指针一说,比如 bit *flag1;的定义就是非法的。除此之外使用中和其它类型没什么区别。
应用最多的情况:执行一个函数,只是想知道操作是否成功,这时就可以用bit变量作为返回值,这样占用资源少,判断起来也快。
当然,如果返回值是char型,判断速度上和bit型差不多,但如果是int型,由于是双字节,就要多花些时间了。
追问:
你做过595的程序吗 那里用一位数据线输出8位数据 就用到bit
bit a;
bit testbit(unsigned char a,char n)
{
if(((0x01<<n)&a)==0)
{
return 0;
}else
return 1;
}
Ⅵ 单片机的具体应用例子
1、节能控制:
单片机可以控制能耗的节奏,例如:收集睡眠和运动步数等数字,以分钟级的频率进行上报;信息未上报时,设备处于低能耗的状态,信息上报时,会出现一些网络传输方面的消耗,单片机可以控制能耗的节奏,将大部分时间控制在低能耗的状态下,可以使得待机时间长达七十二小时以上。
2、智能语音设备:
例如:在导航智能电子设备中,可以将其中的一些道路名称、距离等进行提取,然后进行播报;同时,还可以选择不同的名人口吻进行播报,真正实现智能化的定制操作,更好地满足用户的需求;
3、报警控制:
例如:家里经常使用的火灾报警器,就是在外界环境达到一定条件下开启智能报警的设备,如果室内的烟雾浓度到达某种水平,或者是收集外界的数据达到某种状态时,就会自动触发报警设置,从而实现智能报警的功能。
4、工厂生产检测:
例如:在一些工厂中,经常会安装一些设备,对工厂的生产环境进行监控,当出现某些异常数据时,就会发生报警,为确保设备的正常运作,设备维护人员需要及时进行处理,避免产生较大的故障。
5、家电领域:
其中家用电器就是其应用中的一个领域,用单片机取代传统的家用电器中机械控制部件,并实现家电智能化。由此确定了单片机在家用电器中的重要地位。如:智能电饭煲、智能洗衣机、智能电视等都有单片机的应用。