找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1103|回复: 2
打印 上一主题 下一主题
收起左侧

求大神帮我看下单片机串行口通信实验如何完成?

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
要求如下:
利用AT89S52单片机的串行口通过RS232通信接口与PC机进行通信,让单片机把接收到的每一帧数据(即PC机发送给单片机的每一帧数据)直接再发送给PC机。(串行口波特率设定为9600Bit/s,使用工作方式1)
注意:使用串口调试助手(Baud9600、数据位8、停止位1、效验位无)做为上位机来向单片机发送数据和接收单片机串口所发的数据,观察串口调试助手接收窗口。连线:
  
母版
  
CPU
J57/J59RXD
P2P3.0
J57/J59TXD
P2P3.1
用232串口线连接计算机的USB口和母版的RS2/RS1串口。
注意:实验箱的AT89S52单片机的晶振频率为11.0592MHz

孩纸实在不会了,!!谢谢大神!!!麻烦写代码的时候加注释,后面我好好研究。用C51语言完成。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:411135 发表于 2021-8-30 14:18 | 只看该作者
1C-83-41-13-8C-08
回复

使用道具 举报

板凳
ID:411135 发表于 2021-8-30 14:20 | 只看该作者
01.#include "reg51.h"

02.#include "LCD1602.h"

03.#include "i2c.h"

04.

05.sbit S1 =P2^1;

06.sbit S4 =P2^2;

07./**********************************

08.  参数声明

09.**********************************/

10.uint F=0;                       //频率

11.uint S=0,Pwm=0,Tra=0,AA=0;      //正弦波 方波 三角波 锯齿波信号                 

12.uchar zkb=30,bx=1;              //频率加/减 PWM占空比 波形选择

13.uchar t1=0,flagPwm=0,flag1=0;   //标志位

14.uchar  T=0;                     //周期

15.

16.uchar code num[]={ 0x7F,0x82,0x85,0x88,0x8B,0x8F,0x92,0x95,0x98,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD

17.                                                                        ,0xB0,0xB3,0xB6,0xB8,0xBB,0xBE,0xC1,0xC3,0xC6,0xC8,0xCB,0xCD,0xD0,0xD2,0xD5,0xD7

18.                                                                        ,0xD9,0xDB,0xDD,0xE0,0xE2,0xE4,0xE5,0xE7,0xE9,0xEB,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4

19.                                                                        ,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFB,0xFC,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE

20.                                                                        ,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFC,0xFB,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6

21.                                                                        ,0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEB,0xE9,0xE7,0xE5,0xE4,0xE2,0xE0,0xDD,0xDB

22.                                                                        ,0xD9,0xD7,0xD5,0xD2,0xD0,0xCD,0xCB,0xC8,0xC6,0xC3,0xC1,0xBE,0xBB,0xB8,0xB6,0xB3

23.                                                                        ,0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B,0x98,0x95,0x92,0x8F,0x8B,0x88,0x85,0x82

24.                                                                        ,0x7F,0x7C,0x79,0x76,0x73,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x54,0x51

25.                                                                        ,0x4E,0x4B,0x48,0x46,0x43,0x40,0x3D,0x3B,0x38,0x36,0x33,0x31,0x2E,0x2C,0x29,0x27

26.                                                                        ,0x25,0x23,0x21,0x1E,0x1C,0x1A,0x19,0x17,0x15,0x13,0x12,0x10,0x0F,0x0D,0x0C,0x0A

27.                                                                        ,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00

28.                                                                        ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08

29.                                                                        ,0x09,0x0A,0x0C,0x0D,0x0F,0x10,0x12,0x13,0x15,0x17,0x19,0x1A,0x1C,0x1E,0x21,0x23

30.                                                                        ,0x25,0x27,0x29,0x2C,0x2E,0x31,0x33,0x36,0x38,0x3B,0x3D,0x40,0x43,0x46,0x48,0x4B

31.                                                                        ,0x4E,0x51,0x54,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x73,0x76,0x79,0x7C

32.                  };

33.

34./*********************************

35.  函数声明

36.**********************************/

37.void Fun_Sin();

38.void Fun_Triangle();

39.void Fun_Pwm();

40.void Fun_AA();

41.void TimerInit();

42.void KEY();

43.void Delay10ms();

44.

45./*******************************************

46.            主函数

47.*******************************************/

48.void main()        //主程序

49.{

50.  S1 = 1;

51.  S4 = 1;

52.        LcdInit();       //屏幕初始化

53.  TimerInit();     //定时器初始化

54.               

55.        while(1)

56.        {

57.                KEY();                                           //按键检测                                                

58.                switch(bx)

59.                {

60.                  case 1:Fun_Sin();      break;         //正弦波

61.                  case 2:Fun_Triangle(); break;   //三角波

62.                        case 3:Fun_Pwm();      break;         //方波

63.                  case 4:Fun_AA();       break;   //锯齿波

64.                }         

65.

66.                if(flag1==1)

67.                {

68.                        T=1*t1;

69.      F=((1*100000)/T);

70.                        

71.                        LcdWriteCom(0x89);

72.                        LcdWriteData(T%1000/100+'0');

73.                        LcdWriteData(T%100/10+'0');

74.                        LcdWriteData(T%10+'0');

75.                        

76.                        LcdWriteCom(0x82+0x40);

77.                        LcdWriteData(F%10000/1000+'0');        

78.                        LcdWriteData(F%1000/100+'0');                        //个位

79.                        LcdWriteData('.');

80.                        LcdWriteData(F%100/10+'0');          //小数后一位

81.                        LcdWriteData(F%10+'0');          //小数后两位

82.                }

83.                 flag1=0;

84.        }                        

85.}

86.

87./**********************************

88.           延迟10ms函数

89.**********************************/

90.void Delay10ms()   

91.{

92.         uchar a,b,c;

93.    for(c=1;c>0;c--)

94.        for(b=38;b>0;b--)

95.            for(a=130;a>0;a--);

96.}        

97./**********************************

98.           按键检测函数

99.**********************************/

100.void KEY()

101.{

102.        if(S1==0)

103.                {

104.                        Delay10ms();

105.                        if(S1==0)

106.                        {

107.                                bx=bx+1;

108.                                flag1=1;        //周期显示标志位

109.        case_1:        

110.                                switch(bx)

111.                                {

112.                                        case 1:        LcdWriteCom(0x83);

113.                                                                        LcdWriteData('S');               

114.                                                                        LcdWriteData('i');

115.                                                                        LcdWriteData('n');break;

116.                                        case 2:        LcdWriteCom(0x83);

117.                                                                        LcdWriteData('T');

118.                                                                        LcdWriteData('r');

119.                                                                        LcdWriteData('a');break;

120.                                        case 3:        LcdWriteCom(0x83);

121.                                                                        LcdWriteData('P');

122.                                                                        LcdWriteData('w');

123.                                                                        LcdWriteData('m');break;

124.                                        case 4:        LcdWriteCom(0x83);

125.                                                                        LcdWriteData('A');

126.                                                                        LcdWriteData('A');

127.                                                                        LcdWriteData(' ');break;

128.                                        default:bx=1;

129.                                  goto case_1;

130.                                }

131.                                

132.                        }

133.                        while(!S1);   //检测按键是否松开               

134.                }               

135.                                

136.                if(S4==0)

137.                {

138.                        Delay10ms();

139.                        if(S4==0)

140.                        {

141.                                zkb=zkb+10;                                

142.                                if(zkb>90)

143.                                {

144.                                        zkb=10;

145.                                }

146.                                

147.                                LcdWriteCom(0x8c+0x40);

148.                                LcdWriteData(zkb%100/10+'0');        

149.                                LcdWriteData(zkb%10+'0');                                

150.                        }

151.                        while(!S4);   //检测按键是否松开

152.                }               

153.}

154./**********************************

155.            正弦波1函数

156.**********************************/

157.void Fun_Sin()   

158.{        

159.        uchar i;

160.        t1=0;   //重置计数标志位

161.        TR0=1;            //开定时

162.        for(i=0;i<255;i++)

163.        {

164.                S=num[i];       //打点赋值

165.        

166.                I2cStart();

167.                I2c_write_char(0x90);

168.                I2cAck();

169.                I2c_write_char(0x40);  //控制字 允许模拟输出 不自增单端  0100 0000

170.                I2cAck();      

171.                I2c_write_char(S);     //放置需要转换的量

172.                I2cAck();

173.                I2cStop();               

174.        }

175.        TR0=0;              //关定时        

176.}

177./*******************************

178.          三角波2函数

179.********************************/

180.void Fun_Triangle()   

181.{        

182.        uchar i;

183.        t1=0;   //重置计数标志位  

184.  TR0=1;        //开定时器

185.        for(i=0;i<255;i++)

186.        {

187.                Tra =i;

188.                I2cStart();

189.                I2c_write_char(0x90);

190.                I2cAck();

191.                I2c_write_char(0x40); //控制字 允许模拟输出 不自增单端  0100 0000

192.                I2cAck();

193.                I2c_write_char(Tra);  

194.                I2cAck();

195.                I2cStop();

196.        }

197.        for(i=255;i>0;i--)

198.        {

199.                Tra =i;

200.                I2cStart();

201.                I2c_write_char(0x90);

202.                I2cAck();

203.                I2c_write_char(0x40); //控制字 允许模拟输出 不自增单端  0100 0000

204.                I2cAck();

205.                I2c_write_char(Tra);

206.                I2cAck();

207.                I2cStop();

208.        }        

209.  TR0=0;         //关定时器

210.}

211./********************************

212.            方波3函数

213.********************************/

214.void Fun_Pwm()     

215.{                                 

216.        t1=0;   //重置计数标志位

217.  TR0=1;        //开定时器        

218.

219.        for(flagPwm=0;flagPwm<100;flagPwm++)

220.        {

221.                if(flagPwm<zkb) //占空比为%30

222.                {

223.                        Pwm=0;

224.                }        

225.                else

226.                {

227.                        Pwm=255;        

228.                }        

229.

230.                I2cStart();           //DA转换程序

231.                I2c_write_char(0x90);

232.                I2cAck();

233.                I2c_write_char(0x40);//控制字 允许模拟输出 不自增单端  0100 0000

234.                I2cAck();

235.                I2c_write_char(Pwm);

236.                I2cAck();

237.                I2cStop();

238.  }

239.  TR0=0;         //关定时器               

240.}

241./***********************************

242.          锯齿波4函数

243.***********************************/

244.void Fun_AA()         

245.{

246.        uchar i;

247.        t1=0;   //重置计数标志位

248.  TR0=1;        //开定时器               

249.        for(i=255;i>0;i--)

250.        {

251.                AA =i;

252.                I2cStart();

253.                I2c_write_char(0x90);

254.                I2cAck();

255.                I2c_write_char(0x40); //控制字 允许模拟输出 不自增单端  0100 0000

256.                I2cAck();

257.                I2c_write_char(AA);  

258.                I2cAck();

259.                I2cStop();

260.        }

261.  TR0=0;         //关定时器

262.}

263./*********************************

264.         定时器初始化函数

265.**********************************/

266.void TimerInit()

267.{

268.        TMOD|=0x01; //定时器0工作方式1

269.        

270.        TH0=0xFC;   //  65536-1000+1

271.  TL0=0x18;

272.        

273.        ET0=1;

274.        EA=1;       //定时器总开关

275.        TR0=0;      //中断开关        

276.}

277./**********************************

278.           定时器中断函数

279.**********************************/

280.void Timer(void) interrupt 1   //中断

281.{

282.//  TR0=0;   //赋初值,定时器需在关闭状态

283.        TH0=0xfc;//  65536-1000+1

284.        TL0=0x18;//

285.//        TR0=1;

286.               

287.        t1=t1+1; //计数中断个数 每个中断         1ms        

288.

289.}        
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表