⑴ 每一個單片機做作品都要把最小系統做上去嗎
一般是的。
但有些單片機內部集成了復位和震盪電路,只要下載了程序接電源就可以了。
⑵ 單片機作品
http://www.ourdev.cn/bbs/
到上面搜索下
⑶ 請介紹一些有一定深度的單片機作品(像數字鍾、流水燈那種就不必了)
用PWM功能來做DA輸出。
CAN通信。
PID演算法控制電機運行。
無刷電機的電調控制(用單片機接收旋轉位置的信號,並控制器啟停,轉速大小)。
還有一個,還是做數字鍾,但要求屏幕不能使數碼管。而是至少有1000個以上的LED燈組成的陣列。就像公交車上或一些戶外廣告屏上那樣,上千個LED燈組成的陣列,能顯示滾動漢字……
估計上述這幾個夠你做一年的了。最後那個我現在還沒做出來呢,因為太繁瑣了,但這個很掙錢的,做一個LED屏能買好幾千了。
⑷ 求at89c51單片機作品
密碼鎖:
#include<reg51.h>
#include<intrinS.h>
#include<absacc.h>
#define uchar unsigned char
#define C02_write 0xa0
#define C02_read 0xa1
#define no0 0x28
#define no1 0x14
#define no2 0x24
#define no3 0x44
#define no4 0x12
#define no5 0x22
#define no6 0x42
#define no7 0x11
#define no8 0x21
#define no9 0x41
#define enter 0x88
#define backspace 0x81
#define lcm_write_cmd_add XBYTE[0x80FF]
#define lcm_write_data_add XBYTE[0x81FF]
#define lcm_read_busy_add XBYTE[0x82FF]
#define lcm_read_data_add XBYTE[0x83FF]
uchar idata temp5_password[6]={0x00,0x00,0x00,0x00,0x00,0x00};
uchar idata key_code[]={no0,no1,no3,no4,no5,no6,no7,no8,no9};
sbit SCL=P3^0;
sbit SDA=P3^1;
sbit i=P3^2;
bit ack;
uchar int_counter_1;
unsigned int int_counter_2;
void delayms(uchar i)
{
uchar j;
for(;i>0;i--)
for(j=124;j>0;j--);
}
void longdelay(uchar i)
{
unsigned int j;
for(;i>0;i--)
for(j=10000;j>0;j--);
}
void lcm_wait()
{
while(lcm_read_busy_add&0x80);
}
void lcm_write_cmd(uchar lcm_cmd)
{
lcm_wait();
lcm_write_cmd_add=lcm_cmd;
}
void lcm_write_data(uchar lcm_data)
{
lcm_wait();
lcm_write_data_add=lcm_data;
}
uchar lcm_read_data(void)
{
uchar lcm_data;
lcm_wait();
lcm_data=lcm_read_data_add;
return(lcm_data);
}
void lcm_setxy(uchar x,uchar y)
{
if(y==1) lcm_write_cmd(x|0x80);
if(y==2) lcm_write_cmd(x|0xc0);
}
void lcm_write_string(uchar *string)
{
uchar i=0;
while(string[i]!='\0')
{
lcm_write_data(string[i]);
i++;
}
}
void lcm_roll_display(uchar *string,uchar y)
{
uchar counter;
lcm_write_cmd(0x06);
lcm_setxy(0,y);
while(string[counter]!='\0')
{
lcm_write_data(string[counter]);
counter++;
if (counter==19) lcm_setxy(19,y);
longdelay(2);
}
lcm_write_cmd(0x07);
lcm_setxy(19,y);
while(string[counter]!='\0')
{
lcm_write_data(string[counter]);
counter++;
if (counter==19) lcm_setxy(19,y);
longdelay(2);
}
}
void lcm_init()
{
delayms(20);
lcm_write_cmd_add=0x38;
delayms(4);
lcm_write_cmd_add=0x38;
delayms(1);
lcm_write_cmd_add=0x38;
lcm_write_cmd(0x38);
lcm_write_cmd(0x0f);
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
}
void I2C_start(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
void I2C_stop(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
void I2C_ackownledge(void)
{
SDA=0;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
}
void I2C_no_ackownledge(void)
{
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
}
void I2C_sendB(uchar byte)
{
uchar counter;
for(counter=0;counter<8;counter++)
{
if(byte&0x80) SDA=1;
else SDA=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
byte<<=1;
}
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
if(SDA==0) ack=1;
else ack=0;
SCL=0;
_nop_();
_nop_();
}
uchar I2C_receiveB(void)
{
uchar temp;
uchar counter;
temp=0;
SDA=1;
_nop_();
_nop_();
for(counter=0;counter<8;counter++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
if(SDA==1) temp=(temp<<1)|0x01;
else temp=temp<<1;
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
return(temp);
}
/*bit I2C_write_byte(uchar byte,uchar address)
{
I2C_sendB(address);
if(ack=0)
{
I2C_stop();
return(0);
}
else I2C_sendB(byte); */
bit I2C_send_string(uchar *string,uchar no,uchar address)
{
uchar counter;
for(counter=0;counter<no;counter++)
{
I2C_start();
I2C_sendB(C02_write);
if(ack==0) return(0);
I2C_sendB(address+counter);
if(ack==0) return(0);
I2C_sendB(string[counter]);
I2C_stop();
delayms(20);
}
return(1);
}
bit I2C_receive_string(uchar *string,uchar no,uchar address)
{
uchar counter;
for(counter=0;counter<no;counter++)
{
I2C_start();
I2C_sendB(C02_write);
if(ack==0) return(0);
I2C_sendB(address+counter);
if(ack==0) return(0);
I2C_start();
I2C_sendB(C02_read);
if(ack==0) return(0);
*(string+counter)=I2C_receiveB();
I2C_no_ackownledge();
I2C_stop();
}
}
uchar get_key()
{
uchar row_code;
uchar col_code;
P1=0xf0;
if(P1!=0xf0)
{
delayms(10);
if(P1!=0xf0)
{
row_code=0xfe;
while(row_code!=0x7f)
{
P1=row_code;
if(P1!=row_code)
{
col_code=(P1&0xf0)|0x0f;
return( (~col_code)|(~row_code));
}
row_code=((row_code<<1)|0x01);
}
}
}
return(0x00);
}
void convert_code(uchar *string)
{
uchar counter=0;
for(counter=0;counter<6;counter++)
{
switch(*string)
{
case no0:
*string=0x00;
break;
case no1:
*string=0x01;
break;
case no2:
*string=0x02;
break;
case no3:
*string=0x03;
break;
case no4:
*string=0x04;
break;
case no5:
*string=0x05;
break;
case no6:
*string=0x06;
break;
case no7:
*string=0x07;
break;
case no8:
*string=0x08;
break;
case no9:
*string=0x09;
break;
default:
break;
}
string++;
}
}
bit compare_string(uchar *string1,uchar *string2)
{
uchar counter;
for(counter=0;counter<6;counter++)
{
if(string1[counter]!=string2[counter]) return(0);
}
return(1);
}
uchar step_choose(void)
{
unsigned int i;
uchar key;
do{
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(0,1);
lcm_write_string("input password");
lcm_setxy(0,2);
lcm_write_string("please press 1");
for(i=0;i<30000;i++)
{
key=get_key();
if((key==no1)||(key==no2)) break;
}
if((key!=no1)&&(key!=no2))
{
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(0,1);
lcm_write_string("change password");
lcm_setxy(0,2);
lcm_write_string("please press 2");
for(i=0;i<30000;i++)
{
key=get_key();
if((key==no1)||(key==no2)) break;
}
}
}
while((key!=no1)&&(key!=no2));
return(key);
}
bit input_password(uchar *password)
{
uchar counter;
uchar key;
lcm_setxy(0,2);
for(counter=0;counter<7;counter++)
{
longdelay(3);
if(counter<6)
{
do{
key=get_key();
}
while(key==0x00);
if((key!=backspace)&&(key!=enter))
{
lcm_write_data('*');
password[counter]=key;
}
if(key==backspace)
{
if(counter>0)
{
lcm_setxy(--counter,2);
lcm_write_data(' ');
password[counter]=0x00;
lcm_setxy(counter,2);
counter--;
}
}
if(key==enter)
{
lcm_setxy(0,1);
return( 0);
}
}
if(counter==6)
{
do{
key=get_key();
}
while((key!=backspace)&&(key!=enter));
if(key==backspace)
{
lcm_setxy(--counter,2);
lcm_write_data(' ');
password[counter]=0x00;
lcm_setxy(counter,2);
counter--;
}
if(key==enter)
{
return(1);
}
}
}
}
void mima()
{
uchar key;
uchar idata temp1_password[6]={0,0,0,0,0,0};
uchar idata temp3_password[6]={0,0,0,0,0,0};
uchar idata temp2_password[6]={0,0,0,0,0,0};
uchar idata temp4_password[6]={0,0,0,0,0,0};
key=step_choose();
if(key==no1)
{
I2C_receive_string(temp1_password,6,0x00);
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(2,0);
lcm_write_string("input password");
if(input_password(temp2_password))
{
convert_code(temp2_password);
if(compare_string(temp1_password,temp2_password))
{
lcm_setxy(0,2);
lcm_write_string("correct!");
longdelay(6);
return;
}
else
{
lcm_setxy(0,2);
lcm_write_string("wrong password");
longdelay(6);
return;
}
}
else
{
lcm_setxy(0,2);
lcm_write_string("error! ");
longdelay(6);
}
}
else
{
I2C_receive_string(temp1_password,6,0x00);
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(0,0);
lcm_write_string("input old password");
if(input_password(temp2_password))
{
convert_code(temp2_password);
if(compare_string(temp1_password,temp2_password))
{
lcm_setxy(0,2);
lcm_write_string("password correct!");
longdelay(6);
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(0,1);
lcm_write_string("input new password");
if(input_password(temp3_password))
{
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(0,1);
lcm_write_string("input password again");
if(input_password(temp4_password))
{
if(compare_string(temp3_password,temp4_password))
{
convert_code(temp3_password);
I2C_send_string(temp3_password,6,0x00);
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(0,1);
lcm_write_string("password has");
lcm_setxy(0,2);
lcm_write_string("been changed");
longdelay(10);
return;
}
else
{
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(0,1);
lcm_write_string("twice input");
lcm_setxy(0,2);
lcm_write_string("is different");
longdelay(10);
return;
}
}
else
{
lcm_setxy(0,2);
lcm_write_string("error! ");
longdelay(10);
return;
}
}
else
{
lcm_setxy(0,2);
lcm_write_string("error! ");
longdelay(10);
return;
}
}
else
{
lcm_setxy(0,2);
lcm_write_string("wrong password");
longdelay(6);
return;
}
}
else
{
lcm_setxy(0,2);
lcm_write_string("error! ");
longdelay(6);
return;
}
}
}
void int_service(void) using 0 interrupt 0
{
EA=0;
EX0=0;
for(int_counter_1=10;int_counter_1>0;int_counter_1--)
{
for(int_counter_2=0xffff;int_counter_2>0;int_counter_2--)
{
if(i)
{
EA=1;
EX0=1;
return;
}
}
}
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_write_string("rest success!");
longdelay(12);
I2C_send_string(temp5_password,6,0x00);
(*(void(*)())0)();
}
void main(void)
{
IT0=1;
EX0=1;
EA=1;
lcm_init();
while(1)
{
mima();
}
}
⑸ 51單片機令人驚艷的作品
51單片機
51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8004單片機,後來隨著Flash rom技術的發展,8004單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。需要注意的是51系列的單片機一般不具備自編程能力。
中文名稱
51單片機
外文名稱
mcu
定義
兼容Intel 8031系統的單片機統稱
始祖
Intel公司始創的8004單片機
缺點
不具備自編程能力
用途
工業測控系統
主要產品
*Intel(英特爾)的:80C31、80C51、87C51,80C32、80C52、87C52等;
*ATMEL(艾德梅爾)的:89C51、89C52、89C2051,89S51(RC),89S52(RC)等;
*Philips(飛利浦)、華邦、Dallas(達拉斯)、Siemens(西門子)等公司的許多產品;
STC(國產宏晶)單片機:89c51、89c52、89c516、90c516等眾多品牌。
功能
·8位CPU·4kbytes程序存儲器(ROM) (52為8K)
·128bytes的數據存儲器(RAM) (52有256bytes的RAM)
·32條I/O口線·111條指令,大部分為單位元組指令
·21個專用寄存器
·2個可編程定時/計數器·5個中斷源,2個優先順序(52有6個)
·一個全雙工串列通信口
·外部數據存儲器定址空間為64kB
·外部程序存儲器定址空間為64kB
·邏輯操作位定址功能·雙列直插40PinDIP封裝
·單一+5V電源供電
CPU:由運算和控制邏輯組成,同時還包括中斷系統和部分外部特殊功能寄存器;
RAM:用以存放可以讀寫的數據,如運算的中間結果、最終結果以及欲顯示的數據;
ROM:用以存放程序、一些原始數據和表格;
I/O口:四個8位並行I/O口,既可用作輸入,也可用作輸出
T/C:兩個定時/記數器,既可以工作在定時模式,也可以工作在記數模式;
五個中斷源的中斷控制系統;
一個全雙工UART(通用非同步接收發送器)的串列I/O口,用於實現單片機之間或單片機與微機之間的串列通信;
片內振盪器和時鍾產生電路,石英晶體和微調電容需要外接。最佳振盪頻率為6M—12M。
學習
作為一個初學者,如何單片機入門?
實際上,其實不需要多少東西,會簡單的C語言,知道51單片機的基本結構就可以了。一般的大學畢業生都可以了,自學過這2門課程的高中生也夠條件。設備上,一般是建議購買一個模擬器,例如,的「雙功能下載線」就具有良好的穩定性和較快的下載速度,上位機可擴展,可以下載更多的單片機及嵌入式晶元。通過實驗,這樣才可以進行實際的,全面的學習。日後在工作上,模擬器也大有用處。還有,一般光有模擬器是不行,還得有一個實際的電路,即學習板,如圖,即為,單片機最小系統。
學習板以強大的介面為主,單片機的學習分兩方面,一方面是單片機的原理及內部結構,另一方面是單片機的介面技術。這些都是需要平時多積累,多動手,多思考,這樣才能學好單片機技術。
註:「雙功能下載線」在網路文庫里有詳細的使用說明,並且上位機會定期更新以支持更多的單片機。
⑹ 自製單片機作品的介紹怎麼寫
你是准備發表文章嗎?
首先,你得確定將文章發表到什麼刊物,然後買幾本那刊物,看看別人是怎樣寫的,參照他們的風格,OK
祝你成功。
⑺ 單片機小作品
都是給你的垃圾建議,你做完還是屁都不是的入門生。
建議你做點實用的項目,哪怕是做現有的項目,對你也是巨大的提升。
例如 筆記本電池,就做你自己筆記本的電池,只要不是DELL 聯想,其它牌子都沒有加密,是可以做的,一整套做下來。你所學的基本全部得到了應用。IIC變種的SMBUS,電壓檢測,可以是最差的電阻分壓,也可以是高端點的共模差分,甚至是買個模擬前端,串口控制。電流檢測模擬前端IC一般都有,你還可以用LM358運放做。溫度檢測溫度電阻,容量累計演算法,靜態功耗,長期放置1年都可以用。還有保護電路,短路保護都可以用三極體做個模擬電路搭建,BQ2060的電路里有,可以抄襲研究。
簡單點還可以自己做個充電寶,充電IC用4056 4057,甚至你自己做到單片機里,利用PWM自己做,連接檢測,升壓,
以上還能在進一步,做個在線升級功能,做個BOOT程序,筆記本電池做個上位機,利用SMBUS在線升級更新程序,更改數據。
做這些項目,比你做什麼煙感,音樂噴泉,智能溫控風扇,超聲波測距,電子秤,電子表等等耍著玩的東西強多了,這些才能真正鍛煉你。
⑻ 我是一個單片機初學者,希望各位大神能給我一些製作簡單小作品的實例;最好有電路圖和程序。
我把我做過的一些小東西發給你吧,你解壓裡面有兩個圖,一個是流水燈,一個是交通信號燈,流水燈有幾種實現方式,裡面有程序
⑼ 做一個單片機作品需要哪些軟體
首先要有一個程序編寫軟甲keil
最好有一個模擬軟體 推薦使用proteus
一個程序下載軟體
⑽ 求一部國外的單片機著作。挨邊就行。單片機的。應付老師。要能查的到的。作者必須是外國人。
看看這篇文章吧,裡面有些外國人的作品及介紹,你可以選擇一些作為參考,應付老師也好,自己學習也吧:網頁鏈接