TQ2440裸奔程序>>串口UART的PC机按键测试程序

 //=========================================
// NAME: main.c
// DESC: TQ2440串口UART测试程序
//=========================================
/* 头文件包含 */
#include "def.h"
#include "option.h"
#include "2440addr.h"

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


//======================================================
static volatile int uart_port = 0;
void uart_init(int pclk,int buad,int ch)
{
 //UART初始化:端口使能、功能设定、波特率、设置数据格式
 rGPHCON = (rGPHCON & ~(0xfff<<4)) | (0xaaa<<4);//端口RX[0:2]、TX[0:2]功能
 rGPHUP = rGPHUP | (0x7<<1);  //端口GPH[1:3]禁止上拉
 
 rUFCON0 = 0x0; //禁止FIFO
 rUFCON1 = 0x0; //禁止FIFO
 rUFCON2 = 0x0; //禁止FIFO
 rUMCON0 = 0x0; //禁止AFC
 rUMCON1 = 0x0; //禁止AFC
 //Normal:No parity:One stop:8-bits 中断响应 UART clock: PCLK
 rULCON0  = (rULCON0 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));
 rUCON0   = (rUCON0 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));
 rUBRDIV0 = ((int)(pclk/16./buad+0.5)-1);
 
 rULCON1  = (rULCON1 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));
 rUCON1   = (rUCON1 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));
 rUBRDIV1 = ((int)(pclk/16./buad+0.5)-1);
 
 rULCON2  = (rULCON2 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));
 rUCON2   = (rUCON2 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));
 rUBRDIV2 = ((int)(pclk/16./buad+0.5)-1);
 
 uart_port = ch; //设置串口端口号
}

//******************************************************
//       串口发送函数
//******************************************************

//======================================================
void uart_send_byte(int data)
{
 if(0 == uart_port)
 {
  if(data == '\n')
  {
   while(!(rUTRSTAT0 & 0x2));
   rUTXH0 = '\n';
  }
  while(!(rUTRSTAT0 & 0x2));
  rUTXH0 = data;
 }
 else if(1 == uart_port)
 {
  if(data == '\n')
  {
   while(!(rUTRSTAT1 & 0x2));
   rUTXH1 = '\n';
  }
  while(!(rUTRSTAT1 & 0x2));
  rUTXH1 = data;
 }
 else if(2 == uart_port)
 {
  if(data == '\n')
  {
   while(!(rUTRSTAT2 & 0x2));
   rUTXH2 = '\n';
  }
  while(!(rUTRSTAT2 & 0x2));
  rUTXH2 = data;
 }
}

//======================================================
void uart_send_string(char *string)
{
 while(*string)
 {
  uart_send_byte(*string++);
 }
}

//======================================================
void uart_printf(char *fmt,...)
{
 va_list ap;
 char string[256];
 
 va_start(ap,fmt);
 vsprintf(string,fmt,ap);
 uart_send_string(string);
 va_end(ap);
}

//******************************************************
//    串口接收函数
//******************************************************

//======================================================
void uart_tx_empty(void)
{
 if(0 == uart_port)
 {
  while(!(rUTRSTAT0 & 0x4));//等待Tx为空
 }
 if(1 == uart_port)
 {
  while(!(rUTRSTAT1 & 0x4));//等待Tx为空
 }
 if(2 == uart_port)
 {
  while(!(rUTRSTAT2 & 0x4));//等待Tx为空
 }
}

//======================================================
char uart_get_ch(void)
{
 if(0 == uart_port)
 {
  while(!(rUTRSTAT0 & 0x1));//等待Rx被读
  return rURXH0;     //读缓存寄存器
 }
 else if(1 == uart_port)
 {
  while(!(rUTRSTAT1 & 0x1));//等待Rx被读
  return rURXH1;     //读缓存寄存器
 }
 else if(2 == uart_port)
 {
  while(!(rUTRSTAT2 & 0x1));//等待Rx被读
  return rURXH2;     //读缓存寄存器
 }
 return 0;
}

//======================================================
char uart_get_key(void)
{
  if(0 == uart_port)
 {
  if(rUTRSTAT0 & 0x1)      //Rx被读
  {
   return rURXH0;    //读缓存寄存器
  }
  else
  {
   return 0;    
  }
 }
 if(1 == uart_port)
 {
  if(rUTRSTAT1 & 0x1)       //Rx被读
  {
   return rURXH1;    //读缓存寄存器
  }
  else
  {
   return 0;    
  }
 }
 if(2 == uart_port)
 {
  if(rUTRSTAT2 & 0x1)    //Rx被读
  {
   return rURXH2;    //读缓存寄存器
  }
  else
  {
   return 0;    
  }
 }
 return 0; 
}

//======================================================
void uart_get_string(char *string)
{
 char *string1 = string;
 char c = 0;
 while((c = uart_get_ch())!='\r')
 {
  if(c == '\b')
  {
   if((int)string1 < (int)string)
   {
    uart_printf("\b\b");
    string--;
   }
  }
  else
  {
   *string++ = c;
   uart_send_byte(c);
  }
 }
 *string = '\0';
 uart_send_byte('\n');
}

//======================================================
int uart_get_intnum(void)
{
 char str[30];
 char *string = str;
 int base = 10;
 int minus = 0;
 int result = 0;
 int last_index;
 int i;
 
 uart_get_string(string);
 
 if(string[0] == '-')
 {
  minus = 1;
  string++;
 }
 
 if(string[0] == '0' && (string[1] == 'x' || string[1] == 'X'))
 {
  base = 16;
  string = string + 2;
 }
 
 last_index = strlen(string)-1;
 
 if(last_index < 0)
 {
  return -1;
 }
 
 if(string[last_index] == 'h' || string[last_index] == 'H')
 {
  base = 16;
  string[last_index] = 0;
  last_index--;
 }
 
 if(base == 10)
 {
//atoi将字符串转换为整型值
  result = atoi(string);
  result = minus ? (-1*result) : result;
 }
 else
 {
  for(i=0;i<=last_index;i++)
  {
//判断字符是否为英文字母,当为英文字母a-z或A-Z时,返回非零值,否则返回零。
   if(isalpha(string[i]))
   {
//isupper 判断字符是否为大写英文字母,当c为大写英文字母,返回非零值,否则返回零。   
    if(isupper(string[i]))
    {
     result = (result<<4) + string[i]-'A'+10; 
    } 
    else
    {
     result = (result<<4) + string[i]-'a'+10;
    }
   }
   else
   {
    result = (result<<4) + string[i]-'0'+10;
   }
  }
  result = minus ? (-1*result) : result;
 }
 return result;
}

//======================================================
int uart_get_intnum_gj(void)
{
 char string[16];
 char *p_string = string;
 char c;
 int i = 0;
 int data = 0;
 
 while((c = uart_get_ch()) != '\r')
 {
  if(c == '\b')
  {
   p_string--;
  }
  else
  {
   *p_string++ = c;
   
  }
  //uart_send_byte(c);
 }
 
 *p_string = '\0';
 
 i=0;
 while(string[i] != '\0')
 {
  data = data*10;
  if(string[i]<'0' || string[i]>'9')
  {
   return -1;
  }
  data = data +(string[i]-'0');
  i++;
 }
 
 return data;
}

//******************************************************

void Main(void)
{
 uart_init(50000000,115200,0);
 while(1)
 {
  if('-' == uart_get_ch())
  {
   uart_printf("+\n");
  }
  if('+' == uart_get_key())
  {
   uart_printf("-\n");
  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机与PC机通信程序主要分为两个方面:硬件连接和软件编程。 硬件连接: 单片机与PC机的通信可以通过串口、USB、以太网等方式实现。常用的是串口通信,需要连接单片机的串口口和PC机串口口(或USB转串口)。 软件编程: 单片机和PC机通信的软件编程需要分别实现单片机和PC机程序。单片机的程序需要实现串口通信的初始化、数据发送和接收。PC机程序需要实现串口通信的初始化、数据发送和接收,通常使用串口调试工具或者编程语言中的串口库。 下面是一个基于C语言的示例代码: 单片机代码: ``` #include <reg52.h> #define uchar unsigned char #define uint unsigned int void Uart_Init() { TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; SM0 = 0; SM1 = 1; REN = 1; EA = 1; ES = 1; } void Uart_SendData(uchar dat) { SBUF = dat; while(!TI); TI = 0; } void Uart_ReceiveData() interrupt 4 { uchar c; if(RI) { c = SBUF; RI = 0; Uart_SendData(c); } } void main() { Uart_Init(); while(1); } ``` PC机代码: ```c #include <stdio.h> #include <windows.h> int main() { HANDLE hCom; char buf[100]; DWORD len; COMMTIMEOUTS TimeOuts; DCB dcb; hCom = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hCom == INVALID_HANDLE_VALUE) { printf("Open COM fail!\n"); return -1; } GetCommState(hCom, &dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hCom, &dcb); TimeOuts.ReadIntervalTimeout = MAXDWORD; TimeOuts.ReadTotalTimeoutMultiplier = MAXDWORD; TimeOuts.ReadTotalTimeoutConstant = 100; TimeOuts.WriteTotalTimeoutMultiplier = 100; TimeOuts.WriteTotalTimeoutConstant = 100; SetCommTimeouts(hCom, &TimeOuts); WriteFile(hCom, "Hello, World!", 13, &len, NULL); ReadFile(hCom, buf, 100, &len, NULL); buf[len] = 0; printf("Receive: %s\n", buf); CloseHandle(hCom); return 0; } ``` 这是一个简单的单片机与PC机串口通信的示例程序,可以在此基础上进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值