1. 以2400bps從計算機發送任一字節數據,當單片機收到該數據后,將其送到數碼管顯示,在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**
題目要求:以2400bps從計算機發送任一字節數據,當單片機收到該數據后,將其送到數碼管顯示,在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。
**/
/**
步驟
接線方式:
1、P0接數碼管J12,實現段選
2、譯碼器和數碼管位選輸入短接,J15+J16
3、P2用來控制譯碼器的輸入
4、P1是串口接收中斷的指示,P1+JP1
5、本實驗使用的晶振是11.0592
**/
//=========全局變量區============================================
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼
uint Received_Flag=0;//用來標志是否接收到信號
uchar ReceiveCount,Data_Received=0;//ReceiveCount是接受的條數,接收到的數據
uchar code table[]="index ";
//=========全局變量區結束========================================
//========函數區開始============================================
/**
延時
**/
void delay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數碼管上顯示對應的值
**/
void display(uchar Num)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0; //送完段選信號后,進行消影的處理
}
/**
控制數碼管顯示后3位,并分解計數值
**/
void DisplayNumByOrder(uint Value){
low=0; mid=0; high=0; display(0);
low=1; mid=0; high=0; display(0);
low=0; mid=1; high=0; display(0);
low=1; mid=1; high=0; display(0);
low=0; mid=0; high=1; display(0);
low=1; mid=0; high=1; display(Value%1000/100);
low=0; mid=1; high=1; display(Value%100/10);
low=1; mid=1; high=1; display(Value%10);
}
void init(){ //初始化定時器T1和串口
SCON =0x50; //設置串口工作方式1,并打開接收中斷
TMOD =0x20; //設置T1工作方式2
PCON =0x00; //設置SMOD為串口工作方式1
TL1 =0xf4;
TH1 =0xf4; //2400bps(12MHZ的晶振)
TR1 =1; //開啟時鐘
ES =1; //開啟串口中斷允許
EA =1; //開啟中斷總允許
}
/**
發送數據
**/
void SendData(uchar value){
SBUF=value;
while(!TI);
TI=0;
}
/**
處理接收到的數據
**/
void ProcessData(){
int i=0;
for(i=0;i<6;i++){
SendData(table[i]);
}
SendData(ReceiveCount);
SendData(':');
SendData(Data_Received);
}
int main(){
init();//初始化數據
while(1){
if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示
ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。
ProcessData();
ES=1;
Received_Flag=0;
}
//在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。
DisplayNumByOrder(Data_Received); //在數碼管上顯示
}
return0;
}
//========函數區結束============================================
//========中斷函數區============================================
/**
串口接收中斷
**/
void ser_received() interrupt 4
{
RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來
Data_Received=(uchar)SBUF; //從緩沖區內讀取數據
Received_Flag=1; //設置已經接收到數據
P1=~P1;
ReceiveCount++;
}
//========中斷函數區結束==========================================
2. 以16進制發送一個0-65536之間的任一數,當單片機收到后在數碼管上動態顯示出來,波特率自定。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**
題目要求: 以16進制發送一個0-65536之間的任一數,當單片機收到后在數碼管上動態顯示出來,波特率自定。
**/
/**
步驟
接線方式:
1、P0接數碼管J12,實現段選
2、譯碼器和數碼管位選輸入短接,J15+J16
3、P2用來控制譯碼器的輸入
4、P1是串口接收中斷的指示,P1+JP1
5、本實驗使用的晶振是11.0592
**/
//=========全局變量區============================================
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼
uint Received_Flag=0;//用來標志是否接收到信號
uchar ReceiveCount,DecodeCount,Data_Received=0;//ReceiveCount是已經接收的條數,DecodeCount是已經解析的數目,Data_Received是接收到的數據
ulong NumToDisplay=0;
//=========全局變量區結束========================================
//========函數區開始============================================
/**
延時
**/
void delay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數碼管上顯示對應的值
**/
void display(uchar Num)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0; //送完段選信號后,進行消影的處理
}
/**
控制數碼管顯示后3位,并分解計數值
**/
void DisplayNumByOrder(ulong Value){
low=0; mid=0; high=0; display(0);
low=1; mid=0; high=0; display(0);
low=0; mid=1; high=0; display(0);
low=1; mid=1; high=0; display(Value%100000/10000);
low=0; mid=0; high=1; display(Value%10000/1000);
low=1; mid=0; high=1; display(Value%1000/100);
low=0; mid=1; high=1; display(Value%100/10);
low=1; mid=1; high=1; display(Value%10);
}
void init(){ //初始化定時器T1和串口
SCON =0x50; //設置串口工作方式1,并打開接收中斷
TMOD =0x20; //設置T1工作方式2
PCON =0x00; //設置SMOD為串口工作方式1
TL1 =0xf4;
TH1 =0xf4; //2400bps(11.0592MHZ的晶振)
TR1 =1; //開啟時鐘
ES =1; //開啟串口中斷允許
EA =1; //開啟中斷總允許
}
/**
發送數據
**/
void SendData(uchar value){
SBUF=value;
while(!TI);
TI=0;
}
int main(){
init();//初始化數據
while(1){
if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示
ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。
//ProcessData();
ES=1;
Received_Flag=0;
}
//在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。
DisplayNumByOrder(NumToDisplay); //在數碼管上顯示
}
return0;
}
//========函數區結束============================================
//========中斷函數區============================================
/**
串口接收中斷
**/
void ser_received() interrupt 4
{
if(RI ==1){//接收到觸發中斷
RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來
Data_Received=(uchar)SBUF; //從緩沖區內讀取數據
Received_Flag=1; //設置已經接收到數據
if(DecodeCount==0){
NumToDisplay=Data_Received;
++DecodeCount;
}else{
NumToDisplay =(NumToDisplay <<8)| Data_Received;//相當于原來的數乘以8,然后+現在的數
DecodeCount++;
if(DecodeCount ==3) //0..65536要接收6位的16進制
DecodeCount =0;
}
P1=~P1;
ReceiveCount++;
}
}
//========中斷函數區結束==========================================
擴展題目:
1. 實現單片機雙機通信,實現單片機甲發送一個信息給單片機乙,同時在數碼管上顯示出來,單片機乙收到信息后,回復OK給單片機甲。
//甲機
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**
題目要求:以2400bps從計算機發送任一字節數據,當單片機收到該數據后,將其送到數碼管顯示,在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。
**/
/**
步驟
接線方式:
1、P0接數碼管J12,實現段選
2、譯碼器和數碼管位選輸入短接,J15+J16
3、P2用來控制譯碼器的輸入
4、P1是串口接收中斷的指示,P1+JP1
5、本實驗使用的晶振是11.0592
**/
//=========全局變量區============================================
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼
uint Received_Flag=0;//用來標志是否接收到信號
uchar ReceiveCount,Data_Received=0;//ReceiveCount是接受的條數,接收到的數據
uchar code table[]="index ";
//=========全局變量區結束========================================
//========函數區開始============================================
/**
延時
**/
void delay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數碼管上顯示對應的值
**/
void display(uchar Num)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0; //送完段選信號后,進行消影的處理
}
/**
控制數碼管顯示后3位,并分解計數值
**/
void DisplayNumByOrder(uint Value){
low=0; mid=0; high=0; display(0);
low=1; mid=0; high=0; display(0);
low=0; mid=1; high=0; display(0);
low=1; mid=1; high=0; display(0);
low=0; mid=0; high=1; display(0);
low=1; mid=0; high=1; display(Value%1000/100);
low=0; mid=1; high=1; display(Value%100/10);
low=1; mid=1; high=1; display(Value%10);
}
void init(){ //初始化定時器T1和串口
SCON =0x50; //設置串口工作方式1,并打開接收中斷
TMOD =0x20; //設置T1工作方式2
PCON =0x00; //設置SMOD為串口工作方式1
TL1 =0xf4;
TH1 =0xf4; //2400bps(11.0592MHZ的晶振)
TR1 =1; //開啟時鐘
ES =1; //開啟串口中斷允許
EA =1; //開啟中斷總允許
}
/**
發送數據
**/
void SendData(uchar value){
SBUF=value;
while(!TI);
TI=0;
}
int main(){
init();//初始化數據
SendData(0x00);//發送數據
SendData(0x01);
SendData(0x01);
while(1){
if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示
ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。
ES=1;
Received_Flag=0;
}
//在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。
DisplayNumByOrder(Data_Received); //在數碼管上顯示
}
return0;
}
//========函數區結束============================================
//========中斷函數區============================================
/**
串口接收中斷
**/
void ser_received() interrupt 4
{
RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來
Data_Received=(uchar)SBUF; //從緩沖區內讀取數據
Received_Flag=1; //設置已經接收到數據
P1=~P1;
ReceiveCount++;
}
//========中斷函數區結束==========================================
//乙機
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**
題目要求: 以16進制發送一個0-65536之間的任一數,當單片機收到后在數碼管上動態顯示出來,波特率自定。
**/
/**
步驟
接線方式:
1、P0接數碼管J12,實現段選
2、譯碼器和數碼管位選輸入短接,J15+J16
3、P2用來控制譯碼器的輸入
4、P1是串口接收中斷的指示,P1+JP1
5、本實驗使用的晶振是11.0592
**/
//=========全局變量區============================================
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼
uint Received_Flag=0;//用來標志是否接收到信號
uchar ReceiveCount,DecodeCount,Data_Received=0;//ReceiveCount是已經接收的條數,DecodeCount是已經解析的數目,Data_Received是接收到的數據
ulong NumToDisplay=0;
//=========全局變量區結束========================================
//========函數區開始============================================
/**
延時
**/
void delay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數碼管上顯示對應的值
**/
void display(uchar Num)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0; //送完段選信號后,進行消影的處理
}
/**
控制數碼管顯示后3位,并分解計數值
**/
void DisplayNumByOrder(ulong Value){
low=0; mid=0; high=0; display(0);
low=1; mid=0; high=0; display(0);
low=0; mid=1; high=0; display(0);
low=1; mid=1; high=0; display(Value%100000/10000);
low=0; mid=0; high=1; display(Value%10000/1000);
low=1; mid=0; high=1; display(Value%1000/100);
low=0; mid=1; high=1; display(Value%100/10);
low=1; mid=1; high=1; display(Value%10);
}
void init(){ //初始化定時器T1和串口
SCON =0x50; //設置串口工作方式1,并打開接收中斷
TMOD =0x20; //設置T1工作方式2
PCON =0x00; //設置SMOD為串口工作方式1
TL1 =0xf4;
TH1 =0xf4; //2400bps(11.0592MHZ的晶振)
TR1 =1; //開啟時鐘
ES =1; //開啟串口中斷允許
EA =1; //開啟中斷總允許
}
/**
發送數據
**/
void SendData(uchar value){
SBUF=value;
while(!TI);
TI=0;
}
int main(){
init();//初始化數據
while(1){
if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示
ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。
SendData(‘o’);
SendData(‘k’);
ES=1;
Received_Flag=0;
}
//在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。
DisplayNumByOrder(NumToDisplay); //在數碼管上顯示
}
return0;
}
//========函數區結束============================================
//========中斷函數區============================================
/**
串口接收中斷
**/
void ser_received() interrupt 4
{
if(RI ==1){//接收到觸發中斷
RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來
Data_Received=(uchar)SBUF; //從緩沖區內讀取數據
Received_Flag=1; //設置已經接收到數據
if(DecodeCount==0){
NumToDisplay=Data_Received;
++DecodeCount;
}else{
NumToDisplay =(NumToDisplay <<8)| Data_Received;//相當于原來的數乘以8,然后+現在的數
DecodeCount++;
if(DecodeCount ==3) //0..65536要接收6位的16進制
DecodeCount =0;
}
P1=~P1;
ReceiveCount++;
}
}
//========中斷函數區結束==========================================
文章列表
留言列表