找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这是定义的问题吗,用的c语言,怎么都改不对

[复制链接]
跳转到指定楼层
楼主
ID:1142693 发表于 2025-1-7 21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include <reg51.h>

// 定义端口
sbit SNG = P2^0; // 南北绿灯
sbit SNY = P2^1; // 南北黄灯
sbit SNR = P2^2; // 南北红灯
sbit EWG = P2^3; // 东西绿灯
sbit EWY = P2^4; // 东西黄灯
sbit EWR = P2^5; // 东西红灯

// 数码管显示相关
uchar code SEG[4] = {0x01, 0x02, 0x04, 0x08}; // 数码管位选
uchar code distab[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管显示0~9
uint timeG, timeY, timeR; // 各灯显示时间
uint state; // 状态标志

// 延时函数
void delay_ms(uint q)
{
    uint i, j;
    for (i = 0; i < q; i++)
        for (j = 0; j < 110; j++);
}

// 定时器0初始化
void Timer0Init(void)
{
    TMOD |= 0X01; // 定时器0模式1,16位定时器
    TH0 = 0XFC;   // 定时1ms
    TL0 = 0X18;
    EA = 1;       // 开总中断
    ET0 = 1;      // 开定时器0中断
    TR0 = 1;      // 启动定时器0
}

// 定时器0中断服务程序
void Timer0() interrupt 1
{
    static uint count = 0; // 计数器,用于控制状态转换
    TH0 = 0XFC;   // 重装初值
    TL0 = 0X18;
    count++;
    if (count >= 1000) // 每秒更新一次状态
    {
        count = 0;
        switch (state)
        {
            case 0: // 南北绿灯,东西红灯
                timeG--;
                if (timeG == 0)
                {
                    state = 1;
                    timeY = 3;
                }
                break;
            case 1: // 南北黄灯闪烁,东西红灯
                if (timeY > 0)
                    timeY--;
                else
                {
                    state = 2;
                    timeR = 90;
                }
                break;
            case 2: // 南北红灯,东西绿灯
                timeR--;
                if (timeR == 0)
                {
                    state = 3;
                    timeY = 3;
                }
                break;
            case 3: // 南北红灯,东西黄灯闪烁
                if (timeY > 0)
                    timeY--;
                else
                {
                    state = 0;
                    timeG = 20;
                }
                break;
        }
    }

    // 数码管显示倒计时
    uchar displayDigit[4] = {0xFF, 0xFF, 0xFF, 0xFF}; // 初始化为全灭
    switch (state)
    {
        case 0:
            displayDigit[0] = distab[timeG / 10];
            displayDigit[1] = distab[timeG % 10];
            break;
        case 1:
            displayDigit[0] = distab[timeY / 10];
            displayDigit[1] = distab[timeY % 10];
            break;
        case 2:
            displayDigit[0] = distab[timeR / 10];
            displayDigit[1] = distab[timeR % 10];
            break;
        case 3:
            displayDigit[0] = distab[timeR / 10];
            displayDigit[1] = distab[timeR % 10];
            break;
    }
    for (uchar i = 0; i < 4; i++)
    {
        P1 = SEG[i];
        P0 = displayDigit[i];
        delay_ms(1);
    }
}

// 主函数
void main()
{
    Timer0Init(); // 定时器初始化
    timeG = 20;   // 初始时间设置
    state = 0;    // 初始状态
    while (1)
    {
        // 主循环可以为空,因为所有操作都在中断中完成
    }
}
显示4.c(9): error C129: missing ';' before 'code'。
我搜到是没有定义就在开头加了
#define uchar unsigned char;
#define uint unsigned int;
结果显示4.c(109): error C202: 'P0': undefined identifier

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

使用道具 举报

沙发
ID:1133081 发表于 2025-1-8 06:48 | 只看该作者
改这样就可以通过编译
  1. #include <reg51.h>
  2. #define uchar unsigned char//;
  3. #define uint unsigned int//;
  4. // 定义端口
  5. sbit SNG = P2^0; // 南北绿灯
  6. sbit SNY = P2^1; // 南北黄灯
  7. sbit SNR = P2^2; // 南北红灯
  8. sbit EWG = P2^3; // 东西绿灯
  9. sbit EWY = P2^4; // 东西黄灯
  10. sbit EWR = P2^5; // 东西红灯

  11. // 数码管显示相关
  12. uchar code SEG[4] = {0x01, 0x02, 0x04, 0x08}; // 数码管位选
  13. uchar code distab[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管显示0~9
  14. uint timeG, timeY, timeR; // 各灯显示时间
  15. uint state; // 状态标志

  16. // 延时函数
  17. void delay_ms(uint q)
  18. {
  19.     uint i, j;
  20.     for (i = 0; i < q; i++)
  21.         for (j = 0; j < 110; j++);
  22. }

  23. // 定时器0初始化
  24. void Timer0Init(void)
  25. {
  26.     TMOD |= 0X01; // 定时器0模式1,16位定时器
  27.     TH0 = 0XFC;   // 定时1ms
  28.     TL0 = 0X18;
  29.     EA = 1;       // 开总中断
  30.     ET0 = 1;      // 开定时器0中断
  31.     TR0 = 1;      // 启动定时器0
  32. }

  33. // 定时器0中断服务程序
  34. void Timer0() interrupt 1
  35. {
  36.     static uint count = 0; // 计数器,用于控制状态转换
  37.         uchar displayDigit[4] = {0xFF, 0xFF, 0xFF, 0xFF};
  38.         uchar i ;
  39.     TH0 = 0XFC;   // 重装初值
  40.     TL0 = 0X18;
  41.     count++;
  42.     if (count >= 1000) // 每秒更新一次状态
  43.     {
  44.         count = 0;
  45.         switch (state)
  46.         {
  47.             case 0: // 南北绿灯,东西红灯
  48.                 timeG--;
  49.                 if (timeG == 0)
  50.                 {
  51.                     state = 1;
  52.                     timeY = 3;
  53.                 }
  54.                 break;
  55.             case 1: // 南北黄灯闪烁,东西红灯
  56.                 if (timeY > 0)
  57.                     timeY--;
  58.                 else
  59.                 {
  60.                     state = 2;
  61.                     timeR = 90;
  62.                 }
  63.                 break;
  64.             case 2: // 南北红灯,东西绿灯
  65.                 timeR--;
  66.                 if (timeR == 0)
  67.                 {
  68.                     state = 3;
  69.                     timeY = 3;
  70.                 }
  71.                 break;
  72.             case 3: // 南北红灯,东西黄灯闪烁
  73.                 if (timeY > 0)
  74.                     timeY--;
  75.                 else
  76.                 {
  77.                     state = 0;
  78.                     timeG = 20;
  79.                 }
  80.                 break;
  81.         }
  82.     }

  83.     // 数码管显示倒计时
  84. //    uchar displayDigit[4] = {0xFF, 0xFF, 0xFF, 0xFF}; // 初始化为全灭
  85.     switch (state)
  86.     {
  87.         case 0:
  88.             displayDigit[0] = distab[timeG / 10];
  89.             displayDigit[1] = distab[timeG % 10];
  90.             break;
  91.         case 1:
  92.             displayDigit[0] = distab[timeY / 10];
  93.             displayDigit[1] = distab[timeY % 10];
  94.             break;
  95.         case 2:
  96.             displayDigit[0] = distab[timeR / 10];
  97.             displayDigit[1] = distab[timeR % 10];
  98.             break;
  99.         case 3:
  100.             displayDigit[0] = distab[timeR / 10];
  101.             displayDigit[1] = distab[timeR % 10];
  102.             break;
  103.     }
  104. //  for (uchar i = 0; i < 4; i++)
  105.     for (i = 0; i < 4; i++)
  106.     {
  107.         P1 = SEG[i];
  108.         P0 = displayDigit[i];
  109.         delay_ms(1);
  110.     }
  111. }

  112. // 主函数
  113. void main()
  114. {
  115.     Timer0Init(); // 定时器初始化
  116.     timeG = 20;   // 初始时间设置
  117.     state = 0;    // 初始状态
  118.     while (1)
  119.     {
  120.         // 主循环可以为空,因为所有操作都在中断中完成
  121.     }
  122. }
复制代码
回复

使用道具 举报

板凳
ID:1109793 发表于 2025-1-8 08:20 | 只看该作者
#define uchar unsigned char;后面不能加分号
回复

使用道具 举报

地板
ID:344646 发表于 2025-1-8 10:55 | 只看该作者
宏定义有问题
回复

使用道具 举报

5#
ID:1110945 发表于 2025-1-8 12:04 | 只看该作者
define不是C语言关键字,它是编译器里面的,也不是一个语句,所以不能加分号。
类似的还有好几个,都要注意。
回复

使用道具 举报

6#
ID:887202 发表于 2025-1-9 15:49 | 只看该作者
#define uchar unsigned char//;
#define uint unsigned int//;
应该写成
typedef  unsigned char uchar;
typedef  unsigned uint uint;
这里是因为你后面的代码用了uchar,你是想把unsigned char类型重新命名为uchar,所以要用typedef
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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