C51——pc串口交互控制led(中断法)

时间:2025-03-07 16:38:54
  • #include""
  • #include<>
  • sfr AUXR=0x8e;//不认识AUXR,报错需要声明
  • sbit D6=P3^6;
  • char a[]="yang ze rui nx\r\n";//换行\r\n
  • char cmd;
  • void UartInit(void) //9600bps@11.0592MHz
  • {
  • SCON=0x50;//配置串口工作方式1,ren能接收01000000
  • TMOD&=0x0F;
  • TMOD|=0x20;//定时器1的工作方式8位自动重装配置
  • TH1=0xFD;
  • TL1=0xFD;//9600波特率的初值
  • TR1=1;//启动定时器
  • }
  • void uart_init()
  • {
  • EA=1;//打开总中断
  • ES=1;//允许串口中断
  • }
  • void Delay1000ms() //@11.0592MHz
  • {
  • unsigned char i, j, k;
  • _nop_();
  • i = 8;
  • j = 1;
  • k = 243;
  • do
  • {
  • do
  • {
  • while (--k);
  • } while (--j);
  • } while (--i);
  • }
  • /*
  • void Delay10ms() //@11.0592MHz
  • {
  • unsigned char i, j;
  • i = 18;
  • j = 235;
  • do
  • {
  • while (--j);
  • } while (--i);
  • }
  • */
  • void senddata(char c)
  • {
  • SBUF=c;//往缓冲区SBUF中存入数据
  • // Delay10ms();
  • // while(TI==0);//等待,不往下执行,发送中断请求标志位,发送完之后系统自动置1
  • while(!TI);
  • TI=0;
  • }
  • void sendstring(char*str)
  • {
  • while(*str!='\0'){
  • senddata(*str);
  • str++;
  • }
  • }
  • void main()
  • {
  • D6=1;
  • UartInit();//配置c51波特率数据,需要删除括号中的void
  • uart_init();//配置中断打开
  • while(1){
  • Delay1000ms();//软件延时1s,发送一次数据
  • sendstring(a);
  • }
  • }
  • void uart_toutine()interrupt 4
  • {
  • if(RI){//RI=1表示传输完成,此时为if(1)
  • RI=0;
  • cmd=SBUF;//接收会延时1s
  • if(cmd=='o'){
  • D6=0;
  • }
  • if(cmd==9){//需要注意ascii码的转换,c在文本模式下输入对应的是99,也可以控制关灯
  • D6=1; //如果输入数字,需要选择HEX16进制模式
  • } //文本模式1=49;文本模式0=48
  • }
  • }