串口编程实验报告
/**************************************************
實驗名稱:串口實驗一
實驗目的:在上位機上用串口調試助手發送一個字符X,單
?片機在收到字符后返回給上位機,顯示"I got?
?X",串口波特率設定為9600bps。
實驗備注:SMOD處在TCON第一位,TCON在單片機復位上電
?后清零。所以不設置TCON的話,串口方式在1、
?2、3時,波特率處于正常不加倍狀態,也不用
?特意去設置TCON。
**************************************************/
#include<reg52.h>
//#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag, temp, i;
uchar code table[] = "I got ";
void init();
void main()
{
flag = 0;
temp = 0;
i = 0;
init();
while(1)
{
if(flag == 1)
{
ES = 0;
for(i = 0; i < 6; i++)
{
// TI = 1;
// printf("I got the ");
SBUF = table[i];
while(!TI);
TI = 0;
}
SBUF = temp;
while(!TI);
TI = 0;
flag = 0;
ES = 1;
}
}
}
void init()
{
TMOD = 0X20;//在定時器工作模式2時,
TH1 = 0xfd;//處在自動填裝八位寄存器狀態
TL1 = 0xfd;//波特率為9600兩寄存器各填裝0xfd
EA = 1;
ES = 1;
SM0 = 0;//10位異步收發,8位數據,
SM1 = 1;//定時器1溢出控制,波特率可控制
REN = 1;//串口接受允許位
TR1 = 1;
}
void ser() interrupt 4
{
RI = 0;
temp = SBUF;
flag = 1;
}
/**************************************************
實驗名稱:串口實驗二
實驗目的:單片機上電后等待從上位機串口發送來的命令,
?同時在數碼管的前三位上以十進制方式顯示A/D
?采集的數值,在未收到上位機發送來的啟動A/D
?轉換命令前數碼管始終顯示000。
?當收到上位機以十六進制發送來的01后,向上
?位機發送字符串"Turn on ad!",同時間隔1秒
?讀取一次A/D的值,然后把A/D采樣回來的8位二
?進制數轉換成十進制數表示的實際電壓浮點數,
?并發送給上位機,形式如:"The voltage is?
?3.398438V",發送周期間隔1秒,同時在數碼管
?上顯示十進制數。
?當收到上位機發來的十六進制02后,向上位機
?發送字符串"Turn off ad!",然后停止發送電
?壓值,數碼管上顯示上次結束時保持的值。
?當收到上位機發來的其他數時顯示"Error"
實驗備注:
**************************************************/
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DUAN = P2^6;
sbit WEI = P2^7;
sbit ADRD = P3^7;
sbit ADWR = P3^6;
uchar code duan_table[]=
{0x3f,0x06,0x5b,0x4f,
?0x66,0x6d,0x7d,0x07,
?0x7f,0x6f,0x77,0x7c,
?0x39,0x5e,0x79,0x71};
uchar code wei_table_ad[]=
{0x7e,0x7d,0x7b,
?0x77,0x6f,0x5f};
uchar s_flag, t_flag, s_var, vol_led;
float vol_ser_t;
void init();
uchar read_ad();
void delay1ms(uchar);
void display(uchar);
void main()
{
init();
while(1)
{
if(s_flag == 1)
{
s_flag = 0;
ES = 0;
TI = 1;
switch (s_var)
{
case 1:
printf("Turn on the ad!\n");
TR0 = 1;
break;
case 2:
printf("Turn off the ad!\n");
TR0 = 0;
break;
default:
printf("Error!\n");
break;
}
while(!TI);
TI = 0;
ES = 1;
}
if(t_flag == 20)
{
vol_led = read_ad();
t_flag = 0;
vol_ser_t = (float)vol_led/256*5;
ES = 0;
TI = 1;
printf("The voltage is %fV\n",vol_ser_t);
while(!TI);
TI = 0;
ES = 1;
}
display(vol_led);
}
}
void init()
{
WEI = 1;
P0 = 0x7f;
WEI =1;
s_flag = 0;
t_flag = 0;
vol_led = 0;
vol_ser_t = 0;
TMOD = 0x21;
TH0 = (65536-46080)/256;
TL0 = (65536-46080)%256;
TH1 = (0xfd);
TL1 = (0xfd);
EA = 1;
ET0 = 1;
ES = 1;
// TR0 = 1;
TR1 = 1;
REN = 1;
SM0 = 0;
SM1 = 1;
}
uchar read_ad()
{
uchar vol;
ADWR = 1;
_nop_();
ADWR = 0;
_nop_();
ADWR = 1;
P1 = 0xff;
ADRD = 1;
_nop_();
ADRD = 0;
_nop_();
vol = P1;
_nop_();
ADRD = 1;
return vol;
}
void delay1ms(uchar x)
{
uchar i, j;
for(i = 0; i < x; i++)
for(j = 0; j < 110; j++);
}
void display(uchar num)
{
DUAN = 1;
P0 = duan_table[num/100];
DUAN = 0;
P0 = 0xff;
WEI = 1;
P0 = wei_table_ad[0];
WEI = 0;
delay1ms(1);
DUAN = 1;
P0 = duan_table[num%100/10];
DUAN = 0;
P0 = 0xff;
WEI = 1;
P0 = wei_table_ad[1];
WEI = 0;
delay1ms(1);
DUAN = 1;
P0 = duan_table[num%10];
DUAN = 0;
P0 = 0xff;
WEI = 1;
P0 = wei_table_ad[2];
WEI = 0;
delay1ms(1);
}
void Timer0() interrupt 1
{
TH0 = (65536-46080)/256;
TL0 = (65536-46080)%256;
t_flag++;
}
void Ser() interrupt 4
{
RI = 0;
s_var = SBUF;
s_flag = 1;
}
/**************************************************
實驗名稱:串口實驗三
實驗目的:在上位機上用串口調試助手發送一個字符X,單
?片機在收到字符后返回給上位機,顯示"I got?
?X",串口波特率設定為9600bps。使用printf。
實驗備注:
**************************************************/
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp, s_flag;
//void delay1ms(uchar);
void main()
{
temp = 0;
s_flag = 0;
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
EA = 1;
ES = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
TR1 = 1;
while(1)
{
if(s_flag ==1)
{
ES = 0;
TI = 1;//在printf之前必須把TI置1;
printf("I got the %c\n",temp);
while(!TI);
TI = 0;
s_flag = 0;
ES = 1;
}
}
}
/*void delay1ms(uchar x)
{
uchar i, j;
for(i = 0; i < x; i++)
for(j = 0; j < 110; j++);
}*/
void Ser() interrupt 4
{
RI = 0;
temp = SBUF;
s_flag = 1;
}
轉載于:https://blog.51cto.com/elvinsys/1611122
總結
- 上一篇: Linux学习资料-万用字符与特殊符号
- 下一篇: linux中刻录iso到光盘