|
- /*
- 串口通信方案,并且附带接收中文案列
- */
- #include <reg52.h>
- #include <stdio.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit DU = P2 ^ 6; // 数码管段选
- sbit WE = P2 ^ 7; // 数码管段选
- uchar num; // 数码管显示的值
- int Send_Cn = 1; // 电脑端是否接收发送固定汉字文本
- // 共阴数码管段选表0-9
- uchar code SMGduan[] = {
- 0x3F,
- 0x06,
- 0x5B,
- 0x4F,
- 0x66,
- 0x6D,
- 0x7D,
- 0x07,
- 0x7F,
- 0x6F,
- };
- // 数码管位选码
- uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
- void InitTimer0(void);
- void UART_Init_T1();
- void delay(uint z);
- void display(uchar i)
- {
- static uchar wei;
- P0 = 0XFF; // 清除断码
- WE = 1; // 打开位选锁存器
- P0 = SMGwei[wei];
- WE = 0; // 锁存位选数据
- switch (wei) {
- case 0:
- DU = 1;
- P0 = SMGduan[i / 100];
- DU = 0;
- break;
- case 1:
- DU = 1;
- P0 = SMGduan[i % 100 / 10];
- DU = 0;
- break;
- case 2:
- DU = 1;
- P0 = SMGduan[i % 10];
- DU = 0;
- break;
- }
- wei++;
- if (wei == 3)
- wei = 0;
- }
- void main(void)
- {
- int count;
- InitTimer0();
- UART_Init_T1();
- while (1) {
- if (Send_Cn) {
- TI = 1;
- printf("%d.单片机中文串口测试\n", count++);
- while (!TI)
- ;
- TI = 0;
- delay(1000);
- }
- }
- }
- void InitTimer0(void)
- {
- EA = 1; //打开总中断
- ET0 = 1;//打开定时器0中断
- TR0 = 1; //启动定时器0
- REN = 1;//允许串口接收
- TMOD |= 0X01; //定时器工作模式1,16位定时模式
- TH0 = 0xED;
- TL0 = 0xFF; //定时5ms
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0xED;
- TL0 = 0xFF; //定时5ms
- display(num);
- }
- /*
- 定时器1串口初始化
- */
- void UART_Init_T1()
- {
- if (Send_Cn) {
- SM0 = 0;
- SM1 = 1; // 串口工作方式1,8位UART波特率可变
- TR1 = 1; // 启动定时器1
- TMOD |= 0x20; // 定时器1,工作模式2 8位自动重装
- TH1 = 0xfd;
- TL1 = 0xfd; // 设置比特率9600
- } else {
- EA = 1; // 打开总中断
- ES = 1; // 打开串口中断
- SM0 = 0;
- SM1 = 1; // 串口工作方式1,8位UART波特率可变
- REN = 1; // 串口允许接收
- TR1 = 1; // 启动定时器1
- TMOD |= 0x20; // 定时器1,工作模式2 8位自动重装
- TH1 = 0xfd;
- TL1 = 0xfd; // 设置比特率9600
- }
- }
- // 串口中断函数
- void UART() interrupt 4
- {
- uchar temp;
- if (RI) // 判断接收是否完成
- {
- num = SBUF; // 读SBUF,读出串口接收到的数据
- RI = 0; // 软件清零接收标志位
- temp = num; //
- SBUF = temp; // 写SBUF,把要发送的数据送给发送缓存器
- }
- if (TI) // 判断是否发送完成
- TI = 0; // 清零发送完成标志位
- }
- // 毫秒级延时函数定义
- void delay(uint z)
- {
- uint x, y;
- for (x = z; x > 0; x--)
- for (y = 114; y > 0; y--)
- ;
- }
复制代码 |
|