• 单片机实验(一)


    前言

    实验一:用单片机控制多只数码管(屏)分别左、右滚动显示自己完整的学号;
    实验二:用单片机控制LED16×16点阵交替正序、逆序显示自己的中文姓名。

    参考链接:

    LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客

    LED点阵显示原理(取字模软件+Keil+Proteus)-CSDN博客

    C51单片机笔记(动态数码管与8*8点阵) - 知乎 (zhihu.com)

    实验一

    keil

    我不知道这个是不是我理解的那个意思,如果不需要实现同时点亮八个数码管的话(不知道能不能实现),就是每次点亮一个的话,这个滚动就只需要修改循环和增加数组里面的元素即可。

    只需要修改keil,不需要修改proteus的原理图。

    原理:P0口根据共阳极的码来确定输出什么数字,P2来确定在哪一个地方输出,可以用到移位函数方便一点。

    左移滚动

    1. #include
    2. #include
    3. #define uchar unsigned char
    4. #define uint unsigned int
    5. uchar code dis_code[]={0xA4,0xC0,0xA4,0xF9,0x99,0xC0,0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//202140200126(共阳极段码表)
    6. //延时
    7. void delay(uint t){
    8. uchar i;
    9. while(t--)
    10. for(i=0;i<200;i++);
    11. }
    12. void main(){
    13. uchar i,j=0x01;
    14. while(1){
    15. for(i=0;i<12;i++){
    16. j=_cror_(j,1);//循环移位函数,将j循环右移1位
    17. P0=dis_code[i];//P0口输出段码
    18. P2=j;//P2口输出位控码
    19. delay(123);//延时
    20. P0=0x00;
    21. }
    22. }
    23. }

     右移滚动

    下面两种都可以,前者就是修改了最开始输出的位置j和移位函数,后者将输出反过来,将数组反过来了,总之前者更加简便一点。

    1. #include
    2. #include
    3. #define uchar unsigned char
    4. #define uint unsigned int
    5. uchar code dis_code[]={0xA4,0xC0,0xA4,0xF9,0x99,0xC0,0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//202140200126(共阳极段码表)
    6. //延时
    7. void delay(uint t){
    8. uchar i;
    9. while(t--)
    10. for(i=0;i<200;i++);
    11. }
    12. void main(){
    13. uchar i,j=0x01;
    14. while(1){
    15. for(i=0;i<12;i++){
    16. j=_cror_(j,1);//循环移位函数,将j循环右移1位
    17. P0=dis_code[i];//P0口输出段码
    18. P2=j;//P2口输出位控码
    19. delay(123);//延时
    20. P0=0x00;
    21. }
    22. }
    23. }
    1. #include
    2. #include
    3. #define uchar unsigned char
    4. #define uint unsigned int
    5. uchar code dis_code[]={0x82,0xA4,0xF9,0xC0,0xC0,0xA4,0xC0,0x99,0xF9,0xA4,0xC0,0xA4};//621002041202
    6. //延时
    7. void delay(uint t){
    8. uchar i;
    9. while(t--)
    10. for(i=0;i<200;i++);
    11. }
    12. void main(){
    13. uchar i,j=0x01;
    14. while(1){
    15. for(i=0;i<12;i++){
    16. j=_cror_(j,1);//循环移位函数,将j循环右移1位
    17. P0=dis_code[11-i];//P0口输出段码
    18. P2=j;//P2口输出位控码
    19. delay(123);//延时
    20. P0=0x00;
    21. }
    22. }
    23. }

    35f409fb449948e18399a4bbd6e58761.png

    576678ae973a400e8d105f79d9050f54.png

    实验二

    keil

    这个只需要修改keil的代码,不需要改Proteus中的原理图。

    keil修改部分就是修改数组和循环,修改数组表示你要输出什么,修改循环表示你要输出几个字,

    如果姓名一起只有两个字,就需要把循环改成四次,把数组里面的元素之前是顺序排列了一次,如今增加逆序的部分。

    原理:通过P1口控制当前扫描的行,通过P0口和P2来确定当前行哪些地方需要点亮,当扫描的速度过快的时候就让人感觉是整个汉字一起打印的,所以数组里面装着就是你姓名对应的16*16点阵码。

    1. #include
    2. #define uchar unsigned char
    3. #define uint unsigned int
    4. #define out0 P0
    5. #define out1 P1
    6. #define out2 P2
    7. void delay(uint y) //延时函数
    8. {
    9. uchar x=250;
    10. for(;y>0;y--)
    11. {
    12. while(--x);
    13. x=100;
    14. }
    15. }
    16. uchar code string[]=
    17. {
    18. /*-- 文字: 刘 --*/
    19. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
    20. 0x08,0x20,0x10,0x20,0x10,0x20,0xFF,0x25,0x40,0x24,0x42,0x24,0x44,0x24,0x28,0x24,
    21. 0x28,0x24,0x10,0x24,0x10,0x24,0x28,0x24,0x24,0x20,0x42,0x20,0x41,0x28,0x00,0x10,
    22. /*-- 文字: 健 --*/
    23. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
    24. 0x08,0x04,0x08,0x04,0x08,0x3F,0x74,0x24,0xC4,0x7F,0x46,0x24,0x26,0x3F,0x25,0x04,
    25. 0x74,0x3F,0x44,0x04,0x44,0x04,0xD4,0x7F,0x24,0x04,0x64,0x04,0x94,0x7F,0x0C,0x00,
    26. /*-- 文字: 健 --*/
    27. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
    28. 0x08,0x04,0x08,0x04,0x08,0x3F,0x74,0x24,0xC4,0x7F,0x46,0x24,0x26,0x3F,0x25,0x04,
    29. 0x74,0x3F,0x44,0x04,0x44,0x04,0xD4,0x7F,0x24,0x04,0x64,0x04,0x94,0x7F,0x0C,0x00,
    30. /*-- 文字: 刘 --*/
    31. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
    32. 0x08,0x20,0x10,0x20,0x10,0x20,0xFF,0x25,0x40,0x24,0x42,0x24,0x44,0x24,0x28,0x24,
    33. 0x28,0x24,0x10,0x24,0x10,0x24,0x28,0x24,0x24,0x20,0x42,0x20,0x41,0x28,0x00,0x10,
    34. } ;
    35. void main()
    36. { uchar i,j,n;
    37. while(1)
    38. {
    39. for(j=0;j<4;j++) //共显示4个汉字
    40. {
    41. for(n=0;n<40;n++)//每个汉字整屏扫描40次
    42. {
    43. for(i=0;i<15;i++)//逐行扫描16行
    44. {
    45. out1=i%15;//输出行码
    46. out0=string[i*2+j*32];//输出列码C0~C7
    47. out2=string[i*2+1+j*32];//输出列码C8~C15
    48. delay(4);//每一行之间的延时
    49. //out0=0xff;
    50. //out2=0xff;
    51. }
    52. }
    53. }
    54. }
    55. }

    94fd774ce3d44e2c877344fa92effc29.png 

    运行结果

    14b3f9f8c5814c269976bcfc5de9dddd.png

    总结

    继续努力

     

  • 相关阅读:
    一文熟悉 Go 函数
    中国智能汽车“芯”的崛起
    架构师spring boot 面试题
    Windows 10 docker-compose 自动化构建【lnmp】
    nvm:npm ERR! Unexpected token ‘.‘
    JAVA的由来:要不要干一杯95年的Java
    postman如何做接口关联
    什么是VPN服务器
    【知识点随笔分析 | 第七篇】什么是Cookie、Session、Token
    C++指针解读(6)-- 指针和字符串
  • 原文地址:https://blog.csdn.net/weixin_64066303/article/details/134429449