⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.c

📁 用普通的IO口 模拟串口 可以读写操作 以便大家学习之用
💻 C
字号:
// YONG I/O KOU MO NI UART   用I/O口模拟UART  串口     中断法
////OK OK OK OK OK!!!!!!!!!!!!!!2007.9.25

#include <reg52.h>
sbit BT_SND    =P1^0;
sbit BT_REC    =P1^1;

sbit  DIN=P1^5;       //定义I/O口
sbit  CLK=P1^6;
sbit  LOAD=P1^7;

bit key_flag=0;
unsigned char keybuf[2]={0,0};
sbit LED=P2^7;
sbit LED0=P2^6;
/**********************************************
    
    IO 口模拟232通讯程序
    
    使用两种方式的C程序 占用定时器0 
    
**********************************************/

#define MODE_QUICK

#define F_TM F0

#define TIMER0_ENABLE     TL0=TH0; TR0=1;
#define TIMER0_DISABLE        TR0=0;

sbit ACC0=   ACC^0;
sbit ACC1=   ACC^1;
sbit ACC2=   ACC^2;
sbit ACC3=   ACC^3;
sbit ACC4=   ACC^4;
sbit ACC5=   ACC^5;
sbit ACC6=   ACC^6;
sbit ACC7=   ACC^7;

void IntTimer0() interrupt 1
{
    F_TM=1;
}
//发送一个字符
void PSendChar(unsigned char inch)
{
#ifdef MODE_QUICK    
    ACC=inch;

    F_TM=0;
    BT_SND=0;        //start bit 
    TIMER0_ENABLE;    //启动
    while(!F_TM);
    
    BT_SND=ACC0;    //先送出低位
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC1;    
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC2;    
    F_TM=0;
    while(!F_TM);

    BT_SND=ACC3;    
    F_TM=0;
    while(!F_TM);

    BT_SND=ACC4;    
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC5;    
    F_TM=0;
    while(!F_TM);

    BT_SND=ACC6;    
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC7;    
    F_TM=0;
    while(!F_TM);

    BT_SND=1;    
    F_TM=0;
    while(!F_TM);
    
    
    TIMER0_DISABLE;    //停止timer
#else
    unsigned char ii;
    
    ii=0;
    
    F_TM=0;
    BT_SND=0;        //start bit 
    TIMER0_ENABLE;    //启动
    while(!F_TM);
    
    while(ii<8)
    {
        if(inch&1)
        {
            BT_SND=1;
        }
        else
        {
            BT_SND=0;
        }
        F_TM=0;
        while(!F_TM);
        ii++;
        inch>>=1;
    }
        BT_SND=1;    
        F_TM=0;
        while(!F_TM);

#endif    
    TIMER0_DISABLE;    //停止timer
}
//接收一个字符
unsigned char PGetChar()
{
#ifdef MODE_QUICK    

    TIMER0_ENABLE;    
    F_TM=0;
    while(!F_TM);    //等过起始位
    ACC0=BT_REC;
    
    TL0=TH0;

    F_TM=0;
    while(!F_TM);
    ACC1=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC2=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC3=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC4=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC5=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC6=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC7=BT_REC;
    
    F_TM=0;
    
    while(!F_TM)
    {
        if(BT_REC)
        {
            break;
        }        
    }
    TIMER0_DISABLE;    //停止timer
    return ACC;
#else
    unsigned char rch,ii;
    TIMER0_ENABLE;    
    F_TM=0;
    ii=0;
    rch=0;
    while(!F_TM);    //等过起始位
    
    while(ii<8)
    {
        rch>>=1;
        if(BT_REC)
        {
            rch|=0x80;
        }
        ii++;
        F_TM=0;
        while(!F_TM);
                
    }
    F_TM=0;
    while(!F_TM)
    {
        if(BT_REC)
        {
            break;
        }
        
    }
    TIMER0_DISABLE;    //停止timer
    return rch;
    
#endif    
    
}
//检查是不是有起始位
bit StartBitOn()
{
    return  (BT_REC==0);
    
}

void send(unsigned char add,unsigned char dat)   //发送16字节函数
{
       unsigned char ADS,i,j;
       LOAD=0;
       i=0;
       while(i<16)
       {
               if(i<8)
			         ADS=add;
               else
                     ADS=dat;
                for(j=8;j>=1;j--)
                {                     //CLK=1;
                     DIN=ADS&0X80;
                     ADS=ADS<<1;
                     CLK=1;
                     CLK=0;
                }
                i=i+8;
        }
        LOAD=1;
}

void keyscan(void)
{
    unsigned char i=0,temp;

    if(keybuf[1]==0x0f0)
	{
	      if(keybuf[0]!=0)
		  {    
		       temp=keybuf[0];
			   switch(temp)
			   {
			        case 0x70:send(0x01,0x00);send(0x02,0x00);LED=!LED;LED0=!LED0;
					          break;   //0
			        case 0x69:send(0x01,0x01);send(0x02,0x01);LED=!LED;LED0=!LED0;
					          break;   //1
			        case 0x72:send(0x01,0x02);send(0x02,0x02);LED=!LED;LED0=!LED0;
					          break;   //2
			        case 0x7a:send(0x01,0x03);send(0x02,0x03);LED=!LED;LED0=!LED0;
					          break;   //3
			        case 0x6b:send(0x01,0x04);send(0x02,0x04);LED=!LED;LED0=!LED0;
					          break;   //4
			        case 0x73:send(0x01,0x05);send(0x02,0x05);LED=!LED;LED0=!LED0;
					          break;   //5
			        case 0x74:send(0x01,0x06);send(0x02,0x06);LED=!LED;LED0=!LED0;
					          break;   //6
			        case 0x6c:send(0x01,0x07);send(0x02,0x07);LED=!LED;LED0=!LED0;
					          break;   //7
			        case 0x75:send(0x01,0x08);send(0x02,0x08);LED=!LED;LED0=!LED0;
					          break;   //8
			        case 0x7d:send(0x01,0x09);send(0x02,0x09);LED=!LED;LED0=!LED0;
					          break;   //9
				}
		  }
	}
}

void main()
{
    unsigned char gch;
                        ////计数器0,方式2
    TMOD=0x22;        /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */

    PCON=00;

    TR0=0;            //在发送或接收才开始使用
    TF0=0;        
    TH0=(256-96);    //9600bps 就是 1000000/9600=104.167微秒 执行的

                    // timer是104.167*11.0592/12= 96             

    TL0=TH0;
    ET0=1;          //允许定时器0中断
    EA=1;             //中断允许总开关
 
     send(0x0c,0x01);       //初始化MAX7219
     send(0x0b,0x07);
     send(0x0a,0x0f5);
     send(0x09,0x0ff);

    PSendChar(0x55);
    PSendChar(0xaa);
    PSendChar(0x00);
    PSendChar(0xff);

	   send(0x01,0x02);      //在8个数码管上显示1-8,带小数点显示
       send(0x02,0x02);
       send(0x03,0x04);
       send(0x04,0x05);
       send(0x05,0x00);
       send(0x06,0x00);
       send(0x07,0x00);
       send(0x08,0x00);
    while(1)
    {
        if(StartBitOn())
        {
            gch=PGetChar();
            if(key_flag)
			{
			     keybuf[0]=gch;
				 key_flag=0;
			}
			else
			{
			     keybuf[1]=gch;
			     if(keybuf[1]==0x0f0)key_flag=1;
		         else {keybuf[0]=0x00;keybuf[1]=0x00;key_flag=0;}
			}
		//	LED=!LED;LED0=!LED0;
          //  PSendChar(gch);
        }
        keyscan();
    }
}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -