首页 > 其他分享 >51串口proteus仿真实验

51串口proteus仿真实验

时间:2023-06-08 23:36:44浏览次数:47  
标签:数码管 UART void 51 unsigned int proteus 串口


一、实验目的

1、了解单片机串口接收与发送方法。

2、了解串口助手使用方法。

3、了解数码管动态显示方法。

4、了解单片机串口中断服务函数用法。

二、实验内容

1、完成单片机串口往电脑发送数据实验。

2、完成电脑串口助手往单片机发送学号,并通过单片机串口完成学号回传,并利用数码管动态显示功能显示学号。

三、实验原理

51串口proteus仿真实验_串口

四、实验电路与程序

1、软件实验一:完成单片机串口往电脑发送数据实验

1)实验要求:单片机通过串口向电脑的串口助手发送“MCS51”字符串

2)实验目的:了解单片机串口接收与发送方法;了解串口助手使用方法。

3)实验说明:通过本实验,可以了解单片机串口接收与发送方法;了解串口助手使用方法。

4)、程序框图

51串口proteus仿真实验_单片机_02

5)、代码
main.c
1. #include <reg52.h>
2. 
3. #include <uart.h>
4. 
5. void delay_main(unsigned int z)
6. {

7. unsigned int x,y;
8. for(x = z; x > 0; x–)
9. for(y = 114; y > 0 ; y–);
10. }
11. void main()
12. {

13. unsigned char *string=“MCS51\r\n”;
14. UART_init(); //串口初始化
15. 
16. while(1)
17. {

18. UART_send(string);
19. delay_main(1000);
20. }
21. }
 uart.h22. #ifndef _UART_H
23. #define _UART_H
24. #include <reg52.h>
25. void UART_Init(void);
26. void UART(void);
27. void delay(unsigned int z);
28. void UART_send(unsigned char *str);
29. extern unsigned char num;
30. #endif
31. 
uart.c
1. #include <tube.h>
2. void delay_uart(unsigned int z)
3. {

4. unsigned int x,y;
5. for(x = z; x > 0; x–)
6. for(y = 114; y > 0 ; y–);
7. }
8. void UART_init()
9. {

10. TMOD = 0x20; //T1工作模式2 8位自动重装
11. TH1 = 0xfd;
12. TL1 = 0xfd; //波特率9600
13. TR1 = 1; //启动T1定时器
14. SM0 = 0;
15. SM1 = 1; //串口工作方式1 10位异步
16. REN = 1; //串口允许接收
17. EA = 1; //开总中断
18. ES = 1; //串口中断打开
19. }
20. 
21. void UART_send(unsigned char *str)
22. {

23. while(*str != 0) //判断字符串是否发送完毕
24. {

25. SBUF=*str; //发送单个字符
26. while(!TI);
27. TI=0;
28. str++; //字符地址加1,指向先下一个字符
29. delay_uart(5);
30. }
31. 
32. }
33. 
34. 
35. 
6)、仿真结果

利用VSDP软件将电脑的com1和com2配对,proteus中的COMPIM设置为连上com1,串口助手设置为连上com2。单片机发送的数据是0xF1。

51串口proteus仿真实验_单片机_03

2、软件实验二:完成数码管显示数字每秒加一,八个数码管全亮。

1)实验要求:完成电脑串口助手往单片机发送学号,并通过单片机串口完成学号回传,并利用数码管动态显示功能显示学号。

2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式;了解定时器用法。

3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式;了解定时器用法;同时也可以了解单片机编程,调试方法。

4)、程序框图

51串口proteus仿真实验_单片机_04

5)、代码

main.c
1. #include <reg52.h>
2. #include <uart.h>
3. #include <tube.h>
4. 
5. unsigned char num[8];
6. void delay_main(unsigned int z)
7. {

8. unsigned int x,y;
9. for(x = z; x > 0; x–)
10. for(y = 114; y > 0 ; y–);
11. }
12. void main()
13. {

14. unsigned char *string=“MCS51”;
15. UART_init(); //串口初始化
16. while(1)
17. {

18. tube_light(num);
19. }
20. }
uart.h
1. #ifndef _UART_H
2. #define _UART_H
3. #include <reg52.h>
4. void UART_Init(void);
5. void UART(void);
6. void delay(unsigned int z);
7. extern unsigned char num[8];
8. #endif
uart.c
1. #include <uart.h>
2. #include <tube.h>
3. void delay(unsigned int z)
4. {

5. unsigned int x,y;
6. for(x = z; x > 0; x–)
7. for(y = 114; y > 0 ; y–);
8. }
9. void UART_init()
10. {

11. TMOD = 0x20; //T1工作模式2 8位自动重装
12. TH1 = 0xfd;
13. TL1 = 0xfd; //波特率9600
14. TR1 = 1; //启动T1定时器
15. SM0 = 0;
16. SM1 = 1; //串口工作方式1 10位异步
17. REN = 1; //串口允许接收
18. EA = 1; //开总中断
19. ES = 1; //串口中断打开
20. }
21. 
22. void UART() interrupt 4
23. {

24. static int count=0;
25. if(RI) //检测是否接收完成
26. {

27. num[count] = SBUF; //num 取出接收缓存器的值
28. P1 = SBUF;
29. RI = 0;
30. SBUF = num[count];
31. while(!TI);
32. TI = 0;
33. count++;
34. if(count>=8)
35. {

36. count=0;
37. }
38. }
39. }
tube.h
1. #ifndef _TUBE_H
2. #define _TUBE_H
3. #include <reg52.h>
4. sbit WE = P2^7; //位定义数码管位选锁存器接口
5. sbit DU = P2^6; //位定义数码管段选锁存器接口
6. void tube_init(void);
7. void tube_light(unsigned char number[8]);
8. void delay1(unsigned int z);
9. #endif
tube.c
1. #include <tube.h>
2. //数码管段选表
3. unsigned char code leddata[]={

4. 
0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"0x77,  //"A"0x7C,  //"B"0x39,  //"C"0x5E,  //"D"0x79,  //"E"0x71,  //"F"0x76,  //"H"0x38,  //"L"0x37,  //"n"0x3E,  //"u"0x73,  //"P"0x5C,  //"o"0x40,  //"-"0x00,  //熄灭0x00  //自定义1. 
};1. unsigned char code weidata[]={

2. 0xEF,
3. 0xDF,
4. 0xBF,
5. 0x7F,
6. 0xFE,
7. 0xFD,
8. 0xFB,
9. 0xF7
10. 
11. 
12. };
13. 
14. 
15. void delay1(unsigned int z)
16. {

17. unsigned int x,y;
18. for(x = z; x > 0; x–)
19. for(y = 114; y > 0 ; y–);
20. }
21. 
22. void tube_light(unsigned char number[8])
23. {

24. int i=0;
25. for(i=0;i<8;i++)
26. {

27. P0=0;
28. DU=1;
29. delay1(1);
30. DU=0;
31. delay1(1);
32. //位选
33. P0=weidata[i];
34. WE=1;
35. delay1(1);
36. WE=0;
37. delay1(1);
38. 
39. //段选
40. P0=leddata[number[i]];
41. DU=1;
42. delay1(1);
43. DU=0;
44. delay1(1);
45. 
46. 
47. }
48. 
49. 
50. }

6)仿真结果

51串口proteus仿真实验_串口_05

五、实验总结

  1. 动态数码管在位选之前,应该将段选清零,否则会有鬼影。
  2. proteus的串口发送数据会自动加上80,并且会被正点原子的串口助手识别成汉字,得用十六进制显示查看才行。
    3.如果proteus的串口连上虚拟终端,收发会有问题。
    4.串口有没有经过max232进行电平转换都没有什么影响。


标签:数码管,UART,void,51,unsigned,int,proteus,串口
From: https://blog.51cto.com/u_16131692/6444195

相关文章

  • 51静态数码管实验
    一、实验目的1、了解数码管共阴极和共阳极接法。2、了解数码管的段选和位选方式。3、了解定时器初始化设置的方法。二、实验内容1、完成数码管显示数字每秒加一,八个数码管全亮;完成数码管八段全亮,八个数码管全亮。1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是......
  • 51按键外部中断控制流水灯
    实验二外部按键输入一、实验目的1、了解单片机检测口方法2、了解单片机外部中断原理3、了解按键输入原理二、实验内容1、完成按键扫描控制流水灯2、完成按键外部中断控制流水灯三、实验原理四、实验电路与程序1、软件实验一:按键扫描控制流水灯1)实验要求:读取四个按键的输......
  • 51定时器中断控制流水灯
    一、实验目的1、了解读取和清零定时器标志位的方法。2、了解定时器中断的方法。3、了解定时器初始化设置的方法。二、实验内容1、完成读取定时器溢出标志位来控制流水灯2、完成定时器中断服务函数控制流水灯三、实验原理只用一个定时器:定时器级联:四、实验电路与程序1、软......
  • Codeforces 1514 C
    1514C题意给出一个数n,求[1,2,3...n-1]的某个最长子序列,这个子序列的元素乘积模n余1。思路这是个思维题,一个数学公式\[x\equiv1(modn)\rightarrowkx\equivk(mod kn)\]所以子序列中的元素与\(n\)互质,累乘结果模\(n\)后如果不是1,那么将序列中等于结果的元素去......
  • Codeforces 1515 B
    1515B题意有n只袜子(n为偶数),但左袜子有L只,右袜子有R只,每只袜子的颜色为\(C_i\),可以进行以下操作:换袜子的方向、或者将袜子变色,问进行多少次操作后变成(n/2)对袜子思路很曲折,想了很久后终于想清楚,排除配对的袜子后,对于某类袜子\(i\),剩下\(c\geq2\)(假设剩下的是右边)只,它的配对......
  • ASEMI代理英飞凌TDK5100F射频模块的性能与应用分析
    编辑-Z本文将对TDK5100F射频模块进行详细的介绍与分析,包括其性能特点、应用领域、使用方法。通过对这三个方面的阐述,希望能够帮助读者更好地了解TDK5100F射频模块的优势和应用场景。 1、TDK5100F射频模块的性能特点TDK5100F射频模块是一款高性能的无线通信模块,具有以下几个显著的......
  • ASEMI代理英飞凌TDK5100F射频模块的性能与应用分析
    编辑-Z本文将对TDK5100F射频模块进行详细的介绍与分析,包括其性能特点、应用领域、使用方法。通过对这三个方面的阐述,希望能够帮助读者更好地了解TDK5100F射频模块的优势和应用场景。 1、TDK5100F射频模块的性能特点TDK5100F射频模块是一款高性能的无线通信模块,具有以下几个显......
  • [LeetCode] 1351. Count Negative Numbers in a Sorted Matrix
    Givena mxn matrix grid whichissortedinnon-increasingorderbothrow-wiseandcolumn-wise,return thenumberof negative numbersin grid.Example1:Input:grid=[[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]Output:8Explanation:Thereare......
  • P1751 贪吃虫 题解
    题意:题目传送门在一棵n个结点的树上,有k个贪吃虫去吃食物。每个贪吃虫都走到达食物的唯一路径。当一条贪吃虫通向食物的道路上有另一条贪吃虫,则较远的那只停止移动。多条贪吃虫要进入同一节点时,编号最小的才能进入,其他的停止移动。贪吃虫的移动速度皆为1。一只贪吃虫吃......
  • 算法学习day51动态规划part12-309、714
    packageLeetCode.DPpart12;/***309.最佳买卖股票时机含冷冻期*给定一个整数数组prices,其中第prices[i]表示第i天的股票价格。*设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):*卖出股票后,你无法在第二天买入......