自制單片機(jī)之十七……PC與單片機(jī)RS-232串口的通訊和控制
這次我們來(lái)試著一步步的去掌握PC與單片機(jī)通過(guò)RS-232進(jìn)行通訊和控制。
先說(shuō)說(shuō)我硬件的情況。我用的PC是個(gè)二手的IBM240小本本,十寸屏,賽揚(yáng)400,機(jī)子很老了。但也有它的優(yōu)點(diǎn):1、串口,并口,PS鼠標(biāo)口、USB口、PCM插槽全有。 調(diào)試硬件電路最好還是用真實(shí)串、并口好些,因?yàn)橛肬SB轉(zhuǎn)換的串、并口有時(shí)會(huì)出現(xiàn)兼容性上的問(wèn)題,就會(huì)增加你調(diào)試上的復(fù)雜性。
下圖為本人的IBM 240及各種接口圖:
下圖是PC的大小對(duì)比圖
單片機(jī)還是我一步步做出來(lái)的那個(gè)了,USB-ISP編程線也是我前面秀過(guò),好!現(xiàn)在我放上PC與單片機(jī)連接圖:
用本本的好處就是調(diào)整方便,接口、器件都在旁邊,假若是用臺(tái)式機(jī),你還得鉆到桌子底下去插拔那些接口,而現(xiàn)在本本卻又沒有串、并口了。
言歸正傳,單片機(jī)的RS-232串口通過(guò)9針串口線接到本本的串口上,單片機(jī)的ISP編程口通過(guò)USB-ISP編程器接到本本的USB口。
另外本本要接電源,單片機(jī)也要接5V電源,還有千萬(wàn)千要記得,本本是要插上鼠標(biāo)才玩得轉(zhuǎn)哦!
我將這個(gè)一步一步掌握串口的通訊與控制分為五步:
1、測(cè)試單片機(jī)與PC的串口連接是否正確好用。
2、用VB自己編寫的程序替換掉串口調(diào)試器軟件來(lái)接收單片機(jī)發(fā)送的數(shù)據(jù)。
3、掌握單片機(jī)端如何發(fā)送字符和數(shù)值數(shù)據(jù)。
4、掌握PC端程序如何接收發(fā)送字符和數(shù)值型數(shù)據(jù)。
5、做一個(gè)A/D轉(zhuǎn)換(ADC0809)獲取數(shù)據(jù)發(fā)送到PC,并在PC上顯示實(shí)時(shí)趨勢(shì)的例子。
我們要用到的四個(gè)軟件:
1、USB接口編程軟件:是PC機(jī)給單片機(jī)進(jìn)行燒寫編程用的
2、串口調(diào)試軟件:用來(lái)測(cè)試單片機(jī)內(nèi)串口電路、程序工作是否正常。
3、單片機(jī)程序的編程軟件KEIL:用于編寫單片機(jī)內(nèi)的程序并生成HEX文件。
4、VB6.0:用于編寫PC機(jī)上的應(yīng)用程序
先進(jìn)行第一步工作:
在前面一篇《板子上最一個(gè)部件——RS232串口》講過(guò)如何對(duì)單片機(jī)上的串口進(jìn)行調(diào)試,我們還是先對(duì)這個(gè)連接進(jìn)行測(cè)試,我們首先得確認(rèn)連接正確,電路正常,才能進(jìn)行后面程序編寫和調(diào)試工作。
依舊是那個(gè)最簡(jiǎn)單的程序,AT89S52從串口不停地發(fā)送“hello world!”
#include
#include
void main(void)
{
SCON=0x50; //串口方式1
TMOD=0x20; //定時(shí)器1,定時(shí)方式為2
PCON=0x80; //設(shè)定串口工作方式為1
TCON=0x40; //設(shè)定時(shí)器1開始計(jì)數(shù)
TH1=0xfd; //設(shè)定波特率為19200
TL1=0xfd; //
TI=1;
TR1=1; //啟動(dòng)定時(shí)器
while(1)
{
printf("hello world!n");
}
}
把原先生成好的這個(gè)HEX文件用上面講到的Progisp軟件寫到AT89S52里。
然后打開sscom32串口調(diào)試器,設(shè)定好串口號(hào)、波特率和數(shù)據(jù)位,按下“打開串口”鈕,應(yīng)該就能收到那個(gè)一行行的“hello world!”了。能看到這一行行的文字,說(shuō)明電路、連接和程序都正常了。
如果是亂碼,則要將單片機(jī)上的復(fù)位鈕按一下。如果還是亂碼,那一般就是波特率不對(duì),晶振應(yīng)為11.0592MHZ或串口接觸不良,線過(guò)長(zhǎng)等原因。如果跟本就收不到任何字符,就說(shuō)明電路或連接有故障,或者程序有問(wèn)題。那就要好好查查了。
好!現(xiàn)在電路、連接、程序都可以正常工作。但在串口調(diào)試器接收框里看到接收到的一行行“hello world!”顯示太快,不容易看出它一次一次發(fā)送的過(guò)程,不便于分析問(wèn)題,我們得給它加點(diǎn)延時(shí)。
#include
#include
void delay(void) //定義一個(gè)延時(shí)子程序
{
unsigned int i;
for (i=65535;i>0;i--);
}
void main(void) //主程序
{
SCON=0x50; //串口方式1
TMOD=0x20; //定時(shí)器1,定時(shí)方式為2
PCON=0x80; //設(shè)定串口工作方式為1
TCON=0x40; //設(shè)定時(shí)器1開始計(jì)數(shù)
TH1=0xfd; //設(shè)定波特率為19200
TL1=0xfd; //
TI=1;
TR1=1; //啟動(dòng)定時(shí)器
while(1)
{
printf("hello world!n"); //向串口送出數(shù)據(jù)
delay(); //調(diào)用延時(shí)
delay();
}
}
程序?qū)懞昧?,在KEIL里添加上延時(shí)語(yǔ)句后,重新生成HEX文件。再用Progisp將它寫進(jìn)AT89S52里,這時(shí),你就可以看到串口調(diào)試器已經(jīng)接收到大約一秒一次的“Hello world!”了。
在這里說(shuō)明一下,只要像最上面我圖上給出的那樣把單片機(jī)和PC連接好后,無(wú)論你往AT89S52里燒寫程序,還是單片機(jī)連接到PC并向PC串口發(fā)送數(shù)據(jù),都不用再插拔器件了,只需要在這幾個(gè)程序間切換工作便可以了。(是不是很方便呢)